程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中根本的多表銜接查詢教程

MySQL中根本的多表銜接查詢教程

編輯:MySQL綜合教程

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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved