前言
現(xiàn)在系統(tǒng)的各種業(yè)務(wù)是如此的復(fù)雜,數(shù)據(jù)都存在數(shù)據(jù)庫中的各種表中,這個主鍵啊,那個外鍵啊,而表與表之間就依靠著這些主鍵和外鍵聯(lián)系在一起。而我們進(jìn)行業(yè)務(wù)操作時,就需要在多個表之間,使用sql語句建立起關(guān)系,然后再進(jìn)行各種sql操作。那么在使用sql寫出各種操作時,如何使用sql語句,將多個表關(guān)聯(lián)在一起,進(jìn)行業(yè)務(wù)操作呢?而這篇文章,就對這個知識點進(jìn)行總結(jié)。
聯(lián)接查詢是一種常見的數(shù)據(jù)庫操作,即在兩張表(多張表)中進(jìn)行匹配的操作。MySQL數(shù)據(jù)庫支持如下的聯(lián)接查詢:
CROSS JOIN(交叉聯(lián)接) INNER JOIN(內(nèi)聯(lián)接) OUTER JOIN(外聯(lián)接) 其它在進(jìn)行各種聯(lián)接操作時,一定要回憶一下在《SQL邏輯查詢語句執(zhí)行順序》這篇文章中總結(jié)的SQL邏輯查詢語句執(zhí)行的前三步:
執(zhí)行FROM語句(笛卡爾積) 執(zhí)行ON過濾 添加外部行每個聯(lián)接都只發(fā)生在兩個表之間,即使FROM子句中包含多個表也是如此。每次聯(lián)接操作也只進(jìn)行邏輯查詢語句的前三步,每次產(chǎn)生一個虛擬表,這個虛擬表再依次與FROM子句的下一個表進(jìn)行聯(lián)接,重復(fù)上述步驟,直到FROM子句中的表都被處理完為止。
前期準(zhǔn)備
1.新建一個測試數(shù)據(jù)庫TestDB;
| create database TestDB; |
創(chuàng)建測試表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; |
插入測試數(shù)據(jù);
| 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'); |
準(zhǔn)備工作做完以后,table1和table2看起來應(yīng)該像下面這樣:
| 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) |