一、基本概念
數據庫、表、列、行、主鍵、外鍵、關鍵字
二、檢索
1.檢索列
SELECT prod_name(id)(*)
FROM Products;
2.檢索不同值
SELECT DISTINCT vend_id
FROM Products;
三、排序
1.單列
ORDER BY prod_name;
--此句必須位於末尾
2.多列
ORDER BY prod_price, prod_name; --按列名
ORDER BY 2, 3; --按列位置
3.指定排序方向
ORDER BY prod_price DESC, prod_name; --僅前者降序
四、過濾數據
1.where 子句
WHERE prod_price = 3;
操作符 =//<>/>=/…
2.範圍值檢查
WHERE prod_price BETWEEN 5 AND 10;
3.空值檢查
WHERE prod_price IS NULL;
五、高級數據過濾
1.組合WHERE子句
AND操作符 OR操作符
WHERE vend_id = 'DLL01' AND prod_price <= 4;
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
求值順序
用(圓括號)明確對操作符分組,保證順序理想
2.IN操作符
WHERE vend_id IN ( 'DLL01', 'BRS01' );
3.NOT操作符
WHERE NOT vend_id = 'DLL01' ; --相當於<>
六、用通配符進行過濾
1,LIKE
LIKE是謂詞而不是操作符
百分號%,星號*,表示任何字符出現任意次數
WHERE prod\_name LIKE 'Fish%';
WHERE prod\_name LIKE '%bean bag%';
下劃線_,匹配單個字符
WHERE prod_name LIKE '_inch teddy bear';
方括號[],匹配指定位置的一個字符
WHERE cust_contact LIKE '[JM]%'
LIKE '[^JM]%' or LIKE '[!JM]%'(否定)
2、技巧
儘量不要把它們用在搜索模式的開始處
不要過度使用
七、創建計算字段
1,計算字段
計算字段是運行時在SELECT語句內創建的。
2,拼接字段
SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
去掉空格
TRIM() LTRIM() RTRIM()
去掉右邊的空格
SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
別名,是一個字段或值的替換名,用AS關鍵字賦予
SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')' AS vend_title
3,執行算數計算(+ - * /)
SELECT prod_id, quantity, item_price,
quantity*item_price AS expanded_price
八、使用函數處理數據
1,函數
與SQL 語句不一樣,SQL 函數不是可移植的。
2,使用函數
文本處理函數
返回字符串旁邊的字符 LEFT() RIGHT()
返回字符串的長度 LENGTH() or LEN()
轉換字符串大小寫LOWER() UPPER()
對字符串進行發音比較的轉換 SOUNDEX()
日期和時間處理函數
WHERE DATEPART(yy, order_date) = 2018;(SQL Server)
WHERE YEAR(order_date) = 2018;(MySQL)
WHERE DATEPART('yyyy', order_date) = 2012;(Access)
數值處理函數
返回絕對值 ABS()
返回正餘弦 SIN() COS()
返回平方/指數 SQRT() EXP()
九、彙總數據
1,聚集函數
返回單列平均值 AVG()
SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01'
返回列的行數 COUNT()
包括NULL COUNT(*)
具有特定值 COUNT(column)
返回數的最值 MAX() MIN()
用於文本數據時,MAX()MIN()返回按該列排序後的最後一行/最前面的行
返回和 SUM()
SELECT SUM(quantity) AS items_ordered
FROM Order_num = 2005;
2.聚集不同值
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
注:DISTINCT不能用於Access,不能用於COUNT(*),用於求最值無意義
3.組合聚集函數
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;
十、分組數據
1,創建分組
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
按vend_id排序並分組數據,對每個vend_id而不是整個表計算num_prods
GROUP BY 子句必須出現在WHERE 子句之後,ORDER BY 子句之前。
2,過濾分組
HAVING 支持所有WHERE 操作符
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
HAVING子句過濾COUNT(*) >= 2(兩個以上訂單)的那些分組
注:使用HAVING時應該結合GROUP BY子句,而WHERE子句用於標準的行級過濾
3,分組與排序
ORDER BY
一般在使用GROUP BY 子句時,應該也給出ORDER BY 子句。以保證數據排序正確。
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
Access 不允許按別名排序,可用實際的計算或字段位置替換
即ORDER BY COUNT(*), order_num 或ORDER BY 2, order_num
4.SELECT子句及其順序
子 句 |說 明 |是否必須使用
SELECT |要返回的列或表達式 |是
FROM |從中檢索數據的表 |僅在從表選擇數據時使用
WHERE |行級過濾 | 否
GROUP BY |分組說明 | 僅在按組計算聚集時使用
HAVING |組級過濾 | 否
ORDER BY |輸出排序順序 | 否
十一、使用子查詢
1.利用子查詢進行過濾
SELECT cust_id
FROM Orders
WHERE order_num IN(SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01');
子查詢總是由內向外處理。
2.作爲計算字段使用子查詢
從Customers表中檢索顧客列表;
對於檢索出的每個顧客,統計其在Orders表中的訂單數目。
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
注:如果在SELECT語句中操作多個表,就應使用完全限定列名來避免歧義。
十二、聯結表
1.關係表
分解信息,按類寫表,互相關聯,節省空間,方便管理
2.創建聯結
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
使用完全限定列名
保證所有聯結都有WHERE子句
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
以上語法爲等值聯結(內聯結)
3.用聯結優化子查詢
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';
前兩個關聯聯結中的表,後一個過濾產品RGAN01的數據。
十三、高級聯結
1.使用表別名
縮短SQL語句,允許在一條SELECT語句中多次使用相同的表。
SELECT cust_name, cust_contact
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';
表別名只在查詢執行中使用,與列別名不一樣,表別名不返回到客戶端
2.使用不同類型的聯結
1)自聯結(self-join)
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
自聯結通常作爲外部語句,用來替代從相同表中檢索數據的使用子查詢語句。
2)自然聯結(natural join)
自然聯結要求你只能選擇那些唯一的列,一般通過對一個表使用通配符(SELECT *),而對其他表的列使用明確的子集來完成。
事實上,我們迄今爲止建立的每個內聯結都是自然聯結。
3)外聯結(outer join)
聯結包含了那些在相關表中沒有關聯行的行。
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
外聯結必須指明左、右
LEFT OUTER JOIN是從FROM子句左邊的表中選擇所有行
4)全聯結(full outer join)
檢索兩個表中的所有行並關聯那些可以關聯的行
3.使用帶聚集函數的聯結
檢索所有顧客及每個顧客所下的訂單數。
SELECT Customers.cust_id,
COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;
4.使用聯結和聯結條件
應該總是提供聯結條件,否則會得出笛卡爾積
十四、組合查詢
1.使用情境
在一個查詢中從不同的表返回結構數據;
對一個表執行多個查詢,按一個查詢返回數據。
2.創建組合查詢
2.1 使用UNION
在各條SELECT語句之間放上關鍵字UNION就行。
2.2 UNION規則
UNION中的每個查詢必須包含相同的列、表達式或聚集函數。
列數據類型不一定完全相同,但必須兼容。
2.3 包含或取消重複的行
UNION從查詢結果集中自動去除了重複的行。
想返回所有的匹配行可使用UNION ALL。
2.4 對組合查詢結果排序
只能使用一條ORDER BY子句,且必須位於最後一句SELECT語句之後
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'
ORDER BY cust_name, cust_contact;
使用UNION可極大地簡化負責的WHERE子句,簡化從多個表中檢索數據的工作。
十五、插入數據(INSERT)
1.數據插入
三種方式:插入完整的行,插入行的一部分,插入某些查詢的結果
1.1插入完整的行
INSERT INTO Customers(cust_id,cust_name,cust_email)
VALUES('10086','Toy Land',NULL);
給出明確列,可以保證在表結構發生變化時語句仍有效。
1.2插入部分行
INSERT INTO Customers(cust_id,cust_name)
VALUES('10086','Toy Land');
省略某些列必須滿足的條件:
定義爲允許NULL值,或表定義中給出默認值。
1.3插入檢索出的數據
INSERT SELECT語句,可以插入SELECT返回的多行
注:數據庫不關心SELECT返回的列名,它使用的是列的位置。
2.從一個表複製到另一個表
用SELECT INTO導出數據
SELECT \*
INTO CustCopy
FROM Customers;
MySQL語法如下
CREATE TABLE CustCopy AS
SELECT \* FROM Customers;
注:不論從多少個表中檢索數據,數據都只能插入到一個表中。