笨辦法學 Python · 續 練習 39:SQL 建立

weixin_34189116發表於2017-08-14

練習 39:SQL 建立

原文:Exercise 39: Creating with SQL

譯者:飛龍

協議:CC BY-NC-SA 4.0

自豪地採用谷歌翻譯

當我們談論首字母縮寫“CRUD”時,“C”代表“建立”,它不僅僅意味著建立表。這也意味著將資料插入到表中,並使用表和插入來連結表。由於我們需要一些表和一些資料來完成其餘的 CRUD(增刪改查),我們開始學習如何在 SQL 中執行最基本的建立操作。

表的建立

我在簡介中說,可以對錶內的資料執行“增刪改查”操作。你如何把表放在首要位置?通過對資料庫綱要(Schema)執行 CRUD ,第一個要學習的 SQL 語句是CREATE

CREATE TABLE person (
    id INTEGER PRIMARY KEY,
    first_name TEXT,
    last_name TEXT,
    age INTEGER
);

你可以將其放在一行中,但是我打算討論每一行,所以寫成了多行。這裡是每行所做的事情:

ex1.sql:1

CREATE TABLE的起始,它提供了表的名稱person。這個部分之後,之後將你想要的欄位放到括號裡。

ex1.sql:2

id列,它用於準確確定每一行。列的格式是NAME TYPE,並且這裡我假設,我需要一個INTEGER也是PRIMARY KEY。這樣做告訴 SQLite3 來將其特殊對待。

ex1.sql:3~4

first_namelast_name列。它們都是TEXT

ex1.sql:5

age列,只是一個INTEGER

ex1.sql:6

使用圓括號結束列的列表,之後是一個分號(;)。

建立多表的資料庫

建立一個表不是特別實用。我希望你現在建立三個表,你可以在裡面儲存資料。

CREATE TABLE person (
    id INTEGER PRIMARY KEY,
    first_name TEXT,
    last_name TEXT,
    age INTEGER
);

CREATE TABLE pet (
    id INTEGER PRIMARY KEY,
    name TEXT,
    breed TEXT,
    age INTEGER,
    dead INTEGER
);

CREATE TABLE person_pet (
    person_id INTEGER,
    pet_id INTEGER
);

在此檔案中,你正在為兩種資料型別製作表,然後將它們與第三個表“連結”在一起。人們稱這些“連結”表為“關係”,但沒有生命的非常愚蠢的人把所有表都成為“關係”,並且熱衷於使那些想要完成工作的人困惑。在我的書中,具有資料的表是“表”,將表連線在一起的表稱為“關係”。

這裡沒有任何新東西,除非你看到person_pet,你會看到我已經寫了兩列:person_idpet_id。將兩個錶連結在一起,只是向person_pet插入一行。它擁有兩行的 ID 列的值,你想要連結它們。例如,如果person包含一行id=20,pet有一行id=98,然後假設這個人擁有這個寵物,你會將person_id=20, pet_id=98插入到person_pet關係(表)中。

在接下來的幾個練習中,我們將實際插入這樣的資料。

插入資料

你有了要處理的幾個表,所以現在我讓你使用INSERT命令,放進去一些資料:

INSERT INTO person (id, first_name, last_name, age)
    VALUES (0, "Zed", "Shaw", 37);

INSERT INTO pet (id, name, breed, age, dead)
    VALUES (0, "Fluffy", "Unicorn", 1000, 0);

INSERT INTO pet VALUES (1, "Gigantor", "Robot", 1, 1);

在這個檔案中,我使用兩種不同形式的INSERT命令。第一種形式是更明確的風格,最有可能是你應該使用的東西。它指定要插入的列,後跟VALUES,然後要包括的資料。這兩個列表(列名和值)都在括號內,並以逗號分隔。

第七行的第二個版本是一個縮寫版本,它不指定列,而是依賴於表中的隱式順序。這種形式是危險的,因為你不知道你的語句實際訪問哪一列,並且某些資料庫對列沒有可靠的排序。當你真的很懶惰時,最好只用這種形式。

插入引用資料

在最後一節,你會在表中放滿人和寵物。唯一缺少的東西是,誰擁有什麼寵物,這個資料存入person_pet表,如下所示:

INSERT INTO person_pet (person_id, pet_id) VALUES (0, 0);
INSERT INTO person_pet VALUES (0, 1);

我再次使用顯式格式,然後使用隱式格式。我使用我想要的person表的行id(這裡是0),和我想要的pet表的行id(同樣,0是獨角獸,1是死去的機器人)。然後,我們向person_pet關係表中插入一行,用於人與寵物之間的每個“連線”。

挑戰練習

  • 建立另一個資料庫,但為其它東西建立其他INTEGERTEXT欄位,person可能擁有它們。
  • 在這些表中,我建立了第三個關係表來連結它們。你如何擺脫這個關係表person_pet,並將這些資訊優雅放在person裡面?這個變化暗示了什麼?
  • 如果你可以把一行放入person_pet,你是否可以放多行?你如何記錄一個瘋狂的貓女士與 50 只貓?
  • 為人們可能擁有的汽車建立另一個表,並建立其對應的關係表。
  • 在你喜歡的搜尋引擎中搜尋“sqlite3 資料型別”,然後閱讀 SQLite3 文件中的資料型別。記錄你可以使用什麼型別,以及其他看起來很重要的東西。我們稍後會介紹。
  • 插入你自己和你的寵物(或像我這樣的虛擬寵物)。
  • 如果將上一個練習中的資料庫更改為沒有person_pet表,則使用該模式建立一個新資料庫,並將相同的資訊插入到該資料庫中。
  • 回顧資料型別列表,並記錄不同型別所需的格式。例如,請注意你有多少種方式來寫入TEXT資料。
  • 為你和你的寵物新增關係。
  • 使用這張表,一隻寵物可以被多於一個人擁有嗎?這在邏輯上是可能的嗎?家養的狗如何呢?嚴格來說,家庭中的每個人不是擁有它嗎?
  • 考慮上面的東西,並且考慮到你有一個替代設計,將pet_id放在pearon表中,哪種設計更適合這種情況?

深入學習

請閱讀 SQLite3 CREATE命令的文件,然後檢視盡可能多的其他CREATE語句。你還應該閱讀 https://sqlite.org/lang_insert.html 上的INSERT文件,這應該會引導你閱讀許多其他頁面。

相關文章