笨辦法學 Python · 續 練習 39:SQL 建立
練習 39:SQL 建立
譯者:飛龍
自豪地採用谷歌翻譯
當我們談論首字母縮寫“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_name
和last_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_id
和pet_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
關係表中插入一行,用於人與寵物之間的每個“連線”。
挑戰練習
- 建立另一個資料庫,但為其它東西建立其他
INTEGER
和TEXT
欄位,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
文件,這應該會引導你閱讀許多其他頁面。
相關文章
- 笨辦法學C 練習2:用Make來代替PythonPython
- 笨辦法學Python習題48Python
- 笨辦法學python習題43Python
- 笨辦法學C 練習28:Makefile 進階
- 笨辦法學C 練習13:Switch語句
- 笨辦法學C 練習25:變參函式函式
- 笨辦法學C 練習34:動態陣列陣列
- 笨辦法學C 練習42:棧和佇列佇列
- 笨辦法學C 練習29:庫和連結
- 笨辦法學C 練習18:函式指標函式指標
- 笨辦法學C 練習36:更安全的字串字串
- 笨辦法學C 練習8:大小和陣列陣列
- 笨辦法學C 練習38:雜湊演算法演算法
- 笨辦法學C 練習1:啟用編譯器編譯
- 笨辦法學C 練習24:輸入輸出和檔案
- 笨辦法學前端前端
- assert語句,python, 笨辦法學pythonPython
- 笨辦法學C 練習17:堆和棧的記憶體分配記憶體
- 笨辦法學C 練習7:更多變數和一些算術變數
- 《笨辦法學Python》 第33課手記Python
- 笨辦法學C 練習45:一個簡單的TCP/IP客戶端TCP客戶端
- 笨辦法學 Golang 開山篇Golang
- 笨辦法學Python – 習題8-10: Printing & Printing, PrintingPython
- 每週一書:162頁《笨辦法學 Python》分享!Python
- 笨辦法學前端之圖片上傳前端
- 《笨方法學python3》習題46.2 建立骨架專案目錄Python
- Learn Linux The Hard Way/笨辦法學LinuxLinux
- 笨方法學python加分習題18Python
- 笨方法學python加分習題19Python
- 《“笨辦法”學Python(第3版)》點評贈書獲獎名單Python
- [人郵贈書]《“笨辦法”學Python(第3版)》點評贈書Python
- 前端除錯告別笨辦法前端除錯
- 笨方法學Python3 習題3Python
- 求推薦,有沒有類似《笨辦法學 python》的書用來學 Java 的?PythonJava
- ex0-python環境搭建 -powershell建立目錄 [笨方法學python]Python
- python, del[] 用法, 笨方法學pythonPython
- sql 練習SQL
- Java學習之基礎語法練習Java