SQL入門(mén):使用SQL構(gòu)建一個(gè)關(guān)系數(shù)據(jù)庫(kù)
使用 SQL 構(gòu)建一個(gè)關(guān)系數(shù)據(jù)庫(kù)比你想的更容易。
使用 SQL 構(gòu)建數(shù)據(jù)庫(kù)比大多數(shù)人想象得要簡(jiǎn)單。實(shí)際上,你甚至不需要成為一個(gè)有經(jīng)驗(yàn)的程序員就可以使用 SQL 創(chuàng)建數(shù)據(jù)庫(kù)。在本文中,我將解釋如何使用 MySQL 5.6 來(lái)創(chuàng)建簡(jiǎn)單的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDMS)。在開(kāi)始之前,我想順便感謝一下 SQL Fiddle,這是我用來(lái)運(yùn)行腳本的工具。它提供了一個(gè)用于測(cè)試簡(jiǎn)單腳本的有用的沙箱。
在本教程中,我將構(gòu)建一個(gè)使用如下實(shí)體關(guān)系圖(ERD)中顯示的簡(jiǎn)單架構(gòu)的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)列出了學(xué)生和正在學(xué)習(xí)的課程。為了保持簡(jiǎn)單,我使用了兩個(gè)實(shí)體(即表),只有一種關(guān)系和依賴。這兩個(gè)實(shí)體稱為 dbo_students 和 dbo_courses。

數(shù)據(jù)庫(kù)的多樣性是一對(duì)多的,因?yàn)槊块T(mén)課程可以包含很多學(xué)生,但每個(gè)學(xué)生只能學(xué)習(xí)一門(mén)課程。
關(guān)于術(shù)語(yǔ)的快速說(shuō)明:
- 一張表稱為一個(gè)實(shí)體。
- 一個(gè)字段稱為一個(gè)屬性。
- 一條記錄稱為一個(gè)元組。
- 用于構(gòu)建數(shù)據(jù)庫(kù)的腳本稱為架構(gòu)。
構(gòu)建架構(gòu)
要構(gòu)建數(shù)據(jù)庫(kù),使用 CREATE TABLE <表名> 命令,然后定義每個(gè)字段的名稱和數(shù)據(jù)類(lèi)型。數(shù)據(jù)庫(kù)使用 VARCHAR(n) (字符串)和 INT(n) (整數(shù)),其中 n 表示可以存儲(chǔ)的值的長(zhǎng)度。例如 INT(2) 可以是 01。
這是用于創(chuàng)建兩個(gè)表的代碼:
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)一個(gè)新的元組被添加時(shí),ID 號(hào)將自動(dòng)生成,是對(duì)先前存儲(chǔ)的 ID 號(hào)加 1,以強(qiáng)化各實(shí)體之間的完整參照性。 PRIMARY KEY 是每個(gè)表的惟一標(biāo)識(shí)符屬性。這意味著每個(gè)元組都有自己的不同的標(biāo)識(shí)。
關(guān)系作為一種約束
就目前來(lái)看,這兩張表格是獨(dú)立存在的,沒(méi)有任何聯(lián)系或關(guān)系。要連接它們,必須標(biāo)識(shí)一個(gè)外鍵。在 dbo_students 中,外鍵是 course_studied,其來(lái)源在 dbo_courses 中,意味著該字段被引用。SQL 中的特定命令為 CONSTRAINT,并且將使用另一個(gè)名為 ALTER TABLE 的命令添加這種關(guān)系,這樣即使在架構(gòu)構(gòu)建完畢后,也可以編輯表。
以下代碼將關(guān)系添加到數(shù)據(jù)庫(kù)構(gòu)造腳本中:
ALTER TABLE dbo_studentsADD CONSTRAINT FK_course_studiedFOREIGN KEY (course_studied) REFERENCES dbo_courses(course_id);
使用 CONSTRAINT 命令實(shí)際上并不是必要的,但這是一個(gè)好習(xí)慣,因?yàn)樗馕吨s束可以被命名并且使維護(hù)更容易?,F(xiàn)在數(shù)據(jù)庫(kù)已經(jīng)完成了,是時(shí)候添加一些數(shù)據(jù)了。
將數(shù)據(jù)添加到數(shù)據(jù)庫(kù)
INSERT INTO <表名> 是用于直接選擇要添加哪些屬性(即字段)數(shù)據(jù)的命令。首先聲明實(shí)體名稱,然后聲明屬性,下邊是添加到實(shí)體的數(shù)據(jù),從而創(chuàng)建一個(gè)元組。如果指定了 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ù)庫(kù)架構(gòu)已經(jīng)完成并添加了數(shù)據(jù),現(xiàn)在是時(shí)候在數(shù)據(jù)庫(kù)上運(yùn)行查詢了。
查詢
查詢遵循使用以下命令的集合結(jié)構(gòu):
SELECT <attributes>FROM <entity>WHERE <condition>
要顯示 dbo_courses 實(shí)體內(nèi)的所有記錄并顯示課程代碼和課程名稱,請(qǐng)使用 * 。 這是一個(gè)通配符,它消除了鍵入所有屬性名稱的需要。(在生產(chǎn)數(shù)據(jù)庫(kù)中不建議使用它。)此處查詢的代碼是:
SELECT *FROM dbo_courses
此處查詢的輸出顯示表中的所有元組,因此可顯示所有可用課程:
| course_id | course_name ||-----------|----------------------|| 1 | Software Engineering || 2 | Computer Science || 3 | Computing |
在后面的文章中,我將使用三種類(lèi)型的連接之一來(lái)解釋更復(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_studentsADD CONSTRAINT FK_course_studiedFOREIGN 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
學(xué)習(xí)更多
SQL 并不困難;我認(rèn)為它比編程簡(jiǎn)單,并且該語(yǔ)言對(duì)于不同的數(shù)據(jù)庫(kù)系統(tǒng)是通用的。 請(qǐng)注意,實(shí)體關(guān)系圖中 dbo.<實(shí)體> (LCTT 譯注:文章中使用的是 dbo_<實(shí)體>)不是必需的實(shí)體命名約定;我之所以使用,僅僅是因?yàn)樗?Microsoft SQL Server 中的標(biāo)準(zhǔn)。
























