練習(xí) 40:SQL 讀取
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
在 CRUD 矩陣中,你只知道“創(chuàng)建”。你可以創(chuàng)建表,你可以在這些表中創(chuàng)建行?,F(xiàn)在我將告訴你如何“讀取”,或者在 SQL 中是SELECT:
SELECT * FROM person;
SELECT name, age FROM pet;
SELECT name, age FROM pet WHERE dead = 0;
SELECT * FROM person WHERE first_name != "Zed";
這里是每一行做的事情:
ex5.sql:1
這表示“從person中選擇所有列并返回所有行”。SELECT的格式是SELECT what FROM tables(s) WHERE (tests),WHERE子句是可選的。*(星號)字符是你想要的所有列。
ex5.sql:3
這里我只要從pet表請求兩列,name和age。它將返回所有行。
ex5.sql:5
現(xiàn)在我正在從pet尋找相同的列,但是我只請求dead = 0的行。這會給我所有的活著的寵物。
ex5.sql:7
最后,我從person選擇所有列,就像在第一行,但我現(xiàn)在指明,它們不等于"Zed"。WHERE子句決定哪一行返回,哪一行不返回。
選擇多表
希望你現(xiàn)在專注于選擇數(shù)據(jù)。永遠記住這一點:SQL 只知道表。SQL 喜歡表。SQL 僅返回表。表,表,表,表! 我以這種非常瘋狂的方式重復(fù)一遍,以便你將開始意識到,你在編程中知道的東西不會有幫助。你在編程中處理圖,在 SQL 中處理表。他們是相關(guān)的概念,但心智模型是不同的。
這里是一個例子,它們哪里不一樣。假設(shè)你想知道 Zed 擁有什么寵物。你需要寫一個SELECT,在person中查找,然后“以某種方式”找到我的寵物。為此,你必須查詢person_pet表來獲取所需的id列。以下是我的做事方式:
SELECT pet.id, pet.name, pet.age, pet.dead
FROM pet, person_pet, person
WHERE
pet.id = person_pet.pet_id AND
person_pet.person_id = person.id AND
person.first_name = "Zed";
現(xiàn)在它看起來很龐大,但我會把它拆解,所以你可以看到,他只是簡單構(gòu)造新的表,基于三個表中的數(shù)據(jù),和WHERE子句。
ex6.sql:1
我僅僅想要pet中的一些列,所以我在選擇中指定它們。在上一個練習(xí)中,你使用*來表示“每一列”,但它在這里是一個壞主意。相反,你想要明確地指定你想要的每個表中的哪個列,你可以使用table.column實現(xiàn)它,就像pet.name。
ex6.sql:2
為了將pet連接到person,我需要遍歷person_pet關(guān)系表。在 SQL 中,這意味著我需要在FROM之后列出所有三個表。
ex6.sql:3
WHERE子句的開始。
ex6.sql:4
首先,我將pet連接到person_pet,通過相關(guān) ID 列pet.id和person_pet.id。
ex6.sql:5
并且我需要以相同的方式,將人person連接到person_pet?,F(xiàn)在,數(shù)據(jù)庫可以僅僅搜索 id 列全部匹配的行,這些就是連接的行。
ex6.sql:6
我最后僅僅請求自己擁有的寵物,通過為我的名稱添加person.first_name測試。
挑戰(zhàn)練習(xí)
- 寫一個查詢,查找所有超過 10 年的寵物。
- 寫一個查詢,查找所有比你年輕的人。然后查找比你年長的人。
- 編寫一個查詢,
WHERE子句中使用多于一個測試,使用AND來編寫它。例如WHERE first_name = "Zed" AND age > 30。 - 執(zhí)行另一個查詢,使用三個條件,并使用
AND和OR運算符來搜索行。 - 如果你已經(jīng)知道像 Python 或 Ruby 這樣的語言,這可能是一個查看數(shù)據(jù)的令人驚奇的方式。花時間使用類和對象來構(gòu)建相同的關(guān)系,然后將其映射到此配置。
- 執(zhí)行一個查詢,查找你到目前為止添加的寵物。
- 更改查詢來使用你的
person.id而不是person.name,像我一樣。 - 瀏覽運行的輸出,并確保你知道哪些 SQL 命令生成了哪個表,以及如何生成該輸出。
深入學(xué)習(xí)
通過閱讀SELECT命令的文檔,繼續(xù)深入了解 SQLite3,同時閱讀EXPLAIN QUERY PLAN功能的文檔。如果你不知道為什么 SQLite3 做了一些事情,EXPLAIN是你的答案。