系列文章目錄mysql
表格是資料庫儲存資料的基本元件,它是由一些欄位組合而成的,儲存在表格中的每一筆紀錄就擁有這些欄位的資料。以儲存城市資料的表格「city」來講,設計這個表格的人但願一個城市資料須要包含編號、名稱、國家代碼、區域和人口數量,因此他爲「city」表格設計了這些「欄位(column)」:sql
儲存在表格中的每一筆資料稱爲「列(row)」或「紀錄(record)」:segmentfault
在設計表格的時候,一般會指定一個欄位爲「主索引鍵(primary key)」:svg
注:主索引鍵會在「第八章、表格與索引」中詳細的討論。工具
資料庫中能夠儲存各類不一樣的資料,SQL提供許多不一樣的「資料型態」讓你應付這些不一樣的需求。在開始查詢資料以前,你要先認識最多見、也是最基本的資料型態。第一種是數值,爲了更精準的保存數值資料,SQL提供整數與小數兩種數值型態:spa
你能夠依照本身的需求,使用儲存的數值資料執行數學運算:設計
經常使用的資料型態還有「字串」與「日期」:3d
在SQL敘述中使用字串資料的時候,字串資料的先後要使用單引號或雙引號:code
使用日期資料的時候,MySQL資料庫預設的日期格式是「年-月-日」。與字串資料同樣,先後也要使用單引號或雙引號:cdn
注:字串與日期資料型態會在「第七章、儲存引擎與資料型態、欄位資料型態」中詳細的討論。
另一種在資料庫中比較特殊的資料型態是「NULL」,它不像數值、字串或日期資料型態是一個明確的資料,「NULL」是用來表示「不肯定」、「未知」或「沒有」的資料:
2 查詢敘述
在執行資料庫的操做中,查詢算是最多見也是最複雜的工做,因此一個查詢敘述所使用到的子句也最多,下列是查詢敘述的基本語法:
這一章會討論「SELECT」、「FROM」、「WHERE」、「ORDER BY」和「LIMIT」五個子句組合起來的查詢敘述。其它的子句會在下一章繼續討論。
在你使用「SELECT」搭配各類子句來查詢資料時,要特別注意子句使用的順序:
就算你每個子句的寫法都沒有出錯,若是順序不對了:
一個資料庫伺服器能夠創建許多須要的資料庫,因此在你執行任何資料庫的操做前,一般要先指定使用的資料庫。下列是指定資料庫的指令:
若是你使用「MySQL Workbench」這類的工具軟體,畫面上看起來會像這樣:
一個SQL查詢敘述必定要以「SELECT」子句開始,再搭配其它的子句完成查詢資料的工做。你能夠單獨使用「SELECT」子句,只不過這樣的用法跟資料庫一點關係都沒有,它只不過把你輸入的內容顯示出來而已:
例以下列的查詢敘述,只是簡單的顯示字串和計算結果,並不會查詢資料庫中的資料:
SELECT 'My name is Simon Johnson', 35 * 12
通常所謂的查詢敘述,一般是查詢資料庫中的資料,因此「SELECT」子句會搭配「FROM」子句來使用,而「SELECT」後面能夠指定「*」表示要查詢指定表格的全部欄位:
若是目前使用中的資料庫爲「world」,下列的敘述能夠查詢「world」資料庫中,「city」表格的全部資料:
SELECT * FROM city
一個資料庫伺服器能夠創建許多須要的資料庫,因此在你執行任何資料庫的操做前,都要使用「USE」敘述指定一個使用中的資料庫。不過你也能夠在SQL敘述中使用下列的語法來指定資料庫:
若是目前使用中的資料庫是「world」,你不用先使用「USE cmdev」敘述切換使用中的資料庫,可使用下列的語法查詢「cmdev」資料庫中的「emp」表格:
SELECT * FROM cmdev.emp
有時候你並不須要查詢一個表格中全部的欄位,因此你能夠在「SELECT」子句後面本身指定須要的欄位:
若是你在「SELECT」後面使用「*」的話:
你能夠依照本身的須要決定要查詢哪些欄位和順序:
除了查詢表格中的欄位外,你能夠加入任何須要的運算,這裏先討論通常常見的數學運算。下列是很經常使用來執行數學運算的運算子:
優先順序 | 運算子 | 說明 | 範例 | 運算結果 |
---|---|---|---|---|
1 | % | 餘數 | 7 % 3 | 1 |
1 | MOD | 餘數 | 7 MOD 3 | 1 |
1 | * | 乘 | 7 * 3 | 21 |
1 | / | 除 | 7 / 3 | 2.333 |
1 | DIV | 除(整數) | 7 DIV 3 | 2 |
2 | + | 加 | 7 + 3 | 10 |
2 | - | 減 | 7 – 3 | 4 |
注:優先順序的數字從1開始,1表示優先權比較高,2比較低,以此類推。就跟通常數學運算的先乘除後加減同樣:在一個運算式中,優先權高的先算完,再換低優先權繼續算;一樣優先權的就由左到右計算。你也能夠在運算式中使用左右括號,括號中的運算會先執行。
以「cmdev」資料庫中的員工表格(emp)來講,想要計算員工的年薪,就可使用這些運算子來完成你的查詢工做:
你能夠另外爲「SELECT」後面查詢的資料取一個本身想要的名稱,這個做法稱爲「別名(alias
name)」:
取欄位別名會讓執行查詢後的結果,使用你本身取的名稱爲欄位名稱:
注:幫通常欄位取一個欄位別名是比較沒有必要的,若是是運算式的話,一般就要幫它取一個欄位別名來取代原來一大串的運算式。
在取欄位別名的時候要特別注意下列的情況:
另外若是你「堅持」要使用SQL語法中的保留字來看成欄位別名的話:
若是違反上列兩個規定,執行敘述之後會發生錯誤。
3 條件查詢
使用「SELECT」和「FROM」執行的查詢敘述,是把你在「FROM」子句指定表格裏全部的紀錄傳回來。資料庫最大的好處就是能夠隨時依照須要查詢部份紀錄資料,你能夠搭配「WHERE」子句執行查詢條件的設定:
要使用「WHERE」執行查詢條件的設定,你會使用下列基礎的比較運算子:
|優先順序 |運算子| 說明|
|1| =| 等於|
|1| <=>
| 等於|
|1| !=
| 不等於|
|1| <
| 小於|
|1| <=
| 小於等於|
|1| >
| 大於|
|1| >=
| 大於等於|
注:<=>
運算子在後面「NULL值的判斷」會討論。
使用這些基礎的比較運算子就能夠完成一些簡單的條件設定:
設定日期資料型態的條件也是很常見的:
查詢條件的設定,有時候會像前面討論的單一條件同樣,並不會太複雜;不過也很常遇到在一個查詢的需求中,須要設定一個以上的條件,那你就會用到下列的運算子:
優先順序 | 運算子 | 說明 |
---|---|---|
1 | NOT | 非 |
2 | && | 並且 |
2 | AND | 並且 |
3 | || |
或 |
3 | OR | 或 |
3 | XOR | 互斥 |
「NOT」運算子比較特殊一些,在通常的需求中,比較不會用到它。如下列的需求來講:
若是想要查詢國家代碼是「TWN」,並且人口數量小於十萬的城市,就必須設定兩個條件,而兩個條件之間,依照「並且」的需求,使用「AND」來結合兩個條件:
若是想要查詢國家代碼是「TWN」或是「USA」的城市,在兩個條件之間依照「或」的需求,使用「OR」來結合兩個條件:
在邏輯運算子的介紹中,它們也一樣有「優先順序」的。若是你想要查詢在歐洲(Europe)或非洲(Aftica)國家,並且人口數要小於一萬。使用下列的查詢條件所獲得的資料,跟你想要的卻不同:
若是有多個查詢條件的設定,所有都是「AND」或所有都是「OR」的話,就沒有這類問題;若是查詢條件中,有「AND」和「OR」同時出現的話,就要依照你的須要,視狀況加上左右刮號來控制條件的設定:
通常的條件和邏輯運算子,已經能夠應付大部份的查詢條件需求。下列還有一些能夠用在特殊用途或是提供替代寫法的條件設定:
「BETWEEN … AND …」用來執行一個指定範圍條件的設定:
若是要查詢人口數量在八萬到九萬之間的城市資料,能夠有下列兩種條件的寫法,它們執行之後的結果是徹底同樣的:
使用「BETWEEN … AND …」的條件設定會包含指定的資料,因此下列兩個查詢條件所獲得的結果就不同了:
「BETWEEN … AND …」使用在日期資料時,也能夠完成某一個日期範圍的判斷:
「IN (…)」使用在一組成員資料的比對條件設定:
下列兩個查詢敘述,均可以獲得國家代碼是「TWN、USA、JPN、ITA和KOR」的城市資料,但是使用「IN (…)」來設定條件的話,看起來會簡潔不少:
在國家表格中,有一個儲存平均壽命的欄位「LifeExpectancy」,不過資料庫中的資料並無很完整,因此有一些國家是沒有這個資料的,因此會使用「NULL」值來表示:
若是想要查詢沒有平均壽命資料的國家,也就是平均壽命的欄位值是「NULL」,你可能會使用下列的敘述:
SELECT Name, LifeExpectancy FROM country WHERE LifeExpectancy = NULL
上列的敘述執行之後,並無傳回任何紀錄,這表示並無資料符合你設定的查詢條件。
因此「NULL」值的判斷,不可使用判斷通常資料的條件設定:
注:<=>
在判斷通常資料的時候,跟「=」徹底同樣;不過它用在判斷「NULL」資料的時候,效果跟「IS」同樣。
若是換成要查詢「有」平均壽命資料的國家,也就是平均壽命的欄位值不是「NULL」:
在使用字串資料的條件判斷時,會有一種很常見、也比較特殊的需求,像是「想要查詢名稱以w字元開始的城市」,若是你使用下列的查詢敘述:
SELECT Name FROM city WHERE Name = 'w'
這樣的查詢條件,固然不是「名稱以w字元開始的城市」,而是名稱只有一個「w」字元的城市。因此這類的查詢就會使用下列這個特殊的條件設定:
上列語法中,在「LIKE」後面的「樣版」字串中,會使用到下列兩種「樣版字元」:
因此要查詢「名稱以w字元開始的城市」的話:
參考上列的做法,就能夠延伸出其它的查詢條件設定了:
上列的查詢條件中,「w%」表示第一個字元是「w」就符合條件;「%w」表示最後一個字元是「w」就符合條件;最後一個「%w%」表示不論在什麼位置有「w」字元,都符合條件。
另一種樣版字元「_」表示一個任何字元:
把這些樣版中的底線換到後面的話:
你也能夠搭配兩種樣版字元完成條件的設定:
甚至像查詢「名稱是三十(包含)個字元以上的城市」:
注:其實完成上列的查詢條件的需求是不用這麼麻煩的,在後面的章節會討論比較簡單的方式。
在你執行任何一個查詢之後,MySQL傳回的資料是依照「天然」的順序排列的。所謂的天然順序,一般是資料新增到表格中的順序,但是在資料庫運做一段時間後,陸續會有各類不一樣的操做,因此這個「天然」順序對你來講,一般是沒什麼意義的。
通常的查詢一般會有資料排序上的需求,因此你會使用「ORDER BY」子句:
若是你但願在查詢城市資料的時候,資料庫會依照國家代碼幫你排序的話:
你也能夠指定資料排列的順序爲由大到小:
「ORDER BY」子句後面能夠依照需求指定多個排序的資料:
「ORDER BY」子句後面指定多個排序資料的時候,均可以依照需求,各自指定資料排列的方式:
「ORDER BY」子句指定的資料能夠是欄位名稱、編號、運算式或是欄位別名:
雖然比較不會有下列這樣的需求,不過你仍是能夠這樣做:
注:資料排列的順序在「第六章、字元集與資料庫」與「第七章、儲存引擎與資料型態」中進一步詳細的討論。
在你執行一個查詢敘述後,資料庫會將你查詢的資料傳回來給你;若是你使用「WHERE」子句設定查詢條件的話,資料庫就只會傳回符合條件的資料;除了上列的情況外,你也能夠另外使用「LIMIT」子句指定回傳紀錄的數量:
若是你在「LIMIT」子句後面指定一個數字:
「LIMIT」子句後面也能夠指定兩個數字:
在查詢敘述中,使用「ORDER BY」子句搭配「LIMIT」子句,就能夠完成下列查詢「排名」的工做:
注:若是出現相似「… LIMIT 1000000, 10」這樣的查詢敘述,雖然你只會獲得十筆資料,資料庫總共會查詢一百萬零一十筆資料,只不過資料庫會幫你跳過前一百萬筆;相似這樣的需求,仍是要使用「WHERE」子句先挑出想要的資料會比較好一些。
在一個查詢敘述執行之後,資料庫不會幫你檢查回傳的資料是否重複(回傳的兩筆紀錄資料徹底同樣),在「SELECT」子句後面可讓你設定「回傳的資料是否重複」:
沒有使用「ALL」或「DISTINCT」的效果,跟你本身加上「ALL」的查詢效果是同樣的,資料庫會依照你的查詢傳回全部的資料:
使用「DISTINCT」的話,資料庫會特別執行回傳紀錄是否重複的檢查:
via codedata