一、SQL是Structured Query Language結(jié)構(gòu)化數(shù)據(jù)語言。
是一種專門用來與數(shù)據(jù)庫溝通的語言
基本概念:
數(shù)據(jù)庫:database,保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件)
數(shù)據(jù)庫軟件:DBMS,管理和操作數(shù)據(jù)庫的軟件
-
表:某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單。
- 表名:一個(gè)數(shù)據(jù)庫中每一個(gè)表的表名都是唯一的。
- 模式:關(guān)于數(shù)據(jù)庫和表的布局以及特性的信息。
-
主鍵:一列或一組列,用來唯一標(biāo)識表中的每一行,也就是每一條記錄
- 任意兩行的主鍵值不能相同
- 每一列都必須有個(gè)主鍵值,不允許為null
- 主鍵值不允許修改或更新
- 主鍵值不能重用
二、檢索數(shù)據(jù):SELECT
1、SELECT語句
SELECT .....FROM.....
select count(*) as count ,ip , create_date
from merchant_info
where ip is not null
group by ip having count(*) > 3
Select后面跟幾個(gè)詞,就顯示幾列,count(*)是查詢包括null在內(nèi)的所有行數(shù)。
然而后面加上了where過濾條件 以及group by的分組條件,所以是每一個(gè)分組出一個(gè)count的數(shù)據(jù)
三、排序檢索數(shù)據(jù):ORDER BY
- 1、ORDER BY子句:必須是最后一條子句。
SELECT prod_name
FROM Products
ORDER BY prod_name; - 2、按多個(gè)列排序,指定列名,用逗號隔開即可,臨近的優(yōu)先。
SELECT prod_id, prod_price , prod_name
FROM Products
ORDER BY prod_price , prod_name;
先按照price,再按照name進(jìn)行排序 - 3、可以按相對列的位置進(jìn)行排序。
SELECT prod_id , prod_price , prod_name
FROM Products
ORDER BY 2,3; - 4、指定排序方向
SELECT prod_id, prod_price , prod_name
FROM Products
ORDER BY prod_price DESC , prod_name;
按照價(jià)格降序來排列產(chǎn)品。DESC只作用于其前面的列名上。ASC升序是默認(rèn)的。
四、過濾數(shù)據(jù):WHERE
1、搜索條件(過濾條件)WHERE,位于FROM之后,ORDER BY之前
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
2、WHERE子句操作符:等于,不等于,小于,大于
五、高級數(shù)據(jù)過濾:AND/ IN/ NOT
1、AND操作符, 可以連接兩個(gè)條件。
組合WHERE子句 WHERE .....AND......
2、OR操作符
當(dāng)AND和OR連用的時(shí)候,AND的優(yōu)先級更高,所以需要用括號將語句括起來。
WHERE (ven_id = "A" OR ven_id="B")AND prod_price = 10;
3、IN操作符,用來指定條件范圍。
語法更清楚直觀。求值順序更容易管理。
比OR執(zhí)行的快。可以包含其他的SELECT語句。
4、NOT操作符,否定其后跟的任何條件。
六、用通配符進(jìn)行過濾:*、%
1、通配符:用來匹配值的一部分的特殊字符。
搜索模式:由字面值、通配符或兩者組合構(gòu)成的搜索條件。
通配符搜索只能用于文本字符串
2、百分號%操作符。表示任何字符出現(xiàn)任意次數(shù)。區(qū)分大小寫
WHERE prod_name LIKE 'Fish%';找出所有以詞FIsh開頭的產(chǎn)品。
'%bean bag%'表示任何位置包含bean bag的文本
WHERE email LIKE 'b%@forta.com' 查找電子郵件
WHERE prod_name LIKE 'F%y' 表示F起頭y結(jié)尾的值
3、下劃線_通配符,匹配單個(gè)字符。
WHERE first_name LIKE '_l%'
4、方括號([ ])通配符,指定一個(gè)字符集,必須匹配指定位置的一個(gè)字符
MYSQL好像不支持
七、創(chuàng)建計(jì)算字段——需要將數(shù)據(jù)庫中的信息轉(zhuǎn)格式再輸出:CONCAT
1、計(jì)算字段并不實(shí)際存在于數(shù)據(jù)庫表中,而是運(yùn)行時(shí)在SELECT語句中創(chuàng)建的。
字段:相當(dāng)于列
2、拼接字段
SELECT CONCAT(first_name,' ',last_name)
3、使用別名,也就是sql創(chuàng)建一個(gè)新的列,包含這個(gè)拼接的值。客戶端可以 引用這個(gè)新的列
SELECT CONCAT(first_name,' ',last_name) AS name
4、 執(zhí)行算術(shù)計(jì)算 +-*/
SELECT prod_id , quantity, item_price,
quantity*item_price AS price
八、使用函數(shù)處理數(shù)據(jù)
1、每一個(gè)DBMS都有 特定的函數(shù)
提取字符串的組成部分:SUBSTRING()
數(shù)據(jù)類型轉(zhuǎn)換:CONVERT()
取當(dāng)前日期:CURDATE()
2、UPPER——轉(zhuǎn)換成大寫
SELECT first_name,UPPER(first_name) AS first_name_up
常用的文本處理函數(shù)P67
LEFT() 返回字符串左邊的字符
LENGTH()返回字符串的長度
LOWER() 將字符串轉(zhuǎn)換為小寫
LTRIM() 除去字符串左邊的空格
3、 數(shù)值處理函數(shù)
九、匯總數(shù)據(jù):COUNT()
1、聚集數(shù)據(jù)
AVG() 返回某列的平均值
COUNT()返回某列的行數(shù)
COUNT(*)包含null值的行
COUNT(column)忽略null值的行
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
十、分組數(shù)據(jù)——匯總表內(nèi)容的子集:HAVING
1、SELECT vend_id ,COUNT(*) AS num_prods FROM Products GROUP BY vend_id;
按照ven_id來分組,顯示個(gè)數(shù)。
GROUP BY 可以包含任意數(shù)目的列,因而可以對分組進(jìn)行嵌套
建立分組時(shí),所有的列都一起計(jì)算
用的表達(dá)式必須和SELECT中的相同
SELECT中的每一列都必須在GROUP BY中給出
在WHERE之后,ORDER BY之前
2、過濾分組——HAVING
HAVING相當(dāng)于WHERE,只是專門用來過濾分組的。
>SELECT warn_trade_amount,COUNT(*) AS count
FROM merchant_info
GROUP BY warn_trade_amount
HAVING warn_trade_amount>=49200
對大于49200的進(jìn)行分組
3、GROUP BY 和 ORDER BY的區(qū)別
P90
4、順序:SELECT--FROM--WHERE--GROUP BY--HAVING--ORDER BY
十一、使用子查詢——嵌套在其他查詢中的查詢
1、查詢的嵌套:
子查詢是從內(nèi)向外處理的。
2、注意:子查詢的Select語句只能查詢單個(gè)列,查詢多個(gè)列將返回錯(cuò)誤。
這里是將查出的count作為oders,也就是orders為訂單數(shù) 。然后是將兩個(gè)表的id連接,傳入id來對orders表進(jìn)行查詢
SELECT cust_name, cust_state,
(SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders
FROM customers ORDER BY cust_name;
注:用多個(gè)表的時(shí)候要完全限定列名,而且子查詢并不是效率最高的。
十二、聯(lián)結(jié)表:INNER JOIN
1、關(guān)系表:將信息分解成多個(gè)表,一類數(shù)據(jù)一個(gè)表。各表通過某些共同的值相互關(guān)聯(lián),所以才叫關(guān)系型數(shù)據(jù)庫。
2、
SELECT vend_name , prod_name ,prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
這是等值連接(equijoin),基于兩個(gè)表之間的相等測試,也稱為內(nèi)聯(lián)結(jié)(inner join)。可以對這種聯(lián)結(jié)使用稍微不同的語法,明確指定聯(lián)結(jié)的類型。
SELECT vend_name , prod_name ,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id
這里指定是以內(nèi)聯(lián)結(jié)的方式
3、聯(lián)結(jié)多個(gè)表:
SELECT prod_name , vend_name , prod_price , quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num = 20007
這個(gè)查詢是得出訂單20007中的物品信息:包括產(chǎn)品名,價(jià)格,供應(yīng)商和數(shù)量。
其中,產(chǎn)品名和價(jià)格在products表中,供應(yīng)商信息在vendors表中,數(shù)量在orderItems表中。
而最后一個(gè)聯(lián)結(jié)條件是用來指定訂單號。
注意:1、聯(lián)結(jié)非常耗費(fèi)資源。聯(lián)結(jié)的越多,性能下降的越厲害。
2、聯(lián)結(jié)中的最大數(shù)目是有限制的。、
十三、創(chuàng)建高級聯(lián)結(jié):JOIN
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_item = o.order_num
AND prod_id = "RGAN01"
表別名可以在WHERE、SELECT、ORDER BY以及其他部分。
2、使用不同類型的聯(lián)結(jié)。
除了簡單聯(lián)結(jié)(內(nèi)聯(lián)結(jié)/等值聯(lián)結(jié)),還有自聯(lián)結(jié)(self-join)、自然聯(lián)結(jié)(natural-join)和外聯(lián)結(jié)(outer join)
1)自聯(lián)結(jié):就是
5、使用帶聚集函數(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
這個(gè)語句將使用INNER JOIN將Customers和Orders表互相關(guān)聯(lián)。
Group By 按照顧客分組,用COUNT對每個(gè)顧客的訂單計(jì)數(shù),將它作為num_ord返回
十四、組合查詢——多條SELECT語句并在一起:UNION
在一個(gè)查詢中從不同的表返回?cái)?shù)據(jù)結(jié)構(gòu)
對一個(gè)表執(zhí)行多個(gè)查詢,按一個(gè)查詢返回?cái)?shù)據(jù)
1、使用UNION創(chuàng)建組合查詢——需要Illonois、Indiana、Michigan等美國幾個(gè)州的所有顧客的報(bào)表,還想包括不管位于哪個(gè)州的Fun4All
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'
等價(jià)于
SELECT cust_name, cust_contact , cust_email
FROM customers
WHERE cust_state IN('IL','IN','MI')
![Uploading 1_965426.jpg . . .]
OR cust_name = 'Fun4All'
對于較復(fù)雜的過濾條件,UNION比where效率更高。
2、UNION從查詢結(jié)果中自動去除了重復(fù)的行。UNION ALL不去除。
3、對組合查詢結(jié)果排序,只能使用一條order by語句。
十五、插入數(shù)據(jù):INSERT
插入有幾種方式:插入完整的行,插入行的一部分,插入某些查詢的結(jié)果
1、插入完整的行
1)
存儲到表中每一列的數(shù)據(jù)都在VALUES中給出
必須每一列給一個(gè)值或者null
各列必須按照表中的順序來填充
缺點(diǎn):不安全,死板,依賴于表結(jié)構(gòu)
2)或者可以列出列名一一對應(yīng),好處是即使表結(jié)構(gòu)改變也起作用,所以列出的列的順序不必要和表中相同——推薦方法。
2、插入部分行:
也就是可以省略一些列名,不需要完全列出。但是必須滿足兩個(gè)條件
該列定義允許為NULL
在表定義中給出默認(rèn)值,如果表中沒給,插入時(shí)也不而給,就會報(bào)錯(cuò)
3、插入檢索出的數(shù)據(jù):INSERT SELECT
這個(gè)例子將CustNew中的所有數(shù)據(jù)導(dǎo)入到Customer中。
4、從一個(gè)表復(fù)制到另一個(gè)表:SELECT INTO
創(chuàng)建一個(gè)名為CustCopy的新表,并把Customer表中的所有內(nèi)容復(fù)制到新表中。
*可以改成列名,可以選擇性復(fù)制。
任何SELECT選項(xiàng)和子句都可以使用,包括WHERE和GROUP BY
可以利用聯(lián)結(jié)從多個(gè)表中插入數(shù)據(jù)
不管從多少個(gè)表中檢索數(shù)據(jù),數(shù)據(jù)都只能插入到一個(gè)表中
十六、更新和刪除數(shù)據(jù):UPDATE、DELETE
1、更新數(shù)據(jù)
更新表中特定的行
更新表中所有行
Update的組成
要更新的表
列名和他們的新值
確定要更新哪些行的過濾條件
刪除某個(gè)列的值,可以設(shè)置它為NULL
2、刪除數(shù)據(jù)
從表中刪除特定的行
從表中刪除所有的行
如果省略WHERE,將會刪除所有的顧客
DBMS通常可以防止刪除某個(gè)關(guān)系需要用到的行
DELETE可以刪除所有的行,但是不刪除表。TRUNCATE TABLE刪除所有行更快
十七、創(chuàng)建和操縱表
1、創(chuàng)建表
多數(shù)DBMS都具有交互式創(chuàng)建和管理數(shù)據(jù)庫表的工具
表也可以直接用SQL語句操縱