繼續做以下的前期準備工作:
新建一個測試數據庫TestDB;
| create database TestDB; |
創建測試表table1和table2;
| CREATE TABLE table1 ( customer_id VARCHAR(10) NOT NULL, city VARCHAR(10) NOT NULL, PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CHARSET=UTF8; CREATE TABLE table2 ( order_id INT NOT NULL auto_increment, customer_id VARCHAR(10), PRIMARY KEY(order_id) )ENGINE=INNODB DEFAULT CHARSET=UTF8; |
插入測試數據;
| INSERT INTO table1(customer_id,city) VALUES('163','hangzhou'); INSERT INTO table1(customer_id,city) VALUES('9you','shanghai'); INSERT INTO table1(customer_id,city) VALUES('tx','hangzhou'); INSERT INTO table1(customer_id,city) VALUES('baidu','hangzhou'); INSERT INTO table2(customer_id) VALUES('163'); INSERT INTO table2(customer_id) VALUES('163'); INSERT INTO table2(customer_id) VALUES('9you'); INSERT INTO table2(customer_id) VALUES('9you'); INSERT INTO table2(customer_id) VALUES('9you'); INSERT INTO table2(customer_id) VALUES('tx'); |
準備工作做完以后,table1和table2看起來應該像下面這樣:
| mysql> select * from table1; +-------------+----------+ | customer_id | city | +-------------+----------+ | 163 | hangzhou | | 9you | shanghai | | baidu | hangzhou | | tx | hangzhou | +-------------+----------+ 4 rows in set (0.00 sec) mysql> select * from table2; +----------+-------------+ | order_id | customer_id | +----------+-------------+ | 1 | 163 | | 2 | 163 | | 3 | 9you | | 4 | 9you | | 5 | 9you | | 6 | tx | +----------+-------------+ 7 rows in set (0.00 sec) |
準備工作做的差不多了,開始今天的總結吧。
一個問題
現在需要查詢所有杭州用戶的所有訂單號,這個SQL語句怎么寫?首先,你可以這么寫:
| select table2.customer_id, table2.order_id from table2 join table1 on table1.customer_id=table2.customer_id where table1.city='hangzhou'; |
能實現我們需要的結果。但是,我們也可以這么寫:
| select customer_id, order_id from table2 where customer_id in (select customer_id from table1 where city='hangzhou'); |
呃?在()括號中的的select語句是什么?問題來了,這到底是什么語法,怎么也可以完成任務,那么這篇博文就圍繞著這個問題開始展開。
啥是子查詢
簡單的說,子查詢就是:

如上圖所示,子查詢,有叫內部查詢,相對于內部查詢,包含內部查詢的就稱為外部查詢。子查詢可以包含普通select可以包括的任何子句,比如:distinct、group by、order by、limit、join和union等;但是對應的外部查詢必須是以下語句之一:select、insert、update、delete、set或者do。
新聞熱點
疑難解答