SQL必知必会

SQL必知必会(Book 【美】 Ben Forta)

首先创建表 和 测试数据,之后是各章中的基于Oracle DB的SQL 练习语句。

创建表

 1 ---------------------------------------------
 2 -- Sams Teach Yourself SQL in 10 Minutes
 3 -- http://forta.com/books/0672336073/
 4 -- Example table creation scripts for Oracle.
 5 ---------------------------------------------
 6 
 7 
 8 -------------------------
 9 -- Create Customers table
10 -------------------------
11 CREATE TABLE Customers
12 (
13   cust_id      char(10)  NOT NULL ,
14   cust_name    char(50)  NOT NULL ,
15   cust_address char(50)  NULL ,
16   cust_city    char(50)  NULL ,
17   cust_state   char(5)   NULL ,
18   cust_zip     char(10)  NULL ,
19   cust_country char(50)  NULL ,
20   cust_contact char(50)  NULL ,
21   cust_email   char(255) NULL 
22 );
23 
24 --------------------------
25 -- Create OrderItems table
26 --------------------------
27 CREATE TABLE OrderItems
28 (
29   order_num  int          NOT NULL ,
30   order_item int          NOT NULL ,
31   prod_id    char(10)     NOT NULL ,
32   quantity   int          NOT NULL ,
33   item_price decimal(8,2) NOT NULL 
34 );
35 
36 ----------------------
37 -- Create Orders table
38 ----------------------
39 CREATE TABLE Orders
40 (
41   order_num  int      NOT NULL ,
42   order_date date     NOT NULL ,
43   cust_id    char(10) NOT NULL 
44 );
45 
46 ------------------------
47 -- Create Products table
48 ------------------------
49 CREATE TABLE Products
50 (
51   prod_id    char(10)      NOT NULL ,
52   vend_id    char(10)      NOT NULL ,
53   prod_name  char(255)     NOT NULL ,
54   prod_price decimal(8,2)  NOT NULL ,
55   prod_desc  varchar(1000) NULL 
56 );
57 
58 -----------------------
59 -- Create Vendors table
60 -----------------------
61 CREATE TABLE Vendors
62 (
63   vend_id      char(10) NOT NULL ,
64   vend_name    char(50) NOT NULL ,
65   vend_address char(50) NULL ,
66   vend_city    char(50) NULL ,
67   vend_state   char(5)  NULL ,
68   vend_zip     char(10) NULL ,
69   vend_country char(50) NULL 
70 );
71 
72 ----------------------
73 -- Define primary keys
74 ----------------------
75 ALTER TABLE Customers ADD CONSTRAINT PK_Customers PRIMARY KEY (cust_id);
76 ALTER TABLE OrderItems ADD CONSTRAINT PK_OrderItems PRIMARY KEY (order_num, order_item);
77 ALTER TABLE Orders ADD CONSTRAINT PK_Orders PRIMARY KEY (order_num);
78 ALTER TABLE Products ADD CONSTRAINT PK_Products PRIMARY KEY (prod_id);
79 ALTER TABLE Vendors ADD CONSTRAINT PK_Vendors PRIMARY KEY (vend_id);
80 
81 ----------------------
82 -- Define foreign keys
83 ----------------------
84 ALTER TABLE OrderItems
85 ADD CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES Orders (order_num);
86 ALTER TABLE OrderItems
87 ADD CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES Products (prod_id);
88 ALTER TABLE Orders
89 ADD CONSTRAINT FK_Orders_Customers FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);
90 ALTER TABLE Products
91 ADD CONSTRAINT FK_Products_Vendors FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id);

创建测试数据

  1 -----------------------------------------------
  2 -- Sams Teach Yourself SQL in 10 Minutes
  3 -- http://forta.com/books/0672336073/
  4 -- Example table population scripts for Oracle.
  5 -----------------------------------------------
  6 
  7 
  8 ---------------------------
  9 -- Populate Customers table
 10 ---------------------------
 11 INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
 12 VALUES('1000000001', 'Village Toys', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'John Smith', 'sales@villagetoys.com');
 13 INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
 14 VALUES('1000000002', 'Kids Place', '333 South Lake Drive', 'Columbus', 'OH', '43333', 'USA', 'Michelle Green');
 15 INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
 16 VALUES('1000000003', 'Fun4All', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'jjones@fun4all.com');
 17 INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
 18 VALUES('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Denise L. Stephens', 'dstephens@fun4all.com');
 19 INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
 20 VALUES('1000000005', 'The Toy Store', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'Kim Howard');
 21 
 22 -------------------------
 23 -- Populate Vendors table
 24 -------------------------
 25 INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
 26 VALUES('BRS01','Bears R Us','123 Main Street','Bear Town','MI','44444', 'USA');
 27 INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
 28 VALUES('BRE02','Bear Emporium','500 Park Street','Anytown','OH','44333', 'USA');
 29 INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
 30 VALUES('DLL01','Doll House Inc.','555 High Street','Dollsville','CA','99999', 'USA');
 31 INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
 32 VALUES('FRB01','Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
 33 INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
 34 VALUES('FNG01','Fun and Games','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
 35 INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
 36 VALUES('JTS01','Jouets et ours','1 Rue Amusement','Paris', NULL,'45678', 'France');
 37 
 38 --------------------------
 39 -- Populate Products table
 40 --------------------------
 41 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 42 VALUES('BR01', 'BRS01', '8 inch teddy bear', 5.99, '8 inch teddy bear, comes with cap and jacket');
 43 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 44 VALUES('BR02', 'BRS01', '12 inch teddy bear', 8.99, '12 inch teddy bear, comes with cap and jacket');
 45 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 46 VALUES('BR03', 'BRS01', '18 inch teddy bear', 11.99, '18 inch teddy bear, comes with cap and jacket');
 47 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 48 VALUES('BNBG01', 'DLL01', 'Fish bean bag toy', 3.49, 'Fish bean bag toy, complete with bean bag worms with which to feed it');
 49 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 50 VALUES('BNBG02', 'DLL01', 'Bird bean bag toy', 3.49, 'Bird bean bag toy, eggs are not included');
 51 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 52 VALUES('BNBG03', 'DLL01', 'Rabbit bean bag toy', 3.49, 'Rabbit bean bag toy, comes with bean bag carrots');
 53 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 54 VALUES('RGAN01', 'DLL01', 'Raggedy Ann', 4.99, '18 inch Raggedy Ann doll');
 55 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 56 VALUES('RYL01', 'FNG01', 'King doll', 9.49, '12 inch king doll with royal garments and crown');
 57 INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
 58 VALUES('RYL02', 'FNG01', 'Queen doll', 9.49, '12 inch queen doll with royal garments and crown');
 59 
 60 ------------------------
 61 -- Populate Orders table
 62 ------------------------
 63 INSERT INTO Orders(order_num, order_date, cust_id)
 64 VALUES(20005, TO_DATE('2012-05-01', 'yyyy-mm-dd'), '1000000001');
 65 INSERT INTO Orders(order_num, order_date, cust_id)
 66 VALUES(20006, TO_DATE('2012-01-12', 'yyyy-mm-dd'), '1000000003');
 67 INSERT INTO Orders(order_num, order_date, cust_id)
 68 VALUES(20007, TO_DATE('2012-01-30', 'yyyy-mm-dd'), '1000000004');
 69 INSERT INTO Orders(order_num, order_date, cust_id)
 70 VALUES(20008, TO_DATE('2012-02-03', 'yyyy-mm-dd'), '1000000005');
 71 INSERT INTO Orders(order_num, order_date, cust_id)
 72 VALUES(20009, TO_DATE('2012-02-08', 'yyyy-mm-dd'), '1000000001');
 73 
 74 ----------------------------
 75 -- Populate OrderItems table
 76 ----------------------------
 77 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 78 VALUES(20005, 1, 'BR01', 100, 5.49);
 79 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 80 VALUES(20005, 2, 'BR03', 100, 10.99);
 81 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 82 VALUES(20006, 1, 'BR01', 20, 5.99);
 83 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 84 VALUES(20006, 2, 'BR02', 10, 8.99);
 85 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 86 VALUES(20006, 3, 'BR03', 10, 11.99);
 87 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 88 VALUES(20007, 1, 'BR03', 50, 11.49);
 89 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 90 VALUES(20007, 2, 'BNBG01', 100, 2.99);
 91 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 92 VALUES(20007, 3, 'BNBG02', 100, 2.99);
 93 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 94 VALUES(20007, 4, 'BNBG03', 100, 2.99);
 95 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 96 VALUES(20007, 5, 'RGAN01', 50, 4.49);
 97 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
 98 VALUES(20008, 1, 'RGAN01', 5, 4.99);
 99 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
100 VALUES(20008, 2, 'BR03', 5, 11.99);
101 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
102 VALUES(20008, 3, 'BNBG01', 10, 3.49);
103 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
104 VALUES(20008, 4, 'BNBG02', 10, 3.49);
105 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
106 VALUES(20008, 5, 'BNBG03', 10, 3.49);
107 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
108 VALUES(20009, 1, 'BNBG01', 250, 2.49);
109 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
110 VALUES(20009, 2, 'BNBG02', 250, 2.49);
111 INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
112 VALUES(20009, 3, 'BNBG03', 250, 2.49);

 

各章SQL练习语句

  1 
-- '_'下划线通配符,只匹配一个字符;'%' 通配符,匹配 0 个、1 个 或 多个任意字符,NULL除外。
SELECT prod_id,prod_name 2 FROM Products 3 WHERE prod_name LIKE '__ inch teddy bear %'; 4 -- 方括号[] 通配符用来指定一个字符集。
-- 例如,找出所有名字以 J 或 M 起头的联系人,可进行如下查询。 5 SELECT cust_contact 6 FROM Customers 7 WHERE cust_contact LIKE '[JM]%' 8 ORDER BY cust_contact; 9 10 SELECT prod_name 11 FROM Products 12 WHERE NOT vend_id = 'DLL01' 13 ORDER BY prod_name; 14 15 SELECT RTRIM(vend_name) || ' (' || RTRIM(VEND_COUNTRY) || ')' AS vend_title 16 FROM Vendors 17 ORDER BY vend_name; 18 19 SELECT vend_name || ' (' || VEND_COUNTRY || ')' 20 FROM Vendors 21 ORDER BY vend_name; 22 23 SELECT prod_id ,quantity, item_price,quantity * item_price AS expanded_price 24 FROM OrderItems 25 WHERE order_num = 20008; 26 27 SELECT vend_name ,UPPER(vend_name) AS vned_name_upcase 28 FROM Vendors 29 ORDER BY vend_name; 30 31 SELECT cust_name,cust_contact 32 FROM Customers 33 WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green'); 34 35 SELECT order_num 36 FROM Orders 37 WHERE to_number(to_char(order_date, 'YYYY')) = 2012; 38 39 SELECT AVG(DISTINCT prod_price) as avg_price 40 FROM Products 41 WHERE vend_id = 'DLL01'; 42 SELECT * -- count(cust_email) AS num_cust 43 FROM Customers 44 45 46 SELECT COUNT(*) AS num_prods 47 FROM Products 48 WHERE vend_id = 'DLL01'; 49 50 SELECT vend_id, COUNT(*) AS num_prods 51 FROM Products 52 GROUP BY vend_id; 53 54 SELECT cust_id, COUNT(*) AS orders 55 FROM Orders 56 GROUP BY cust_id 57 HAVING COUNT(*) >= 2; 58 --HAVING to_number(cust_id) >= 1000000001; 59 60 SELECT vend_id , COUNT(*) AS num_pords 61 FROM Products 62 --WHERE prod_price >=4 63 GROUP BY vend_id 64 HAVING COUNT(*) >=2 ; 65 66 SELECT prod_price 67 FROM Products 68 WHERE vend_id = 'DLL01'; 69 70 SELECT order_num ,COUNT(*) AS items 71 FROM OrderItems 72 GROUP By order_num 73 HAVING COUNT(*) >=3 74 ORDER BY items, order_num; 75 76 81 SELECT vend_name, RTRIM(prod_name) ,RTRIM(prod_price) 82 FROM Vendors, Products 83 WHERE Vendors.vend_id = Products.vend_id 84 85 SELECT vend_name, RTRIM(prod_name) AS PROD_NAME ,RTRIM(prod_price) 86 FROM Vendors INNER JOIN Products 87 ON Vendors.vend_id = Products.vend_id 88 89 SELECT cust_name ,cust_contact 90 FROM Customers , Orders , OrderItems 91 WHERE Customers.cust_id = Orders.cust_id 92 AND OrderItems.order_num = Orders.order_num 93 AND prod_id = 'RGAN01' 94 95 --self join
-- 作为子查询的SELECT语句只能查询单个列
-- 嵌套在其他查询中的查询叫做子查询。
96 SELECT cust_id , cust_name ,cust_contact 97 FROM Customers 98 WHERE cust_name IN (SELECT cust_name 99 FROM Customers 100 WHERE cust_contact = 'Jim Jones') 101 102 SELECT c1.cust_id , c1.cust_name , c1.cust_contact 103 FROM Customers c1 , Customers c2 104 WHERE c1.cust_name = c2.cust_name 105 AND c2.cust_contact = 'Jim Jones'; 106 107 SELECT Customers.cust_id ,Orders.order_num 108 FROM Customers INNER JOIN Orders 109 ON Customers.cust_id = Orders.cust_id; 110 111 112 SELECT Customers.cust_id ,Orders.order_num 113 FROM Customers LEFT OUTER JOIN Orders 114 ON Customers.cust_id = Orders.cust_id; 115 116 SELECT Customers.cust_id ,COUNT(Orders.order_num) AS num_ord 117 FROM Customers INNER JOIN Orders 118 ON Customers.cust_id = Orders.cust_id 119 GROUP BY Customers.cust_id 120 121 --Chapter 14 122 SELECT cust_name ,cust_contact ,cust_email 123 FROM Customers 124 WHERE cust_state in ('IL', 'IN', 'MI') 125 UNION --ALL 126 SELECT cust_name ,cust_contact,cust_email 127 FROM Customers 128 WHERE cust_name = 'Fun4All' 129 ORDER BY cust_name ,cust_contact; 130 131 SELECT * 132 FROM Customers 133 WHERE cust_id = '1000000006' 134 135 INSERT INTO Customers 136 VALUES('1000000006' , 'Toy Land', '123 Any Street' , 'New York' , 'NY' , '11111' ,'USA', NULL, NULL) 137 commit work; 138 139 INSERT INTO Customers(cust_id ,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) 140 VALUES('1000000007' , 'Toy Land', '123 Any Street' , 'New York' , 'NY' , '11111' ,'USA'); 141 commit work; 142 143 SELECT * 144 FROM Customers 145 WHERE cust_id = '1000000007' 146 147 CREATE TABLE CustCopy AS 148 SELECT * FROM Customers; 149 commit work; 150 151 UPDATE Customers 152 SET cust_email = 'kim@thetoystore.com' 153 WHERE cust_id = '1000000005' 154 155 commit work; 156 157 SELECT cust_email 158 FROM Customers 159 WHERE cust_id = '1000000005' 160 161 UPDATE Customers 162 SET cust_contact = 'Sam Roberts', 163 cust_email = 'sam@toyland.com' 164 WHERE cust_id = '1000000006'165 166 commit work; 167 168 --To delete of the specified column ,can set the value of that column to null(if allowed) 169 UPDATE Customers 170 SET cust_email = NULL 171 WHERE cust_id = '1000000005'; 172 173 commit work; 174 175 SELECT * 176 FROM Custcopy; 177 178 DELETE FROM Custcopy 179 180 INSERT INTO CustCopy 181 SELECT * FROM Customers; 182 commit work; 183 184 DELETE FROM Custcopy 185 WHERE cust_id = '1000000006' 186 187 SELECT * 188 FROM Products; 189 190 TRUNCATE TABLE Custcopy; 191 SELECT * 192 FROM Custcopy; 193 194 CREATE TABLE TABLE_TEST 195 ( 196 prod_id char(10) NOT NULL 197 ); 198 INSERT INTO TABLE_TEST(prod_id) 199 VALUES('1234567890'); 200 commit work; 201 202 ALTER TABLE Vendors 203 ADD vend_phone CHAR(20); 204 commit work; 205 206 ALTER TABLE Vendors 207 DROP COLUMN vend_phone 208 commit work; 209 210 SELECT * 211 FROM Custcopy 212 213 DROP TABLE Custcopy 214 215 216 -- Chapter 18 Use View 217 CREATE VIEW ProductCustomers AS 218 SELECT cust_name , cust_contact, prod_id 219 FROM Customers, Orders ,OrderItems 220 WHERE Customers.cust_id = Orders.cust_id 221 AND OrderItems.order_num = Orders.order_num; 222 223 SELECT * FROM ProductCustomers 224 SELECT cust_name FROM ProductCustomers 225 226 SELECT cust_name ,cust_contact 227 FROM ProductCustomers 228 WHERE prod_id = 'RGAN01' 229 230 CREATE VIEW VendorLocations AS 231 SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')' AS vend_title 232 FROM Vendors; 233 234 SELECT * FROM VendorLocations 235 236 237 238 CREATE PROCEDURE MailingListCount( 239 ListCount OUT INTEGER 240 ) 241 IS 242 v_rows INTEGER; 243 244 BEGIN 245 SELECT COUNT(*) INTO v_rows 246 FROM Customers 247 WHERE NOT cust_email IS NULL; 248 ListCount := v_rows; 249 END; 250 251 VAR ReturnValue NUMBER 252 EXEC MAILINGLISTCOUNT(:ReturnValue); 253 254 SELECT * FROM Orders 255 DELETE FROM Orders 256 ROLLBACK 257 258 SET TRANSACTION 259 DELETE OrderItems WHERE order_num = 12345; 260 DELETE Orders WHERE order_num = 12345; 261 COMMIT;

 

posted @ 2018-12-15 22:37  Happy2Share  阅读(233)  评论(0编辑  收藏  举报