SQL必知必會(huì) 1~6章

注:這一系列的文章是《SQL必知必會(huì)》第四版的讀書(shū)筆記慕匠。

1.了解SQL

1.1 數(shù)據(jù)庫(kù)基礎(chǔ)

數(shù)據(jù)庫(kù):保存有組織的數(shù)據(jù)的容器瘸彤。

數(shù)據(jù)庫(kù)軟件應(yīng)稱為數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS。

表:某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單肛响。

模式:關(guān)于數(shù)據(jù)庫(kù)和表的布局及特性的信息郭膛。

列:表中的一個(gè)字段闪檬。所有表都是一個(gè)或多個(gè)列組成的星著。

數(shù)據(jù)類型:所允許的數(shù)據(jù)的類型。每個(gè)表列都有相應(yīng)的數(shù)據(jù)類型粗悯,它限制(或允許)該列中存儲(chǔ)的數(shù)據(jù)虚循。

行:表中的一個(gè)記錄。

主鍵:一列(或一組列)样傍,其值能唯一的標(biāo)識(shí)表中的每一行横缔。

1.2 什么是SQL

SQL:結(jié)構(gòu)化查詢語(yǔ)言,專門用來(lái)與數(shù)據(jù)庫(kù)溝通的語(yǔ)言衫哥。

2.檢索數(shù)據(jù)

使用SELECT語(yǔ)句從表中檢索一個(gè)或多個(gè)數(shù)據(jù)列茎刚。

2.1 SELECT語(yǔ)句

SELECT語(yǔ)句的用途是從一個(gè)或多個(gè)表中檢索信息。為了使用SELECT檢索表數(shù)據(jù)撤逢,必須至少給出兩條信息---想選擇什么膛锭,從哪里選擇。

2.2?檢索單個(gè)列

輸入:

SELECT?prod_name

FROM Products;

上面的SELECT語(yǔ)句返回的結(jié)果是沒(méi)有排序的笛质。

注意:

(1)多條SQL語(yǔ)句必須以分號(hào)(;)分隔泉沾。多數(shù)的DBMS不需要在單條SQL語(yǔ)句后加分號(hào),但是還是建議加上妇押。

(2)SQL語(yǔ)句不區(qū)分大小寫跷究,SELECT與select等價(jià)。但是表名敲霍,列名和值有可能是要區(qū)分大小寫的俊马,這取決于DBMS如何配置。

(3)處理SQL語(yǔ)句時(shí)肩杈,其中所有的空格都被忽略柴我。因此SQL語(yǔ)句可以寫成一行,也能分寫成多行扩然。

2.3?檢索多個(gè)列

輸入:

SELECT?prod_name,prod_price

FROM Products;

在選擇多個(gè)列時(shí)艘儒,列名之間一定要加上逗號(hào)(,),最后一個(gè)列名后不加夫偶。

2.4?檢索所有列

輸入:

SELECT *

FROM Products;

在列名的位置使用星號(hào)(*)通配符界睁,檢索出所有列。

注意:除非確實(shí)需要檢索出所有的列兵拢,否則最后別使用*通配符翻斟。檢索出不需要的列通常會(huì)降低檢索和應(yīng)用程序的性能。

2.5?檢索不同的值

如果不希望每個(gè)值重復(fù)的出現(xiàn)说铃,可以使用關(guān)鍵字DISTINCT访惜。

輸入:

SELECT DISTINCT?vend_id

FROM Products;

注意:DISTINCT作用于所有列嘹履,而不是單單一列。

2.6?限制結(jié)果

如果只希望返回一定數(shù)量的行债热,在MySQL中需要使用LIMIT關(guān)鍵字砾嫉。

下面的例子只返回前面五行,默認(rèn)從第0行開(kāi)始阳柔。

注意:第一個(gè)被檢索的行是第0行焰枢。

輸入:

SELECT prod_name

FROM Products

LIMIT 5

如果需要指定從第幾行開(kāi)始檢索,那么就要將LIMIT和OFFSET關(guān)鍵字一起使用舌剂。

其中LIMIT?a OFFSET b ,a指出檢索幾行暑椰,b指出從第幾行開(kāi)始檢索霍转。

輸入:

SELECT?prod_name

FROM Products

LIMIT 5 OFFSET 5;

MySQL支持簡(jiǎn)化版的LIMIT?a OFFSET?b?語(yǔ)句,即:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LIMIT?a OFFSET?b=LIMIT?b,a

2.7?使用注釋

注釋使用--(兩個(gè)連字符)嵌在行內(nèi)一汽,之后的文本就是注釋避消。

輸入:

--?這是注釋

SELECT?prod_name

FROM Products;

上面的是單行注釋,如果要進(jìn)行多行注釋召夹,需要用到 /*......*/ 岩喷,如下例。

輸入:

/* SELECT prod_name,vend_id

FROM Products; */

SELECT prod_name

FROM Products;

3.排序檢索數(shù)據(jù)

使用SELECT語(yǔ)句的ORDER BY子句监憎,根據(jù)需要排序檢索出的數(shù)據(jù)纱意。

3.1?排序數(shù)據(jù)

為了明確的排序用SELECT語(yǔ)句檢索出的數(shù)據(jù),可使用ORDER BY子句鲸阔。

輸入:

SELECT?prod_name

FROM Products

ORDER BY prod_name;

注意:在指定一條ORDER BY子句時(shí)偷霉,應(yīng)保證它是SELECT語(yǔ)句中的最后一個(gè)子句。否則會(huì)出現(xiàn)錯(cuò)誤褐筛。

3.2?按多個(gè)列排列

要按多個(gè)列排列类少,簡(jiǎn)單指定列名,列名之間用逗號(hào)分開(kāi)渔扎。

輸入:

SELECT?prod_id,prod_price,prod_name

FROM Products

ORDER BY prod_price,prod_name;

3.3?按列位置排序

除了能用列名指出排序順序外硫狞,ORDER BY?還支持相對(duì)列位置進(jìn)行排序。

輸入:

SELECT prod_id,prod_price,prod_name

FROM Products

ORDER BY 2,3;

如果進(jìn)行排序的列不在SELECT清單中晃痴,顯然不能使用這種方法残吩。

3.4?指定排序方向

默認(rèn)排序?yàn)樯蚺帕校且材苓M(jìn)行降序排列愧旦,這里需要使用到關(guān)鍵字DESC世剖。

輸入:

SELECT?prod_id,prod_price,prod_name

FROM Products

ORDER BY prod_price DESC;

DESC只應(yīng)用到直接位于其前面的列名。若要在多個(gè)列上進(jìn)行降序排序笤虫,則應(yīng)該對(duì)每一列指定DESC關(guān)鍵字旁瘫。

4.過(guò)濾數(shù)據(jù)

使用SELECT語(yǔ)句的WHERE子句指定搜索條件祖凫。

4.1?使用WHERE子句

在SELECT語(yǔ)句中,數(shù)據(jù)根據(jù)WHERE子句中指定的搜索條件進(jìn)行過(guò)濾酬凳。WHERE子句在FROM子句之后給出惠况。

輸入:

SELECT?prod_name,prod_price

FROM Products

WHERE prod_price=3.49;

注意,在同時(shí)使用WHERE子句和ORDER BY子句時(shí)宁仔,應(yīng)讓ORDER BY子句位于WHERE子句之后稠屠。

4.2 WHERE子句操作符

4.2.1?檢查單個(gè)值

輸入:

SELECT?prod_name,prod_price

FROM Products

WHERE prod_price<10;

4.2.2?不匹配檢查

輸入:

SELECT vend_id,prod_name

FROM Products

WHERE vend_id='DLL01';

4.2.3?范圍值檢查

使用BETWEEN操作符,用AND隔開(kāi)兩個(gè)值翎苫。

輸入:

SELECT?prod_name,prod_price

FROM Products

WHERE prod_price BETWEEN 5 AND 10;

4.2.4?空值檢查

在一個(gè)列不包含值時(shí)权埠,稱其包含空值NULL。

NULL:無(wú)值煎谍,與0攘蔽、空字符串以及空格不同。

SELECT語(yǔ)句中有一個(gè)特殊的WHERE子句呐粘,用來(lái)檢查具有NULL值得列满俗,這個(gè)WHERE子句就是IS NULL子句。

輸入:

SELECT?prod_name

FROM Products

WHERE prod_price IS NULL;

5.高級(jí)數(shù)據(jù)過(guò)濾

組合WHERE子句建立功能更強(qiáng)作岖、更高級(jí)的搜索條件唆垃。

使用NOT和IN操作符。

5.1?組合WHERE子句

SQL語(yǔ)句允許給出多個(gè)WHERE子句痘儡,以AND子句OR子句的方式使用辕万。

操作符:用來(lái)聯(lián)結(jié)或改變WHERE子句中的子句的關(guān)鍵字,也稱為邏輯操作符谤辜。

5.1.1 AND操作符

AND:用在WHERE子句中的關(guān)鍵字蓄坏,用來(lái)指示檢索滿足所有給定條件的行。

輸入:

SELECT?prod_id,prod_price,prod_name

FROM Products

WHERE vend_id='DLL01' AND prod_price<=4;

5.1.2 OR操作符

OR:WHERE子句中使用的關(guān)鍵字丑念,用來(lái)表示檢索匹配任一給定條件的行涡戳。

輸入:

SELECT prod_price,prod_name

FROM Products

WHERE vend_id='DLL01' OR?vend_id='BRS01';

5.1.3?求值順序

使用具有AND和OR操作符的WHERE子句,使用括號(hào)明確求值順序脯倚,避免出錯(cuò)渔彰。

輸入:

SELECT prod_price,prod_name

FROM Products

WHERE (vend_id='DLL01' OR?vend_id='BRS01') AND prod_price>=10;

5.2 IN操作符

IN:WHERE子句中用來(lái)指定要匹配值的清單的關(guān)鍵字,功能與OR相當(dāng)推正。

IN操作符用來(lái)指定條件范圍恍涂,取一組由逗號(hào)分隔,括在圓括號(hào)中的合法值植榕。

輸入:

SELECT prod_price,prod_name

FROM Products

WHERE vend_id IN (‘DLL01’,'BRS01')

ORDER BY?prod_name;

IN操作符的優(yōu)點(diǎn):

(1)在有很多合法選項(xiàng)時(shí)再沧,IN操作符的語(yǔ)法更清楚,直觀尊残。

(2)在與其他AND和OR操作符組合使用IN時(shí)炒瘸,求值順序更容易管理淤堵。

(3)IN操作符一般比一組OR操作符執(zhí)行的快。

(4)IN最大優(yōu)點(diǎn)是可以包含其他SELECT語(yǔ)句顷扩,能夠動(dòng)態(tài)的建立WHERE子句拐邪。

5.3 NOT操作符

NOT:WHERE子句中用來(lái)否定其后條件的關(guān)鍵字。

輸入:

SELECT prod_name

FROM Products

WHERE NOT vend_id=‘DLL01’

ORDER BY?prod_name;

6.用通配符進(jìn)行過(guò)濾

如何使用通配符以及使用LIKE操作符進(jìn)行通配搜索隘截。

6.1 LIKE操作符

通配符:用來(lái)匹配值得一部分的特殊字符扎阶。

搜索模式:由字面值、通配符或兩者組合構(gòu)成的搜索條件婶芭。

搜索子句中使用通配符必須使用LIKE操作符东臀。通配符搜索只能用于文本字段。

6.1.1?百分號(hào)(%)通配符

%表示任何字符出現(xiàn)任意次數(shù)犀农,包括0個(gè)字符啡邑,0次。

通配符不能匹配NULL井赌,如:WHERE?prod_name LIKE '%';?不會(huì)匹配產(chǎn)品名稱為NULL的行。

輸入:

SELECT prod_id,prod_name

FROM Products

WHERE prod_name LIKE 'Fish%';

輸入:

SELECT prod_id,prod_name

FROM Products

WHERE prod_name LIKE '%bean bag%';

6.1.2?下劃線(_)通配符

下劃線(_)只匹配單個(gè)字符贵扰。

輸入:

SELECT prod_id,prod_name

FROM Products

WHERE prod_name LIKE '__ inch teddy bear';

6.1.3?方括號(hào)([])通配符

方括號(hào)([])通配符用來(lái)指定一個(gè)字符集仇穗,必須匹配指定位置的一個(gè)字符。只能匹配單個(gè)字符戚绕。

輸入:

SELECT?cust_contact

FROM Customers

WHERE cust_contact LIKE '[JM]%'

ORDER BY cust_contact;

注意:在MySQL 5.7.18中實(shí)踐之后纹坐,MySQL不支持方括號(hào)通配符。

6.2?使用通配符的技巧

通配符的搜索一般比前面討論的其他搜索要耗費(fèi)更長(zhǎng)的處理時(shí)間舞丛。

注意:

(1)不要過(guò)度使用通配符耘子,如果其他操作符能達(dá)到目的,使用其他操作符球切。

(2)需要使用通配符時(shí)谷誓,盡量不要放在搜索模式的開(kāi)始處。通配符在開(kāi)始處吨凑,搜索起來(lái)最慢捍歪。

(3)注意通配符的位置。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸵钝,一起剝皮案震驚了整個(gè)濱河市糙臼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恩商,老刑警劉巖变逃,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怠堪,居然都是意外死亡揽乱,警方通過(guò)查閱死者的電腦和手機(jī)名眉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锤窑,“玉大人璧针,你說(shuō)我怎么就攤上這事≡▎” “怎么了探橱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绘证。 經(jīng)常有香客問(wèn)我隧膏,道長(zhǎng),這世上最難降的妖魔是什么嚷那? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任胞枕,我火速辦了婚禮,結(jié)果婚禮上魏宽,老公的妹妹穿的比我還像新娘腐泻。我一直安慰自己,他們只是感情好队询,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布派桩。 她就那樣靜靜地躺著,像睡著了一般蚌斩。 火紅的嫁衣襯著肌膚如雪铆惑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天送膳,我揣著相機(jī)與錄音员魏,去河邊找鬼。 笑死叠聋,一個(gè)胖子當(dāng)著我的面吹牛撕阎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晒奕,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼闻书,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了脑慧?” 一聲冷哼從身側(cè)響起魄眉,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闷袒,沒(méi)想到半個(gè)月后坑律,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年晃择,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冀值。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宫屠,死狀恐怖列疗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浪蹂,我是刑警寧澤抵栈,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站坤次,受9級(jí)特大地震影響古劲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缰猴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一产艾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滑绒,春花似錦闷堡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至焰扳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間误续,已是汗流浹背吨悍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹋嵌,地道東北人育瓜。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像栽烂,于是被迫代替她去往敵國(guó)和親躏仇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 第四章 檢索數(shù)據(jù) 4.1 SELECT語(yǔ)句 SELECT語(yǔ)句的用途是從一個(gè)或多個(gè)表中檢索信息腺办。為了使用SELECT...
    saviochen閱讀 562評(píng)論 0 4
  • 前言 一焰手、基礎(chǔ)知識(shí)1.了解數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)(database):保存有組織的數(shù)據(jù)的容器表(table):某種特定類型數(shù)...
    流水混帳閱讀 496評(píng)論 0 1
  • 數(shù)據(jù)庫(kù)入門 數(shù)據(jù)庫(kù): 保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件).數(shù)據(jù)庫(kù)軟件應(yīng)該稱為 DBMS(DataB...
    Mjericho閱讀 495評(píng)論 0 0
  • 1.表中的任何列都可以作為主鍵, 只要它滿足以下條件:任意兩行都不具有相同的主鍵值怀喉;每一行都必須具有一個(gè)主鍵值( ...
    Cherryjs閱讀 648評(píng)論 0 0
  • 看著前幾天特朗普罷免FBI局長(zhǎng)书妻,局長(zhǎng)又反戈一擊,準(zhǔn)備與總統(tǒng)抗戰(zhàn)到底一事躬拢,想到了美國(guó)“說(shuō)客”一詞躲履。 美國(guó)總統(tǒng)格蘭特發(fā)...
    阿中2016閱讀 667評(píng)論 0 0