一弄贿、基本概念
數(shù)據(jù)庫仓蛆、表、列挎春、行、主鍵豆拨、外鍵直奋、關(guān)鍵字
二、檢索
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; --僅前者降序
四脚线、過濾數(shù)據(jù)
1.where 子句
WHERE prod_price = 3;
操作符 =//<>/>=/…
2.范圍值檢查
WHERE prod_price BETWEEN 5 AND 10;
3.空值檢查
WHERE prod_price IS NULL;
五、高級數(shù)據(jù)過濾
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' ; --相當(dāng)于<>
六邮绿、用通配符進(jìn)行過濾
1,LIKE
LIKE是謂詞而不是操作符
百分號%攀例,星號*船逮,表示任何字符出現(xiàn)任意次數(shù)
WHERE prod\_name LIKE 'Fish%';
WHERE prod\_name LIKE '%bean bag%';
下劃線_,匹配單個(gè)字符
WHERE prod_name LIKE '_inch teddy bear';
方括號[],匹配指定位置的一個(gè)字符
WHERE cust_contact LIKE '[JM]%'
LIKE '[^JM]%' or LIKE '[!JM]%'(否定)
2粤铭、技巧
盡量不要把它們用在搜索模式的開始處
不要過度使用
七挖胃、創(chuàng)建計(jì)算字段
1,計(jì)算字段
計(jì)算字段是運(yùn)行時(shí)在SELECT語句內(nèi)創(chuàng)建的。
2酱鸭,拼接字段
SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
去掉空格
TRIM()? LTRIM()? RTRIM()
去掉右邊的空格
SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
別名吗垮,是一個(gè)字段或值的替換名,用AS關(guān)鍵字賦予
SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')' AS vend_title
3凹髓,執(zhí)行算數(shù)計(jì)算(+ - * /)
SELECT prod_id, quantity, item_price,
? ? ? quantity*item_price AS expanded_price
八烁登、使用函數(shù)處理數(shù)據(jù)
1,函數(shù)
與SQL 語句不一樣蔚舀,SQL 函數(shù)不是可移植的饵沧。
2,使用函數(shù)
文本處理函數(shù)
返回字符串旁邊的字符 LEFT() RIGHT()
返回字符串的長度 LENGTH() or LEN()
轉(zhuǎn)換字符串大小寫LOWER() UPPER()
對字符串進(jìn)行發(fā)音比較的轉(zhuǎn)換 SOUNDEX()
日期和時(shí)間處理函數(shù)
WHERE DATEPART(yy, order_date) = 2018;(SQL Server)
WHERE YEAR(order_date) = 2018;(MySQL)
WHERE DATEPART('yyyy', order_date) = 2012;(Access)
數(shù)值處理函數(shù)
返回絕對值 ABS()
返回正余弦 SIN() COS()
返回平方/指數(shù) SQRT() EXP()
九蝗敢、匯總數(shù)據(jù)
1捷泞,聚集函數(shù)
返回單列平均值 AVG()
SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01'
返回列的行數(shù) COUNT()
包括NULL COUNT(*)
具有特定值 COUNT(column)
返回?cái)?shù)的最值 MAX() MIN()
用于文本數(shù)據(jù)時(shí),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.組合聚集函數(shù)
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;
十、分組數(shù)據(jù)
1讶泰,創(chuàng)建分組
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
按vend_id排序并分組數(shù)據(jù)咏瑟,對每個(gè)vend_id而不是整個(gè)表計(jì)算num_prods
GROUP BY 子句必須出現(xiàn)在WHERE 子句之后,ORDER BY 子句之前痪署。
2码泞,過濾分組
HAVING 支持所有WHERE 操作符
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
HAVING子句過濾COUNT(*) >= 2(兩個(gè)以上訂單)的那些分組
注:使用HAVING時(shí)應(yīng)該結(jié)合GROUP BY子句,而WHERE子句用于標(biāo)準(zhǔn)的行級過濾
3狼犯,分組與排序
ORDER BY
一般在使用GROUP BY 子句時(shí)余寥,應(yīng)該也給出ORDER BY 子句。以保證數(shù)據(jù)排序正確悯森。
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
Access 不允許按別名排序宋舷,可用實(shí)際的計(jì)算或字段位置替換
即ORDER BY COUNT(*), order_num 或ORDER BY 2, order_num
4.SELECT子句及其順序
子 句 |說 明 |是否必須使用
SELECT |要返回的列或表達(dá)式 |是
FROM |從中檢索數(shù)據(jù)的表 |僅在從表選擇數(shù)據(jù)時(shí)使用
WHERE |行級過濾 | 否
GROUP BY |分組說明 | 僅在按組計(jì)算聚集時(shí)使用
HAVING |組級過濾 | 否
ORDER BY |輸出排序順序 | 否
十一、使用子查詢
1.利用子查詢進(jìn)行過濾
SELECT cust_id
FROM Orders
WHERE order_num IN(SELECT order_num
? ? ? ? ? ? ? ? ? FROM OrderItems
? ? ? ? ? ? ? ? ? WHERE prod_id = 'RGAN01');
子查詢總是由內(nèi)向外處理瓢姻。
2.作為計(jì)算字段使用子查詢
從Customers表中檢索顧客列表祝蝠;
對于檢索出的每個(gè)顧客,統(tǒng)計(jì)其在Orders表中的訂單數(shù)目幻碱。
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語句中操作多個(gè)表绎狭,就應(yīng)使用完全限定列名來避免歧義。
十二褥傍、聯(lián)結(jié)表
1.關(guān)系表
分解信息儡嘶,按類寫表,互相關(guān)聯(lián)恍风,節(jié)省空間社付,方便管理
2.創(chuàng)建聯(lián)結(jié)
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
使用完全限定列名
保證所有聯(lián)結(jié)都有WHERE子句
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
? ON Vendors.vend_id = Products.vend_id;
以上語法為等值聯(lián)結(jié)(內(nèi)聯(lián)結(jié))
3.用聯(lián)結(jié)優(yōu)化子查詢
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';
前兩個(gè)關(guān)聯(lián)聯(lián)結(jié)中的表承疲,后一個(gè)過濾產(chǎn)品RGAN01的數(shù)據(jù)。
十三鸥咖、高級聯(lián)結(jié)
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';
表別名只在查詢執(zhí)行中使用啼辣,與列別名不一樣啊研,表別名不返回到客戶端
2.使用不同類型的聯(lián)結(jié)
1)自聯(lián)結(jié)(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';
自聯(lián)結(jié)通常作為外部語句,用來替代從相同表中檢索數(shù)據(jù)的使用子查詢語句鸥拧。
2)自然聯(lián)結(jié)(natural join)
自然聯(lián)結(jié)要求你只能選擇那些唯一的列党远,一般通過對一個(gè)表使用通配符(SELECT *),而對其他表的列使用明確的子集來完成富弦。
事實(shí)上沟娱,我們迄今為止建立的每個(gè)內(nèi)聯(lián)結(jié)都是自然聯(lián)結(jié)。
3)外聯(lián)結(jié)(outer join)
聯(lián)結(jié)包含了那些在相關(guān)表中沒有關(guān)聯(lián)行的行腕柜。
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
? ON Customers.cust_id = Orders.cust_id;
外聯(lián)結(jié)必須指明左济似、右
LEFT OUTER JOIN是從FROM子句左邊的表中選擇所有行
4)全聯(lián)結(jié)(full outer join)
檢索兩個(gè)表中的所有行并關(guān)聯(lián)那些可以關(guān)聯(lián)的行
3.使用帶聚集函數(shù)的聯(lián)結(jié)
檢索所有顧客及每個(gè)顧客所下的訂單數(shù)。
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.使用聯(lián)結(jié)和聯(lián)結(jié)條件
應(yīng)該總是提供聯(lián)結(jié)條件盏缤,否則會得出笛卡爾積
十四砰蠢、組合查詢
1.使用情境
在一個(gè)查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù);
對一個(gè)表執(zhí)行多個(gè)查詢唉铜,按一個(gè)查詢返回?cái)?shù)據(jù)台舱。
2.創(chuàng)建組合查詢
2.1 使用UNION
在各條SELECT語句之間放上關(guān)鍵字UNION就行。
2.2 UNION規(guī)則
UNION中的每個(gè)查詢必須包含相同的列潭流、表達(dá)式或聚集函數(shù)竞惋。
列數(shù)據(jù)類型不一定完全相同,但必須兼容灰嫉。
2.3 包含或取消重復(fù)的行
UNION從查詢結(jié)果集中自動去除了重復(fù)的行碰声。
想返回所有的匹配行可使用UNION ALL。
2.4 對組合查詢結(jié)果排序
只能使用一條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可極大地簡化負(fù)責(zé)的WHERE子句,簡化從多個(gè)表中檢索數(shù)據(jù)的工作蔓罚。
十五椿肩、插入數(shù)據(jù)(INSERT)
1.數(shù)據(jù)插入
三種方式:插入完整的行,插入行的一部分豺谈,插入某些查詢的結(jié)果
1.1插入完整的行
INSERT INTO Customers(cust_id,cust_name,cust_email)
? ? VALUES('10086','Toy Land',NULL);
給出明確列郑象,可以保證在表結(jié)構(gòu)發(fā)生變化時(shí)語句仍有效。
1.2插入部分行
INSERT INTO Customers(cust_id,cust_name)
? ? VALUES('10086','Toy Land');
省略某些列必須滿足的條件:
定義為允許NULL值茬末,或表定義中給出默認(rèn)值厂榛。
1.3插入檢索出的數(shù)據(jù)
INSERT SELECT語句盖矫,可以插入SELECT返回的多行
注:數(shù)據(jù)庫不關(guān)心SELECT返回的列名,它使用的是列的位置击奶。
2.從一個(gè)表復(fù)制到另一個(gè)表
用SELECT INTO導(dǎo)出數(shù)據(jù)
SELECT \*
INTO CustCopy
FROM Customers辈双;
MySQL語法如下
CREATE TABLE CustCopy AS
SELECT \* FROM Customers课舍;
注:不論從多少個(gè)表中檢索數(shù)據(jù)汁果,數(shù)據(jù)都只能插入到一個(gè)表中。