《SQL必知必會》筆記1-樣例表說明及建表語句

該筆記整理自Ben Forta著,鐘鳴、劉曉霞譯,人民郵電出版社出版的《SQL必知必會》第4版,具體內容有部分省略。

關于存儲過程的部分內容,結合了《SQL必知必會》和《MySQL必知必會》。

代碼測試環境:Win7-64bit、MySQL 5.7、MySQL Workbench 6.3。


1 樣例表解釋說明

書中所用的表是一個玩具經銷商使用的訂單錄入系統的組成部分,包括:

  1. 管理供應商Vendors。
  2. 管理產品目錄Products。
  3. 管理顧客列表Customers。
  4. 錄入顧客訂單Orders、OrderItems。

具體的創建表、更改表以及插入數據的內容,可參考《SQL必知必會》筆記8-建表create、插入insert、更新update、刪除delete:http://www.lxweimin.com/p/2e840d679193


1.1 供應商Vendors表

Vendors表存儲銷售產品的供應商信息,每個供應商在表中都有一個記錄,供應商ID列(vend_id)作為主鍵,用于進行產品與供應商的匹配。

說明
vend_id 唯一的供應商ID
vend_name 供應商的名字
vend_address 供應商的地址
vend_city 供應商所在的城市
vend_state 供應商所在州
vend_zip 供應商地址的郵政編碼
vend_country 供應商所在國家

1.2 產品目錄Products表

Products表每行代表一個產品,每個產品有唯一的ID(prod_id),并作為表的主鍵。借助vend_id(供應商唯一ID)這一外鍵,與供應商Vendors表的vend_id相關聯。

說明
prod_id 唯一的產品ID
vend_id 產品供應商ID(關聯到Vendors表的vend_id)
prod_name 產品名
prod_price 產品價格
prod_desc 產品描述

1.3 顧客信息Customers表

Customers表存儲所有顧客信息,每個顧客有唯一的ID(cust_id),并作為表的主鍵。

說明
cust_id 唯一的顧客ID
cust_name 顧客名
cust_address 顧客的地址
cust_city 顧客所在城市
cust_state 顧客所在州
cust_zip 顧客地址郵政編碼
cust_country 顧客所在國家
cust_contact 顧客的聯系名
cust_email 顧客的電子郵件地址

1.4 訂單Orders表

Orders表存儲顧客訂單(不是訂單細節),每個訂單有唯一編號(order_num),并作為表的主鍵。借助cust_id(顧客唯一ID)這一外鍵,與顧客信息Customers表的cust_id相關聯。

說明
order_num 唯一的訂單號
order_state 訂單日期
cust_id 訂單顧客ID(關聯到Customers表的cust_id)

1.5 訂單明細OrderItems表

OrderItems表存儲每個訂單中的實際產品,每個訂單的每個產品一行。對于Orders表的每一行,在OrderItems表中有一行或者多行,也就是一個顧客可以買多件產品。每個訂單產品由訂單號和訂單產品唯一標識,也就是聯合主鍵。訂單產品order_num列作為外鍵,與Orders表的order_num相關聯,此外,產品唯一ID(prod_id)與Products表的prod_id相關聯。

說明
order_num 訂單號(關聯到Orders表的order_num)
order_item 訂單產品號(訂單內的順序)
prod_id 產品ID(關聯到Products表的prod_id)
quantity 物品數量
item_price 物品價格

2 創建相關表

2.1 創建供應商Vendors表

CREATE TABLE Vendors
(
  vend_id       char(10)   NOT NULL ,
  vend_name     char(50)   NOT NULL ,
  vend_address  char(50)   NULL ,
  vend_city     char(50)   NULL ,
  vend_state    char(5)    NULL ,
  vend_zip      char(10)   NULL ,
  vend_country  char(50)   NULL 
);

2.2 創建產品目錄Products表

CREATE TABLE Products
(
  prod_id      char(10)       NOT NULL ,
  vend_id      char(10)       NOT NULL ,
  prod_name    char(255)      NOT NULL ,
  prod_price   decimal(8,2)   NOT NULL ,
  prod_desc    text           NULL 
);

2.3 創建顧客信息Products表

CREATE TABLE Customers
(
  cust_id        char(10)    NOT NULL ,
  cust_name      char(50)    NOT NULL ,
  cust_address   char(50)    NULL ,
  cust_city      char(50)    NULL ,
  cust_state     char(5)     NULL ,
  cust_zip       char(10)    NULL ,
  cust_country   char(50)    NULL ,
  cust_contact   char(50)    NULL ,
  cust_email     char(255)   NULL 
);

2.4 創建訂單Orders表

CREATE TABLE Orders
(
  order_num   int        NOT NULL ,
  order_date  datetime   NOT NULL ,
  cust_id     char(10)   NOT NULL 
);

2.5 創建訂單明細OrderItems表

CREATE TABLE OrderItems
(
  order_num   int           NOT NULL ,
  order_item  int           NOT NULL ,
  prod_id     char(10)      NOT NULL ,
  quantity    int           NOT NULL ,
  item_price  decimal(8,2)  NOT NULL 
);

3 添加主外鍵約束

3.1 添加主鍵約束

ALTER TABLE Vendors ADD PRIMARY KEY (vend_id);
ALTER TABLE Products ADD PRIMARY KEY (prod_id);
ALTER TABLE Customers ADD PRIMARY KEY (cust_id);
ALTER TABLE Orders ADD PRIMARY KEY (order_num);
ALTER TABLE OrderItems ADD PRIMARY KEY (order_num, order_item);

3.2 添加外鍵約束

ALTER TABLE Products ADD CONSTRAINT FK_Products_Vendors FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id);
ALTER TABLE Orders ADD CONSTRAINT FK_Orders_Customers FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);
ALTER TABLE OrderItems ADD CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES Orders (order_num);
ALTER TABLE OrderItems ADD CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES Products (prod_id);

4 插入表數據

4.1 向供應商Vendors表中插入數據

INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES('BRS01','Bears R Us','123 Main Street','Bear Town','MI','44444', 'USA');

INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) 
VALUES('BRE02','Bear Emporium','500 Park Street','Anytown','OH','44333', 'USA');

INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) 
VALUES('DLL01','Doll House Inc.','555 High Street','Dollsville','CA','99999', 'USA');

INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) 
VALUES('FRB01','Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');

INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) 
VALUES('FNG01','Fun and Games','42 Galaxy Road','London', NULL,'N16 6PS', 'England');

INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country) 
VALUES('JTS01','Jouets et ours','1 Rue Amusement','Paris', NULL,'45678', 'France');

4.2 向產品目錄Products表中插入數據

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BR01', 'BRS01', '8 inch teddy bear', 5.99, '8 inch teddy bear, comes with cap and jacket');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BR02', 'BRS01', '12 inch teddy bear', 8.99, '12 inch teddy bear, comes with cap and jacket');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BR03', 'BRS01', '18 inch teddy bear', 11.99, '18 inch teddy bear, comes with cap and jacket');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BNBG01', 'DLL01', 'Fish bean bag toy', 3.49, 'Fish bean bag toy, complete with bean bag worms with which to feed it');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BNBG02', 'DLL01', 'Bird bean bag toy', 3.49, 'Bird bean bag toy, eggs are not included');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BNBG03', 'DLL01', 'Rabbit bean bag toy', 3.49, 'Rabbit bean bag toy, comes with bean bag carrots');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('RGAN01', 'DLL01', 'Raggedy Ann', 4.99, '18 inch Raggedy Ann doll');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('RYL01', 'FNG01', 'King doll', 9.49, '12 inch king doll with royal garments and crown');

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('RYL02', 'FNG01', 'Queen doll', 9.49, '12 inch queen doll with royal garments and crown');

4.3 向顧客信息Customers表中插入數據

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000001', 'Village Toys', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'John Smith', 'sales@villagetoys.com');

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact) 
VALUES('1000000002', 'Kids Place', '333 South Lake Drive', 'Columbus', 'OH', '43333', 'USA', 'Michelle Green');

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) 
VALUES('1000000003', 'Fun4All', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'jjones@fun4all.com');

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) 
VALUES('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Denise L. Stephens', 'dstephens@fun4all.com');

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact) 
VALUES('1000000005', 'The Toy Store', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'Kim Howard');

4.4 向訂單Orders表中插入數據

INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20005, '2012-05-01', '1000000001');
INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20006, '2012-01-12', '1000000003');
INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20007, '2012-01-30', '1000000004');
INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20008, '2012-02-03', '1000000005');
INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20009, '2012-02-08', '1000000001');

4.5 向訂單明細OrderItems表中插入數據

INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20005, 1, 'BR01', 100, 5.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20005, 2, 'BR03', 100, 10.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20006, 1, 'BR01', 20, 5.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20006, 2, 'BR02', 10, 8.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20006, 3, 'BR03', 10, 11.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 1, 'BR03', 50, 11.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 2, 'BNBG01', 100, 2.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 3, 'BNBG02', 100, 2.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 4, 'BNBG03', 100, 2.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20007, 5, 'RGAN01', 50, 4.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 1, 'RGAN01', 5, 4.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 2, 'BR03', 5, 11.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 3, 'BNBG01', 10, 3.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 4, 'BNBG02', 10, 3.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20008, 5, 'BNBG03', 10, 3.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20009, 1, 'BNBG01', 250, 2.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20009, 2, 'BNBG02', 250, 2.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price) VALUES(20009, 3, 'BNBG03', 250, 2.49);

如果您發現文中有不清楚或者有問題的地方,請在下方評論區留言,我會根據您的評論,更新文中相關內容,謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容

  • SQL與MySQL簡介 數據庫基礎 從SQL的角度來看,數據庫就是一個以某種有組織的方式存儲的數據集合。我們可以采...
    heming閱讀 3,109評論 1 8
  • 1.表中的任何列都可以作為主鍵, 只要它滿足以下條件:任意兩行都不具有相同的主鍵值;每一行都必須具有一個主鍵值( ...
    Cherryjs閱讀 679評論 0 0
  • 一、SQL是Structured Query Language結構化數據語言。 是一種專門用來與數據庫溝通的語言基...
    CodingHou閱讀 849評論 0 0
  • 2017/3/14 RDBMS:關系型數據庫管理系統 關系模型獨立于語言 SQL有幾種不同類型的語言:數據定義語言...
    ancherl閱讀 1,648評論 0 6
  • 最近qq提醒我一位朋友的生日,打開一看,正是高中時我喜歡的那個男生,當時不愿承認,特殊關注了好幾年。他收到祝?;亓?..
    青椒土豆絲a閱讀 394評論 0 0