資料庫基礎:SELECT
SELECT 語句允許你向資料庫提出一個問題(查詢它),並指定它返回什麼資料。我們可能想問一些類似於“告訴我所有罪犯的姓名和年齡”的問題。當然,這不會起作用,所以我們需要用計算機可以理解的語言來表達:結構化查詢語言,簡稱 SQL
SELECT name, DoB --what to return
FROM crooks --where are you returning it from
這將返回以下內容
| 姓名 | 出生日期 |
|---|---|
| Geoff | 12/05/1982 |
| Jane | 05/08/1956 |
| Keith | 07/02/1999 |
| Oliver | 22/08/1976 |
| Kelly | 11/11/1911 |
| Marea | 14/07/1940 |
但假設我們想要篩選這些結果,例如:“告訴我所有來自 Snape 的男性罪犯的 ID、姓名和年齡”。我們需要使用另一個語句,即 WHERE 子句,它允許我們為查詢提供一些標準(或選項)
SELECT ID, name, DoB
FROM crooks
WHERE town = 'Snape' AND gender = 'male' --Criteria
這將返回以下內容
| ID | 姓名 | 出生日期 |
|---|---|---|
| 3 | Keith | 07/02/1999 |
假設警方知道有一名傷痕累累的女性(4 個以上傷痕)犯了罪,他們想要一份所有有傷痕的女性的名單
SELECT name, town, scars
FROM crooks
WHERE numScars >= 4 AND gender = 'female' --Criteria
這將返回
| 姓名 | 城鎮 | 傷痕數量 |
|---|---|---|
| Kelly | 東漢姆 | 10 |
| Marea | 懷森肖 | 6 |
但是,警方想要快速地篩選並檢視誰的傷痕最重。我們將使用一個 **ORDER** 命令
SELECT name, town
FROM crooks
WHERE numScars >= 4 AND gender = 'female' --Criteria
ORDER BY numScars DESC --sorts the numScars values in big to small order
ORDER BY numScars 將你的返回資料排序為 **DESC** 降序(大到小)或 **ASC** 升序(小到大)
| 擴充套件 | ||||||||||||||
|
警告:在考試中,他們可能會要求你返回特定的欄位,因此使用 *(萬用字元)會扣分! 有時你想要返回有關記錄的所有詳細資訊,如果你必須列出它們,這有點麻煩 SELECT name, DoB, gender, town ....
相反,我們可以使用 ** * ** 。這意味著返回所選記錄的所有欄位 SELECT * --return all fields from crooks
FROM crooks
WHERE name = 'Jane'
這將返回 |
| |||||||||||||
|
練習:SELECT 語句 使用罪犯資料集,編寫 SQL 查詢以查詢 1993 年之前出生的女性的姓名和地址 答案 SELECT name, town
FROM crooks
WHERE DoB < 1993 AND gender = 'female'
使用上述資料集,編寫一個查詢以查詢所有名為 Noel 的人的城鎮和性別 答案 SELECT town, gender FROM crooks --you don't have to have a separate line for each SQL statement
WHERE name = 'Noel'
警方非常確定罪犯要麼是女性 **OR** 來自紐卡斯爾的人。找到他們的姓名和出生日期 答案 SELECT name, DoB FROM crooks
WHERE gender = 'female' OR town = 'Newcastle'
你可以透過組合 AND 和 OR 來構建更復雜的 SQL WHERE 語句。也許警方應該說罪犯要麼是女性,**OR** 是男性 **AND** 來自紐卡斯爾。 SELECT name, DoB FROM crooks
WHERE gender = 'female' OR (gender = 'male' AND town = 'Newcastle')
使用上述資料集,編寫一個查詢以查詢罪犯的年齡,從最年輕到最年長 答案 SELECT name, town, DoB FROM crooks
ORDER BY DoB DESC
|
INNER JOIN
[edit | edit source]我們之前談到資料庫之所以很棒是因為它們允許你將錶鏈接在一起並對連結資料執行復雜的搜尋。到目前為止,我們只關注搜尋一個表。
當你使用 Facebook 這樣的社交網路時,你經常可以在側邊欄看到所有朋友的列表,以及你的記錄中的詳細資訊,例如你的姓名和工作地點。他們是如何找到這些資料的?他們會搜尋所有包含你的 ID 的關係,返回參與的人員的姓名,並從你的個人記錄中返回諸如職稱之類的值。這看起來像是在使用兩個查詢:--返回關係資訊—返回個人記錄資訊 這樣做是可能的,但使用一個查詢來完成這兩件事要容易得多。
看看這個例子。警方想要知道一名罪犯(ID = 45)的姓名和城鎮,以及他們所犯的所有罪行的描述
SELECT name, town, description --select things to return (from different tables)
FROM crooks, crime --name tables that data comes from
WHERE crook.Id = crime.crimId --specify the link dot.notation means table.field. The Ids are the same
AND crook.Id = 45 --specify which crook you are looking at
ORDER BY date ASC --order the results by the oldest first
WHERE 子句中使用的運算子
[edit | edit source]| 運算子 | 運算子的含義 | 示例 |
|---|---|---|
| = | 檢查它們是否等效 | Id1 = 123 |
| > 和 < | 檢查一個欄位是否大於或小於 |
|
| <> | 檢查它是否不等於 | Id1 <> 123 |
| >= 和 <= | 類似於“> 和 <”,但也檢查是否相等 |
|
| OR | 如果左邊、右邊或兩者都為真,則將被接受 | Id1 = 123 OR Id2 <> 444 |
| AND | 只有當左邊部分和右邊部分都為真時,才會被接受 | Id1 = 123 AND Id2 <> 444 |
| NOT | 反轉語句的布林值 | NOT Id1 = 123 |
| IS NULL | 檢查變數中是否包含一個空值 | Id1 IS NULL |
| ... BETWEEN ... AND ... | 檢查某事物是否在某個範圍內 | Id1 BETWEEN 2.8 AND 3.14159265 |