我的SQL學(xué)習(xí)

目錄

SQL的學(xué)習(xí)之路,主要參考資料是:

SQL必知必會(huì)
W3school的SQL簡(jiǎn)介


右擊,新標(biāo)簽頁(yè)即可打開原圖


操作使用的數(shù)據(jù)庫(kù)為Access及MySQL。

數(shù)據(jù)采用的是SQL必知必會(huì)中的數(shù)據(jù)

(最下方可以下載數(shù)據(jù))。其有5個(gè)表,表的關(guān)系如下:

表的關(guān)系
這里補(bǔ)充下,MySQL創(chuàng)建該數(shù)據(jù)庫(kù)(2017.5.17),復(fù)制到MySQL創(chuàng)建執(zhí)行創(chuàng)建即可(數(shù)據(jù)來源于《SQL必知必會(huì)》);
-- ----------------------
-- Create Customers table
-- ----------------------
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 
);

-- -----------------------
-- Create OrderItems table
-- -----------------------
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 
);


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

-- ---------------------
-- Create Products table
-- ---------------------
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 
);

-- --------------------
-- Create Vendors table
-- --------------------
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 
);


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


-- -------------------
-- Define foreign keys
-- -------------------
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);
ALTER TABLE Orders ADD CONSTRAINT FK_Orders_Customers FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);
ALTER TABLE Products ADD CONSTRAINT FK_Products_Vendors FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id);
插入數(shù)據(jù)
-- ------------------------
-- Populate Customers table
-- ------------------------
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');

-- ----------------------
-- Populate Vendors table
-- ----------------------
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');

-- -----------------------
-- Populate Products table
-- -----------------------
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');

-- ---------------------
-- Populate Orders table
-- ---------------------
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');

-- -------------------------
-- Populate OrderItems table
-- -------------------------
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);

1.SQL基礎(chǔ)

基礎(chǔ)

2.檢索數(shù)據(jù)

檢索數(shù)據(jù)

3.排序檢索數(shù)據(jù)

排序檢索數(shù)據(jù)

4.過濾數(shù)據(jù)

過濾數(shù)據(jù)

5.高級(jí)過濾

高級(jí)過濾

6.通配符過濾

通配符過濾

7.創(chuàng)建計(jì)算字段

創(chuàng)建計(jì)算字段

8.函數(shù)特性

函數(shù)特性

9.函數(shù)

函數(shù)

10.匯總數(shù)據(jù)

匯總數(shù)據(jù)

11.分組數(shù)據(jù)

分組數(shù)據(jù)


以上測(cè)試均在Access數(shù)據(jù)庫(kù)中進(jìn)行,以下于MySQL中進(jìn)行,通過workbench(版本6.3)操作。


12.子查詢

這里說白了就是select語(yǔ)句嵌套,如select * from (select cust_name from customers)

子查詢

13.聯(lián)結(jié)

笛卡爾積

聯(lián)結(jié)

14.高級(jí)聯(lián)結(jié)

高級(jí)聯(lián)結(jié)

如果3個(gè)以上的表,那怎樣聯(lián)結(jié)?

  1. 3個(gè)
 use test;
 select cust_name,cust_contact
 from (customers 
 inner join orders
 on customers.cust_id = orders.cust_id)
 inner join orderitems 
 on orderitems.order_num = orders.order_num;```

 語(yǔ)法可以概括為:

***`FROM (表1 INNER JOIN 表2 ON 表1.字段號(hào)=表2.字段號(hào)) INNER JOIN 表3 ON 表1.字段號(hào)=表3.字段號(hào)`***

2. 同理,4個(gè)表可以概括為:

***`FROM ((表1 INNER JOIN 表2 ON 表1.字段號(hào)=表2.字段號(hào)) INNER JOIN 表3 ON 表1.字段號(hào)=表3.字段號(hào)) INNER JOIN 表4 ON Member.字段號(hào)=表4.字段號(hào)`***


## 15.組合查詢

![組合查詢](http://upload-images.jianshu.io/upload_images/2151277-2f00deb32b8b47bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

****
 *如果代碼塊閱讀困難,可移步[博客園](http://www.cnblogs.com/sunshinewang/p/6789419.html)*
****

***關(guān)于規(guī)則中列順序,前后必須一致。***否則會(huì)出現(xiàn)如下情況:

```SQL
 1 use test; 
 2 select cust_name ,cust_email,cust_contact
 3 from customers
 4 where cust_state in ('IL','IN','MI')
 5 union all
 6 select cust_name,cust_contact,cust_email
 7 from customers
 8 where cust_name = 'Fun4All'```


 
返回結(jié)果為:

![返回結(jié)果](http://upload-images.jianshu.io/upload_images/2151277-8056401714986ffe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

列的順序一致,才會(huì)返回正確結(jié)果

```SQL
 1 use test;
 2 select cust_name ,cust_email,cust_contact
 3 from customers
 4 where cust_state in ('IL','IN','MI')
 5 union all
 6 select cust_name,cust_email,cust_contact
 7 from customers8 where cust_name = 'Fun4All'```

 
結(jié)果:

![返回結(jié)果](http://upload-images.jianshu.io/upload_images/2151277-322eef5f933e81f2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

## 16.插入數(shù)據(jù)

***INSERT SELECT:***

它可以將SELCET語(yǔ)句結(jié)果插入表中,在***某種意義上可以完成表的復(fù)制***。
如:

```SQL
 1 USE test;#使用數(shù)據(jù)庫(kù)test 
 2 CREATE TABLE CustNew 
 3 ( 
 4 cust_id  char(10)   NOT NULL ,
 5 cust_name  char(50)   NOT NULL ,
 6 cust_address  char(50)  NULL , 
 7 cust_city  char(50)  NULL ,
 8 cust_state  char(5)  NULL , 
 9 cust_zip  char(10)  NULL ,
10 cust_country  char(50)  NULL ,
11 cust_contact  char(50)  NULL ,
12 cust_email  char(255)  NULL 
13 );#創(chuàng)新新表 
14 INSERT INTO CustNew
15 (
16 cust_id,
17 cust_name,
18 cust_address,
19 cust_city,
20 cust_state,
21 cust_zip,
22 cust_country,
23 cust_contact,
24 cust_email
25 )
26 SELECT 
27 cust_id,
28 cust_name,
29 cust_address,
30 cust_city,
31 cust_state,
32 cust_zip,
33 cust_country,
34 cust_contact,
35 cust_email
36 FROM customers;#將customers表的數(shù)據(jù)插入新表alter
37 SELECT * FROM CustNew;```

返回結(jié)果如下:
 ![結(jié)果](http://upload-images.jianshu.io/upload_images/2151277-96aaf2720fa79e88.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
 
 而如果反過來用,大概就是:

```SQL
 1 insert into
 2 customers 
 3 (列1,列2,......)
 4 select
 5 列1,列2,.....
 6 from custnew```

 
即可完成將表custnew中的數(shù)據(jù)全部插入customers,這也完成了一條insert插入多條數(shù)據(jù)。

***通常,一條INSERT 語(yǔ)句,只能插入一行數(shù)據(jù),要插入多行,就必須執(zhí)行多個(gè)INSERT,但是, INSERT SELECT 是個(gè)例外。***

以上方法的復(fù)制,實(shí)際上是重新在數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)新表。

***SELECT INTO:***

這種方法,可以在SQL語(yǔ)句運(yùn)行中創(chuàng)建一個(gè)表,并將一個(gè)表復(fù)制到這個(gè)全新的表。

***我們可以在實(shí)驗(yàn)新的SQL語(yǔ)句前,用其進(jìn)行復(fù)制,這樣就不影響到實(shí)際數(shù)據(jù)。***
如:

```SQL
 USE test;#使用數(shù)據(jù)庫(kù)
 CREATE TABLE Cucopy as
 SELECT * FROM customers;#復(fù)制
 SELECT * FROM Cucopy;```

 返回結(jié)果,與上表一致。
 
![插入](http://upload-images.jianshu.io/upload_images/2151277-45f6e82846597d13.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

## 17.更新和刪除

![更新和刪除](http://upload-images.jianshu.io/upload_images/2151277-c9a8f39f57480ec5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
 
 
## 18.創(chuàng)建和操縱表

這里中點(diǎn)說一下創(chuàng)建表時(shí),指定默認(rèn)值的問題。一般來說,創(chuàng)建表時(shí),我們需要指定列的數(shù)據(jù)類型、是否NULL列。關(guān)于NULL值具體說明請(qǐng)看下圖。

默認(rèn)值要是用的好,可以省卻我們很多時(shí)間。

因其經(jīng)常用于指定默認(rèn)日期,這里以日期為例。

首先,在MySQL中內(nèi)建的日期函數(shù):

|函數(shù)|描述|
|-----|--|
|[NOW()](http://www.w3school.com.cn/sql/func_now.asp)|返回當(dāng)前的日期和時(shí)間|
|[CURDATE()](http://www.w3school.com.cn/sql/func_curdate.asp)|返回當(dāng)前的日期|
|[CURTIME()](http://www.w3school.com.cn/sql/func_curtime.asp)|返回當(dāng)前的時(shí)間|
|[DATE()](http://www.w3school.com.cn/sql/func_date.asp)|提取日期或日期/時(shí)間表達(dá)式的日期部分|
|[EXTRACT()](http://www.w3school.com.cn/sql/func_extract.asp)|返回日期/時(shí)間按的單獨(dú)部分|
|[DATE_ADD()](http://www.w3school.com.cn/sql/func_date_add.asp)|給日期添加指定的時(shí)間間隔|
|[DATE_SUB()](http://www.w3school.com.cn/sql/func_date_sub.asp)|從日期減去指定的時(shí)間間隔|
|[DATEDIFF()](http://www.w3school.com.cn/sql/func_datediff_mysql.asp)|返回兩個(gè)日期之間的天數(shù)|
|[DATE_FORMAT()](http://www.w3school.com.cn/sql/func_date_format.asp)|用不同的格式顯示日期/時(shí)間|

 
創(chuàng)建數(shù)據(jù)庫(kù)t2,插入表。如下:

```SQL
 CREATE DATABASE t2;
 USE t2;
 CREATE TABLE test
 (
 id int(5) NOT NULL,noedate timestamp NOT NULL DEFAULT 
 current_timestamp()
 );```

調(diào)用如下:

```SQL
 USE t2;
 INSERT INTO test(id)values(1);
 SELET * FROM test;```

返回結(jié)果:

![返回結(jié)果](http://upload-images.jianshu.io/upload_images/2151277-06833413f120003a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

以下SQL不合法:

- `time_d time NOT NULL DEFAULT CURTIME(), `
- `date_e date NOT NULL DEFAULT CURDATE(),`
- `datetime_f datetime NOT NULL DEFAULT NOW(),` 

 
- DATETIME類型:NOW()函數(shù)以'YYYY-MM-DD HH:MM:SS'返回當(dāng)前的日期時(shí)間,可以直接存到DATETIME字段中。不支持使用系統(tǒng)默認(rèn)值。 
- DATE類型:CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。不支持使用系統(tǒng)默認(rèn)值。 
- TIME類型:CURTIME()以'HH:MM:SS'的格式返回當(dāng)前的時(shí)間,可以直接存到TIME字段中。不支持使用系統(tǒng)默認(rèn)值。 
常見錯(cuò)誤:

```SQL
CREATE TABLE dnt_forums
(
 aa int NOT NULL DEFAULT (''), 
 bb date NOT NULL DEFAULT (getdate()), 
 cc char(50) NOT NULL DEFAULT (null) 
);```

 
+ aa 是 int 類型,默認(rèn)值也得是整型,并且default后邊不要()括號(hào) 。
+ bb date類型不支持使用系統(tǒng)默認(rèn)值,改成timestamp,能過now()取系統(tǒng)時(shí)間 。
+ cc 已經(jīng)不允許為空(not null)所以不能默認(rèn)為 null ,可以改成空字符串 。
修改:

```SQL
 CREATE TABLE dnt_forums
 (
  aa int NOT NULL DEFAULT 2,
 bb timestamp NOT NULL DEFAULT now(),
 cc char(50) NOT NULL DEFAULT ''
 ); ```

 
這個(gè)日期問題,依然有很多不太明白的地方,以后學(xué)習(xí)過程碰到繼續(xù)解決。
主要參考:

[腳本之家](http://www.jb51.net/article/33570.htm)、[博客](http://blog.csdn.net/justdb/article/details/7965490)

![創(chuàng)建和操縱表](http://upload-images.jianshu.io/upload_images/2151277-3e42c57a43b77707.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

重命名表:

`RENAME TABLE cucopy1 TO hi;`

 
 刪除表:

`DROP TABLE hi;`

*待續(xù)*

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容