該筆記整理自Ben Forta著,鐘鳴、劉曉霞譯,人民郵電出版社出版的《SQL必知必會》第4版,具體內容有部分省略。
關于存儲過程的部分內容,結合了《SQL必知必會》和《MySQL必知必會》。
代碼測試環境:Win7-64bit、MySQL 5.7、MySQL Workbench 6.3。
1 樣例表解釋說明
書中所用的表是一個玩具經銷商使用的訂單錄入系統的組成部分,包括:
- 管理供應商Vendors。
- 管理產品目錄Products。
- 管理顧客列表Customers。
- 錄入顧客訂單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);
如果您發現文中有不清楚或者有問題的地方,請在下方評論區留言,我會根據您的評論,更新文中相關內容,謝謝!