SQL必知必會

一、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ù)

Paste_Image.png

三、排序檢索數(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ù)。

Paste_Image.png

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、查詢的嵌套:

Paste_Image.png

子查詢是從內(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
Paste_Image.png

這個(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)

Paste_Image.png

存儲到表中每一列的數(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

Paste_Image.png

這個(gè)例子將CustNew中的所有數(shù)據(jù)導(dǎo)入到Customer中。
4、從一個(gè)表復(fù)制到另一個(gè)表:SELECT INTO

Paste_Image.png

創(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的組成
要更新的表
列名和他們的新值
確定要更新哪些行的過濾條件

Paste_Image.png

刪除某個(gè)列的值,可以設(shè)置它為NULL

Paste_Image.png

2、刪除數(shù)據(jù)
從表中刪除特定的行
從表中刪除所有的行

Paste_Image.png

如果省略WHERE,將會刪除所有的顧客
DBMS通常可以防止刪除某個(gè)關(guān)系需要用到的行
DELETE可以刪除所有的行,但是不刪除表。TRUNCATE TABLE刪除所有行更快

十七、創(chuàng)建和操縱表

1、創(chuàng)建表
多數(shù)DBMS都具有交互式創(chuàng)建和管理數(shù)據(jù)庫表的工具
表也可以直接用SQL語句操縱

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,656評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 由于本人使用的mac,第一次涉及數(shù)據(jù)庫方面知識,軟件與環(huán)境配置都不是那么熟悉,安裝MySQL還有GUI客戶端的安裝...
    昊月先森閱讀 970評論 0 0
  • 生成數(shù)據(jù)庫表和數(shù)據(jù)的SQL文件 第1課:了解SQL 1、數(shù)據(jù)庫基礎(chǔ) 數(shù)據(jù)庫(database):保存有組織的數(shù)據(jù)的...
    墨小痕92閱讀 419評論 0 0
  • 數(shù)據(jù)庫入門 數(shù)據(jù)庫: 保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件).數(shù)據(jù)庫軟件應(yīng)該稱為 DBMS(DataB...
    Mjericho閱讀 509評論 0 0
  • 1 什么是SQL? SQL:Structured Query Language,結(jié)構(gòu)化查詢語言的縮寫,是一種專門...
    hufengreborn閱讀 649評論 0 0
  • 「談讀書與大學(xué)」 讀書是一種態(tài)度,不管是讀一年書還是十年書,可能不能解決我們與他人不公平的問題,可能不能立即解...
    勝勝老師觀世界閱讀 599評論 0 1