入门 | 使用 SQL 构建一个关系数据库比你想的更容易
導(dǎo)讀:使用 SQL 構(gòu)建數(shù)據(jù)庫比大多數(shù)人想象得要簡單。實際上,你甚至不需要成為一個有經(jīng)驗的程序員就可以使用 SQL 創(chuàng)建數(shù)據(jù)庫。在本文中,我將解釋如何使用 MySQL 5.6 來創(chuàng)建簡單的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDMS)。
在開始之前,我想順便感謝一下?SQL Fiddle,這是我用來運行腳本的工具。它提供了一個用于測試簡單腳本的有用的沙箱。
在本教程中,我將構(gòu)建一個使用如下實體關(guān)系圖(ERD)中顯示的簡單架構(gòu)的數(shù)據(jù)庫。數(shù)據(jù)庫列出了學(xué)生和正在學(xué)習(xí)的課程。為了保持簡單,我使用了兩個實體(即表),只有一種關(guān)系和依賴。這兩個實體稱為?dbo_students?和?dbo_courses。
數(shù)據(jù)庫的多樣性是一對多的,因為每門課程可以包含很多學(xué)生,但每個學(xué)生只能學(xué)習(xí)一門課程。
關(guān)于術(shù)語的快速說明:
一張表稱為一個實體。
一個字段稱為一個屬性。
一條記錄稱為一個元組。
用于構(gòu)建數(shù)據(jù)庫的腳本稱為架構(gòu)。
01 構(gòu)建架構(gòu)
要構(gòu)建數(shù)據(jù)庫,使用?CREATE TABLE <表名>?命令,然后定義每個字段的名稱和數(shù)據(jù)類型。數(shù)據(jù)庫使用?VARCHAR(n)?(字符串)和?INT(n)?(整數(shù)),其中?n?表示可以存儲的值的長度。例如?INT(2)?可以是?01。
這是用于創(chuàng)建兩個表的代碼:
CREATE?TABLE?dbo_students
(
? student_id?INT(2)?AUTO_INCREMENT?NOT?NULL,
? student_name?VARCHAR(50),
? course_studied?INT(2),
??PRIMARY?KEY?(student_id)
);
CREATE?TABLE?dbo_courses
(
? course_id?INT(2)?AUTO_INCREMENT?NOT?NULL,
? course_name?VARCHAR(30),
??PRIMARY?KEY?(course_id)
);
NOT NULL?意味著字段不能為空,AUTO_INCREMENT?意味著當(dāng)一個新的元組被添加時,ID 號將自動生成,是對先前存儲的 ID 號加 1,以強化各實體之間的完整參照性。?PRIMARY KEY?是每個表的惟一標識符屬性。這意味著每個元組都有自己的不同的標識。
02 關(guān)系作為一種約束
就目前來看,這兩張表格是獨立存在的,沒有任何聯(lián)系或關(guān)系。要連接它們,必須標識一個外鍵。在?dbo_students?中,外鍵是?course_studied,其來源在?dbo_courses中,意味著該字段被引用。SQL 中的特定命令為?CONSTRAINT,并且將使用另一個名為?ALTER TABLE?的命令添加這種關(guān)系,這樣即使在架構(gòu)構(gòu)建完畢后,也可以編輯表。
以下代碼將關(guān)系添加到數(shù)據(jù)庫構(gòu)造腳本中:
ALTER?TABLE?dbo_students
ADD?CONSTRAINT?FK_course_studied
FOREIGN?KEY?(course_studied)?REFERENCES?dbo_courses(course_id);
使用?CONSTRAINT?命令實際上并不是必要的,但這是一個好習(xí)慣,因為它意味著約束可以被命名并且使維護更容易。現(xiàn)在數(shù)據(jù)庫已經(jīng)完成了,是時候添加一些數(shù)據(jù)了。
03 將數(shù)據(jù)添加到數(shù)據(jù)庫
INSERT INTO <表名>?是用于直接選擇要添加哪些屬性(即字段)數(shù)據(jù)的命令。首先聲明實體名稱,然后聲明屬性,下邊是添加到實體的數(shù)據(jù),從而創(chuàng)建一個元組。如果指定了?NOT NULL,這表示該屬性不能留空。以下代碼將展示如何向表中添加記錄:
INSERT?INTO?dbo_courses(course_id,course_name)
VALUES(001,'Software Engineering');
INSERT?INTO?dbo_courses(course_id,course_name)
VALUES(002,'Computer Science');
INSERT?INTO?dbo_courses(course_id,course_name)
VALUES(003,'Computing');
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(001,'student1',001);
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(002,'student2',002);
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(003,'student3',002);
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(004,'student4',003);
現(xiàn)在數(shù)據(jù)庫架構(gòu)已經(jīng)完成并添加了數(shù)據(jù),現(xiàn)在是時候在數(shù)據(jù)庫上運行查詢了。
04 查詢
查詢遵循使用以下命令的集合結(jié)構(gòu):
SELECT?<attributes>
FROM?<entity>
WHERE?<condition>
要顯示?dbo_courses?實體內(nèi)的所有記錄并顯示課程代碼和課程名稱,請使用?*?。這是一個通配符,它消除了鍵入所有屬性名稱的需要。(在生產(chǎn)數(shù)據(jù)庫中不建議使用它。)此處查詢的代碼是:
SELECT?*
FROM?dbo_courses
此處查詢的輸出顯示表中的所有元組,因此可顯示所有可用課程:
|?course_id?|?? ? ? ? ?course_name?|
|-----------|----------------------|
|?? ? ? ??1?|?Software Engineering?|
|?? ? ? ??2?|?? ? Computer Science?|
|?? ? ? ??3?|?? ? ? ? ? ?Computing?|
在后面的文章中,我將使用三種類型的連接之一來解釋更復(fù)雜的查詢:內(nèi)連接、外連接和交叉連接。
這是完整的腳本:
CREATE?TABLE?dbo_students
(
? student_id?INT(2)?AUTO_INCREMENT?NOT?NULL,
? student_name?VARCHAR(50),
? course_studied?INT(2),
??PRIMARY?KEY?(student_id)
);
CREATE?TABLE?dbo_courses
(
? course_id?INT(2)?AUTO_INCREMENT?NOT?NULL,
? course_name?VARCHAR(30),
??PRIMARY?KEY?(course_id)
);
ALTER?TABLE?dbo_students
ADD?CONSTRAINT?FK_course_studied
FOREIGN?KEY?(course_studied)?REFERENCES?dbo_courses(course_id);
INSERT?INTO?dbo_courses(course_id,course_name)
VALUES(001,'Software Engineering');
INSERT?INTO?dbo_courses(course_id,course_name)
VALUES(002,'Computer Science');
INSERT?INTO?dbo_courses(course_id,course_name)
VALUES(003,'Computing');
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(001,'student1',001);
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(002,'student2',002);
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(003,'student3',002);
INSERT?INTO?dbo_students(student_id,student_name,course_studied)
VALUES(004,'student4',003);
SELECT?*
FROM?dbo_courses
05 學(xué)習(xí)更多
SQL 并不困難;我認為它比編程簡單,并且該語言對于不同的數(shù)據(jù)庫系統(tǒng)是通用的。 請注意,實體關(guān)系圖中?dbo.<實體>?(LCTT 譯注:文章中使用的是?dbo_<實體>)不是必需的實體命名約定;我之所以使用,僅僅是因為它是 Microsoft SQL Server 中的標準。
如果你想了解更多,在網(wǎng)絡(luò)上這方面的最佳指南是?W3Schools.com?中對所有數(shù)據(jù)庫平臺的 SQL 綜合指南。請隨意使用我的數(shù)據(jù)庫。
作者:Aaron Cocker
譯者:MjSeven
來源:Linux中國(ID:linux-cn)
原文:https://opensource.com/article/18/2/getting-started-sql
推薦閱讀
日本老爺爺堅持17年用Excel作畫,我可能用了假的Excel···
看完此文再不懂區(qū)塊鏈算我輸:手把手教你用Python從零開始創(chuàng)建區(qū)塊鏈
為什么要學(xué)數(shù)學(xué)?因為這是一場戰(zhàn)略性的投資
180頁PPT,講解人工智能技術(shù)與產(chǎn)業(yè)發(fā)展
Q:?SQL你玩得666嗎?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉(zhuǎn)載 / 投稿請聯(lián)系:baiyu@hzbook.com
更多精彩文章,請在公眾號后臺點擊“歷史文章”查看
總結(jié)
以上是生活随笔為你收集整理的入门 | 使用 SQL 构建一个关系数据库比你想的更容易的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北上广年终奖地图
- 下一篇: STM32之RCC原理