SQL必知必會筆記(上)

一弄贿、基本概念

數(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è)表中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末院喜,一起剝皮案震驚了整個(gè)濱河市痰驱,隨后出現(xiàn)的幾起案子证芭,更是在濱河造成了極大的恐慌,老刑警劉巖担映,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废士,死亡現(xiàn)場離奇詭異,居然都是意外死亡蝇完,警方通過查閱死者的電腦和手機(jī)官硝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門四敞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泛源,“玉大人,你說我怎么就攤上這事忿危〈锕浚” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵铺厨,是天一觀的道長缎玫。 經(jīng)常有香客問我,道長解滓,這世上最難降的妖魔是什么赃磨? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮洼裤,結(jié)果婚禮上邻辉,老公的妹妹穿的比我還像新娘。我一直安慰自己腮鞍,他們只是感情好值骇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著移国,像睡著了一般吱瘩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迹缀,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天使碾,我揣著相機(jī)與錄音蜜徽,去河邊找鬼。 笑死票摇,一個(gè)胖子當(dāng)著我的面吹牛拘鞋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兄朋,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼掐禁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颅和?” 一聲冷哼從身側(cè)響起傅事,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峡扩,沒想到半個(gè)月后蹭越,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡教届,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年响鹃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片案训。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡买置,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出强霎,到底是詐尸還是另有隱情忿项,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布城舞,位于F島的核電站轩触,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏家夺。R本人自食惡果不足惜脱柱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拉馋。 院中可真熱鬧榨为,春花似錦、人聲如沸煌茴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽景馁。三九已至,卻和暖如春逗鸣,著一層夾襖步出監(jiān)牢的瞬間合住,已是汗流浹背绰精。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留透葛,地道東北人笨使。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像僚害,于是被迫代替她去往敵國和親硫椰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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