MySQL中根本的多表銜接查詢教程。本站提示廣大學習愛好者:(MySQL中根本的多表銜接查詢教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中根本的多表銜接查詢教程正文
1、多表銜接類型
1. 笛卡爾積(穿插銜接) 在MySQL中可認為CROSS JOIN或許省略CROSS即JOIN,或許應用',' 如:
因為其前往的成果為被銜接的兩個數據表的乘積,是以當有WHERE, ON或USING前提的時刻普通不建議應用,由於當數據表項目太多的時刻,會異常慢。普通應用LEFT [OUTER] JOIN或許RIGHT [OUTER] JOIN
2. 內銜接INNER JOIN 在MySQL中把I
SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2
NNER JOIN叫做等值銜接,即須要指定等值銜接前提在MySQL中CROSS和INNER JOIN被劃分在一路。 join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition]
3. MySQL中的外銜接,分為左外銜接和右銜接,即除前往相符銜接前提的成果以外,還要前往左表(左銜接)或許右表(右銜接)中不相符銜接前提的成果,絕對應的應用NULL對應。
例子:
user表:
id | name ——— 1 | libk 2 | zyfon 3 | daodao
user_action表:
user_id | action ————— 1 | jump 1 | kick 1 | jump 2 | run 4 | swim
sql:
select id, name, action from user as u left join user_action a on u.id = a.user_id
result:
id | name | action ——————————– 1 | libk | jump ① 1 | libk | kick ② 1 | libk | jump ③ 2 | zyfon | run ④ 3 | daodao | null ⑤
剖析:
留意到user_action中還有一個user_id=4, action=swim的記載,然則沒有在成果中湧現,
而user表中的id=3, name=daodao的用戶在user_action中沒有響應的記載,然則卻湧現在了卻果集中
由於如今是left join,一切的任務以left為准.
成果1,2,3,4都是既在左表又在右表的記載,5是只在左表,不在右表的記載
任務道理:
從左表讀出一條,選出一切與on婚配的右表記載(n條)停止銜接,構成n條記載(包含反復的行,如:成果1和成果3),假如左邊沒有與on前提婚配的表,那銜接的字段都是null.然後持續讀下一條。
引伸:
我們可以用右表沒有on婚配則顯示null的紀律, 來找出一切在左表,不在右表的記載, 留意用來斷定的那列必需聲明為not null的。
如:
sql:
select id, name, action from user as u left join user_action a on u.id = a.user_id where a.user_id is NULL
(留意:
1.列值為null應當用is null 而不克不及用=NULL
2.這裡a.user_id 列必需聲明為 NOT NULL 的.
)
下面sql的result:
id | name | action ————————– 3 | daodao | NULL ——————————————————————————–
普通用法:
a. LEFT [OUTER] JOIN:
除前往相符銜接前提的成果以外,還須要顯示左表中不相符銜接前提的數據列,絕對應應用NULL對應
SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column
b. RIGHT [OUTER] JOIN:
RIGHT與LEFT JOIN類似分歧的僅僅是除顯示相符銜接前提的成果以外,還須要顯示右表中不相符銜接前提的數據列,響應應用NULL對應
SELECT column_name FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column=table2.column
Tips:
1. on a.c1 = b.c1 同等於 using(c1)
2. INNER JOIN 和 , (逗號) 在語義上是同等的
3. 當 MySQL 在從一個表中檢索信息時,你可以提醒它選擇了哪個索引。
假如 EXPLAIN 顯示 MySQL 應用了能夠的索引列表中毛病的索引,這個特征將是很有效的。
經由過程指定 USE INDEX (key_list),你可以告知 MySQL 應用能夠的索引中最適合的一個索引在表中查找記載行。
可選的二選一句法 IGNORE INDEX (key_list) 可被用於告知 MySQL 不應用特定的索引。如:
mysql> SELECT * FROM table1 USE INDEX (key1,key2) -> WHERE key1=1 AND key2=2 AND key3=3; mysql> SELECT * FROM table1 IGNORE INDEX (key3) -> WHERE key1=1 AND key2=2 AND key3=3;
2、表銜接的束縛前提
添加顯示前提WHERE, ON, USING
1. WHERE子句
mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id;
2. ON
mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id;
3. USING子句,假如銜接的兩個表銜接前提的兩個列具有雷同的名字的話可使用USING
例如:
SELECT FROM LEFT JOIN USING ()
銜接多於兩個表的情形舉例:
mysql> SELECT artists.Artist, cds.title, genres.genre FROM cds LEFT JOIN genres N cds.genreID = genres.genreID LEFT JOIN artists ON cds.artistID = artists.artistID;
或許
mysql> SELECT artists.Artist, cds.title, genres.genre FROM cds LEFT JOIN genres ON cds.genreID = genres.genreID LEFT JOIN artists -> ON cds.artistID = artists.artistID WHERE (genres.genre = 'Pop'); --------------------------------------------
別的須要留意的處所 在MySQL中觸及到多表查詢的時刻,須要依據查詢的情形,想好應用哪一種銜接方法效力更高。
1. 穿插銜接(笛卡爾積)或許內銜接 [INNER | CROSS] JOIN
2. 左外銜接LEFT [OUTER] JOIN或許右外銜接RIGHT [OUTER] JOIN 留意指定銜接前提WHERE, ON,USING.
PS:根本的JOIN用法
起首我們假定有2個表A和B,他們的表構造和字段分離為:
表A:
ID Name
1 Tim
2 Jimmy
3 John
4 Tom
表B:
ID Hobby
1 Football
2 Basketball
2 Tennis
4 Soccer
1. 內聯絡:
Select A.Name, B.Hobby from A, B where A.id = B.id
,這是隱式的內聯絡,查詢的成果是:
Name Hobby Tim Football Jimmy Basketball Jimmy Tennis Tom Soccer
它的感化和
Select A.Name from A INNER JOIN B ON A.id = B.id
是一樣的。這裡的INNER JOIN換成CROSS JOIN也是可以的。
2. 外左聯絡
Select A.Name from A Left JOIN B ON A.id = B.id
,典范的外左聯絡,如許查詢獲得的成果將會是保存一切A表中聯絡字段的記載,若無與其絕對應的B表中的字段記載則留空,成果以下:
Name Hobby Tim Football Jimmy Basketball,Tennis John Tom Soccer
所以從下面成果看出,由於A表中的John記載的ID沒有在B表中有對應ID,是以為空,但Name欄仍有John記載。
3. 外右聯絡
假如把下面查詢改成外右聯絡:
Select A.Name from A Right JOIN B ON A.id = B.id
,則成果將會是:
Name Hobby Tim Football Jimmy Basketball Jimmy Tennis Tom Soccer
如許的成果都是我們可以從外左聯絡的成果中猜到的了。
說到這裡年夜家能否春聯結查詢懂得多了?這個本來看來精深的概念一會兒就懂得了,豁然開朗了吧(呵呵,開頑笑了)?最初給年夜家講講MySQL聯絡查詢中的某些參數的感化:
1.USING (column_list):其感化是為了便利書寫聯絡的多對應關系,年夜部門情形下USING語句可以用ON語句來取代,以下面例子:
a LEFT JOIN b USING (c1,c2,c3)
,其感化相當於上面語句
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
只是用ON來取代會書寫比擬費事罷了。
2.NATURAL [LEFT] JOIN:這個句子的感化相當於INNER JOIN,或許是在USING子句中包括了聯絡的表中一切字段的Left JOIN(左聯絡)。
3.STRAIGHT_JOIN:因為默許情形下MySQL在停止表的聯絡的時刻會先讀入左表,當應用了這個參數後MySQL將會先讀入右表,這是個MySQL的內置優化參數,年夜家應當在特定情形下應用,比方曾經確認右表中的記載數目少,在挑選後能年夜年夜進步查詢速度。
最初要說的就是,在MySQL5.0今後,運算次序獲得了看重,所以對多表的聯絡查詢能夠會毛病以子聯絡查詢的方法停止。比方你須要停止多表聯絡,是以你輸出了上面的聯絡查詢:
SELECT t1.id,t2.id,t3.id FROM t1,t2 LEFT JOIN t3 ON (t3.id=t1.id) WHERE t1.id=t2.id;
然則MySQL其實不是如許履行的,厥後台的真正履行方法是上面的語句:
SELECT t1.id,t2.id,t3.id FROM t1,( t2 LEFT JOIN t3 ON (t3.id=t1.id) ) WHERE t1.id=t2.id;
這其實不是我們想要的後果,所以我們須要如許輸出:
SELECT t1.id,t2.id,t3.id FROM (t1,t2) LEFT JOIN t3 ON (t3.id=t1.id) WHERE t1.id=t2.id;