版本聲明:本文爲作者原創文章,轉載請註明出處! http://blog.csdn.net/AndroidXiXi
本文根據《SQL基礎教程第二版》(作者:[日本]MICK)的部分內容實踐、整理得出,旨在對所學知識進行梳理
全面系統學習請參考原著書籍http://product.dangdang.com/25094702.html
SQL概述
書中要學習的SQL(Structured Query Language,結構化查詢語言)是用來操作關係型數據庫的語言,國際化標準組織(ISO)爲SQL制定了相關的標準,以此爲基準的SQL被稱爲標準SQL。雖然有時需要根據不同的RDBMS來編寫特定的SQL語句,但是大同小異,學會標準的SQL語句就可以在各種RDBMS中書寫SQL語句了
SQL語句及其種類
SQL語句用關鍵字、表名、列名等組合而成的一條語句來描述操作的內容
關鍵字:指那些含義或者使用方法已經事先被定義好的英語單詞
根據RDBMS賦予的指令種類的不同,SQL語句可以分爲:
- DDL
DDL(Data Definition Language,數據定義語言)用來創建或者刪除存儲數據用的數據庫以及數據庫中的表等對象,包含以下幾種:
CREATE:創建數據庫以及表等對象
DROP:刪除數據庫和表等對象
ALTER:修改數據庫和表等對象的結構 - DML
DML(Data Manipulation Language,數據操縱語言)用來查詢或者變更表中的記錄,包含以下幾種:
SELECT:查詢表中的數據
INSERT:向表中插入新數據
UPDATE:更新表中的數據
DELETE:刪除表中的數據 - DCL
DCL(Data Control Language,數據控制語言)用來確認或者取消對數據庫中的數據進行的變更,還可以對RDBMS的用戶是否有權限操作數據庫中的對象(數據庫表等)進行設定,包含以下幾種:
COMMIT:確認對數據庫中的數據進行的變更
ROLLBACK:取消對數據庫中的數據進行的變更
GRANT:賦予用戶操作權限
REVOKE:取消用戶的操作權限
SQL的基本書寫規則
- SQL語句要以分號(;)結尾
在RDBMS中,SQL語句是逐條執行的,一條SQL語句可以描述一個數據庫操作 - SQL語句不區分大小寫
SQL不區分關鍵字的大小寫,SELECT、select都可以,但是爲了區分SQL語句的其他部分,以及養成良好的代碼編寫習慣,可以採用以下的書寫規則:
- 關鍵字大寫
- 表名的首字母大寫
- 其餘部分小寫
但是想要操作數據庫中的數據需要區分大小寫,例如字符串數據’Computer’、’COMPUTER’、’computer’三者是不一樣的 - 常數的書寫方式是固定的
常數:在SQL語句中直接書寫的字符串、日期或者數字稱爲常數
字符串和日期常數需要使用單引號( ’ )括起來,如’abc’,’2017-11-21’
數字常數無須加註單引號,直接書寫數字即可 - 單詞需要用半角空格或者換行來分隔
SQL語句的單詞之間需使用半角空格或換行符來進行分隔,但是不能使用全角空格作爲單詞的分隔符,否則會發生錯誤,請注意當前輸入法的狀態
接下來開始SQL語句書寫的學習
環境的搭建
書中作者推薦、使用的是PostgreSQL,筆者實踐使用的是MySQL,安裝相關環境可以通過互聯網搜索下載資源和安裝方法。筆者認爲,SQL的學習需要對各種情況動手實踐,方能加深對SQL的理解,建議將書中的相關Demo、練習題反覆實踐、溫習
命名規則
在書寫SQL之前可以先約定相關命名規則
- 只能使用半角英文字母、數字、下劃線(_)作爲數據庫、表、列的名稱,例如標準SQL不允許使用連字符,例如列名不能寫成product-id
- 名稱必須以半角英文字母作爲開頭
- 在同一個數據庫中不能創建兩個相同名稱的表,在同一個表中不能創建兩個相同名稱的列
數據庫的創建(CREATE DATABASE 語句)
數據存儲於數據庫中,首先要進行對數據庫的創建,執行CREATE DATABASE語句就可以在RDBMS上創建數據庫了,如下:
-- 創建數據庫的語法
CREATE DATABASE <數據庫名稱>;
-- 創建數據庫shop
CREATE DATABASE shop;
表的創建
執行CREATE TABLE語句可以在數據庫中創建表,如下:
-- 創建表的語法
-- 每一列的數據類型是必須的,有時也需要爲列設置約束條件
CREATE TABLE <表名>
<列名1> <數據類型> <該列所需約束>,
<列名2> <數據類型> <該列所需約束>,
<列名3> <數據類型> <該列所需約束>,
.
.
.
<該表的約束1>,<該表的約束2>...);
-- 創建Product表
CREATE TABLE Product(
product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY(product_id)
);
數據類型的指定
列名右邊的INTEGER、CHAR等關鍵字,用來聲明該列的數據類型,所有的列都必須指定數據類型
數據類型表示數據的種類,包括數字型、字符型和日期型等等,每一列不能存儲與該列數據類型不符的數據,常見的幾種基本數據類型:
- INTEGER型
用來指定存儲整數的列的數據類型(數字型),不能存儲小數 - CHAR型
- CHAR是CHARACTER(字符)的縮寫,是用來指定存儲字符串的列的數據類型(字符類型)。括號中指定該列可以存儲的字符串的最大長度,字符串超出最大長度的部分是無法輸入到該列中的。
- 字符串是以定長字符串的形式存儲在被指定爲CHAR型的列中,當列中存儲的字符串長度達不到最大長度的時候,使用半角空格進行補足。例如,想CHAR(8)的列中輸入’abc’時,數據庫會以’abc ‘(abc之後五個半角空格)的形式保存起來。
- 數據區分大小寫 - VARCHAR型
- 和CHAR類型一樣,VARCHAR型也是用來指定存儲字符串的列的數據類型(字符串類型),也可以通過在括號中指定字符串的最大長度。
- 和CHAR不同的是,VARCHAR是以可變長字符串的形式來保存字符串的,當字符數未達到最大長度的時候,並不會用半角空格補足。
- 和CHAR一樣,數據區分大小寫 - DATE型
用來指定存儲日期(年月日)的列的數據類型(日期型)
約束的設置
product_id CHAR(4) NOT NULL,
約束是除了數據類型之外,對列中存儲的數據進行限制或者追加條件的功能,例如上個SQL語句示例中的“NOT NULL”,稱爲“NOT NULL約束”。NULL是代表空白(無記錄)的關鍵字,在NULL之前加上了表示否定的NOT,就是給該列設置了不能輸入空白,也就是必須輸入數據的約束
PRIMARY KEY (product_id)
上例中“PRIMARY_KEY”用來指定主鍵約束
鍵:在指定特定數據時使用的列的組合。
主鍵:可以特定一行數據的列,相當於一行數據的唯一標識
表的刪除(DROP TABLE語句)
可以使用DROP TABLE語句刪除指定名稱的表
# 刪除表語法
DROP TABLE <表名>;
# 刪除Product表
DROP TABLE Product;
特別注意:刪除的表是無法恢復,現實中可能會引發災難,數據無價,三思而行
表定義的更新(ALTER TABLE 語句)
表的結構是可以改變的,通過ALTER TABLE 語句變更表的定義,這樣就不用刪除表,重新創建,很方便
可以通過ALTER TABLE ADD爲表增加一個列
#ALTER TABLE ADD 語法
ALTER TABLE <表名> ADD COLUMN <列的定義>;
#MySQL向表中添加一個列
ALTER TABLE Product ADD product_test VARCHAR(100);
ALTER TABLE Product ADD COLUMN product_test VARCHAR(100);
#MySQL添加多個列
ALTER TABLE Product ADD(
product_testA INTEGER,
product_testB CHAR(100),
product_testC DATE
);
可以用ALTER TABLE DROP刪除指定列
#ALTER TABLE DROP 語法
ALTER TABLE <表名> DROP COLUMN <列名>;
#MySQL從表中刪除一個列
ALTER TABLE Product DROP product_test;
ALTER TABLE Product DROP product_testA;
ALTER TABLE Product DROP product_testB;
ALTER TABLE Product DROP product_testC;
#按照上面添加多列的方式推測刪除多列的方法
#但是MySQL無法運行,原因未知
#ALTER TABLE Product DROP (
# product_testA,
# product_testB,
# product_testC
#);
注意,通過ALTER TABLE對錶定義的變更後是無法恢復的
ALTER TABLE操作的對象是表的列名(字段名),如果表名穿件出現問題,就需要使用RENAME來變更表名
# MySQL語法
sp_rename 'Poduct' 'Product';
可以使用INSERT向表中插入一些數據
#向表中插入數據
INSERT INTO product values('0001','T恤衫','衣服',1000,500,'2009-09-20');
INSERT INTO product values('0002','打孔器','辦公用品',500,320,'2009-09-11');
INSERT INTO product values('0003','運動T恤','衣服',4000,2800,NULL);
INSERT INTO product values('0004','菜刀','廚房用具',3000,2800,'2009-09-20');
INSERT INTO product values('0005','高壓鍋','廚房用具',6800,5000,'2009-01-15');
INSERT INTO product values('0006','叉子','廚房用具',500,null,'2009-09-20');
INSERT INTO product values('0007','擦菜板','廚房用具',880,790,'2008-04-28');
INSERT INTO product values('0008','圓珠筆','辦公用品',100,NULL,'2009-11-11');