笨辦法學(xué) Python · 續(xù) 練習(xí) 40:SQL 讀取

練習(xí) 40:SQL 讀取

原文:Exercise 40: Reading with 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表請求兩列,nameage。它將返回所有行。

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.idperson_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í)行另一個查詢,使用三個條件,并使用ANDOR運算符來搜索行。
  • 如果你已經(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是你的答案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容