跳轉到內容

資料庫基礎:SELECT

來自華夏公益教科書,開放的書籍,面向開放的世界

試卷 2 - ⇑ 資料庫基礎 ⇑

← 結構化查詢語言 (SQL) SELECT UPDATE →


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 語句

使用罪犯資料集,編寫 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
  • Id1 < 123
<> 檢查它是否不等於 Id1 <> 123
>=<= 類似於“><”,但也檢查是否相等
  • 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
華夏公益教科書