国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

實(shí)例講解MySQL聯(lián)合查詢

2024-07-24 12:36:41
字體:
供稿:網(wǎng)友

在mysql中聯(lián)合查詢有,內(nèi)聯(lián)、左聯(lián)、右聯(lián)、全聯(lián),這些了,下面我來邊講例子邊講語法告訴你聯(lián)合查詢用法與性能對比,希望例子對你會帶來一些幫助.

sql內(nèi)聯(lián)語法基礎(chǔ)語法(inner join):

SELECT * FROM 表1 inner join 表2 on 表1.userid=表2.userid

sql內(nèi)聯(lián)語法說明:上面的語句就是查詢表1和表2兩個表,只要兩個表中的userid字段相同的話就拼成一行顯示出來.

注:以上語法同等select * from 表1,表2 where 表1.userid=表2.userid,而使用sql內(nèi)聯(lián)的話,將會提高很多效率.

sql左聯(lián)語法基礎(chǔ)語法(left outer join):

SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 表1.userid=表2.userid

sql左聯(lián)語法說明:顯示表1中所有的行,并且把表2中所有符合條件的數(shù)據(jù)都顯示到結(jié)果集中,如果表2中不符合的數(shù)據(jù)的都不會顯示在結(jié)果集中,并且以null顯示。

sql右聯(lián)語法基礎(chǔ)語法(right outer join):

SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.userid=表2.userid

sql左聯(lián)語法說明:顯示表2中所有的行,并且把表1中所有符合條件的數(shù)據(jù)都顯示到結(jié)果集中,如果左表1中不符合的數(shù)據(jù)的都不會顯示在結(jié)果集中,并且以null顯示。

sql全聯(lián)語法基礎(chǔ)語法(full outer join):

SELECT * FROM 表1 FULL OUTER JOIN 表2 ON 表1.userid=表2.userid

sql左聯(lián)語法說明:以上sql全聯(lián)意思就是顯示表1和表2所有行,簡單的說吧,就是把表1和表2所有行都組合起來,之后再過濾掉重復(fù)的數(shù)據(jù)并顯示到結(jié)果集中。

好了下面我來看性能比較 內(nèi)聯(lián)、左聯(lián)、右聯(lián)、全聯(lián)

T1表結(jié)構(gòu)(用戶名,密碼)userid(int)   usernamevarchar(20)   passwordvarchar(20)

1   jack   jackpwd

2   owen   owenpwd

T2表結(jié)構(gòu)(用戶名,密碼)  userid(int)   jifenvarchar(20)   dengjivarchar(20)

1   20   3

3   50   6

第一:內(nèi)聯(lián),inner  join.

如果想把用戶信息、積分、等級都列出來,那么一般會這樣寫:select * from T1 ,T3 where T1.userid = T3.userid(其實(shí)這樣的結(jié)果等同于select * from T1 inner join T3 on T1.userid=T3.userid )。

把兩個表中都存在userid的行拼成一行(即內(nèi)聯(lián)),但后者的效率會比前者高很多,建議用后者(內(nèi)聯(lián))的寫法。

SQL語句,代碼如下:

select * from T1 inner join T2 on T1.userid=T2.userid 

運(yùn)行結(jié)果:

T1.userid   username   password   T2.userid   jifen   dengji

1   jack   jackpwd   1   20   3

第二:左聯(lián)(left outer join).

顯示左表T1中的所有行,并把右表T2中符合條件加到左表T1中,右表T2中不符合條件,就不用加入結(jié)果表中,并且NULL表示.

SQL語句,代碼如下:

select * from T1 left outer join T2 on T1.userid=T2.userid 

運(yùn)行結(jié)果:T1.userid   username   password   T2.userid   jifen   dengji

1   jack   jackpwd   1   20   3

2   owen   owenpwd   NULL   NULL   NULL

第三:右聯(lián)(right outer join).

顯示右表T2中的所有行,m.survivalescaperooms.com 并把左表T1中符合條件加到右表T2中,左表T1中不符合條件,就不用加入結(jié)果表中,并且NULL表示.

SQL語句,代碼如下:

select * from T1 right outer join T2 on T1.userid=T2.userid 

運(yùn)行結(jié)果:T1.userid   username   password   T2.userid   jifen   dengji

1   jack   jackpwd   1   20   3

NULL   NULL   NULL   3   50   6

第四:全聯(lián)(full outer join),顯示左表T1、右表T2兩邊中的所有行,即把左聯(lián)結(jié)果表+右聯(lián)結(jié)果表組合在一起,然后過濾掉重復(fù)的.

SQL語句,代碼如下:

select * from T1 full outer join T2 on T1.userid=T2.userid 

運(yùn)行結(jié)果:T1.userid   username   password   T2.userid   jifen   dengji

1   jack   jackpwd   1   20   3

2   owen   owenpwd   NULL   NULL   NULL

NULL   NULL   NULL   3   50   6

union的用法,代碼如下:

  1. select * from 
  2.  
  3. (SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND `subject` LIKE '%調(diào)整圖片%' ORDER BY `add_time` DESC
  4.  
  5. as t1 
  6.  
  7. union all 
  8.  
  9. select * from 
  10.  
  11. (SELECT `id`,`class_name` AS `subject` FROM `web_class` WHERE `active`='1' AND `class_name` LIKE '%調(diào)整圖片%' ORDER BY `class_id` DESC
  12.  
  13. as t2 
  14.  
  15. union 
  16.  
  17. select * from 
  18.  
  19. (SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND (`subject` LIKE '%調(diào)整%' OR `subject` LIKE '%圖片 www.111cn.Net %'ORDER BY `add_time` DESC
  20.  
  21. as t3; 

以上SQL語句的聯(lián)合查詢主要用到了union all和union,至于這兩者的區(qū)別就是union all會列舉所有符合條件的查詢結(jié)果,而union會將所有符合條件的查詢結(jié)果做一下去除重復(fù)結(jié)果的篩選.

對于以上SQL語句的解釋就是由于article表和web_class表分屬兩個不同的表,所以這里不用去除重復(fù)結(jié)果。然而以上聯(lián)合查詢的第三個分支的sql查詢語句是由分詞然后組合出來的查詢語句,這條sql語句查詢的結(jié)果是肯定包含第一個分支sql語句的查詢結(jié)果的,這里就顯得沒必要了,所以沒有使用all而去掉重復(fù)的查詢結(jié)果。

最后要說的就是,在MySQL5.0以后,運(yùn)算順序得到了重視,所以對多表的聯(lián)結(jié)查詢可能會錯誤以子聯(lián)結(jié)查詢的方式進(jìn)行,譬如你需要進(jìn)行多表聯(lián)結(jié),因此你輸入了下面的聯(lián)結(jié)查詢,代碼如下:

  1. SELECT t1.id,t2.id,t3.id 
  2. FROM t1,t2 
  3. LEFT JOIN t3 ON (t3.id=t1.id) 
  4. WHERE t1.id=t2.id; 

但是MySQL并不是這樣執(zhí)行的,其后臺的真正執(zhí)行方式是下面的語句,代碼如下:

  1. SELECT t1.id,t2.id,t3.id 
  2. FROM t1,(  t2 LEFT JOIN t3 ON (t3.id=t1.id)  ) 
  3. WHERE t1.id=t2.id; 

這并不是我們想要的效果,所以我們需要這樣輸入,代碼如下:

  1. SELECT t1.id,t2.id,t3.id 
  2. FROM (t1,t2) 
  3. LEFT JOIN t3 ON (t3.id=t1.id) 
  4. WHERE t1.id=t2.id; 

在這里括號是相當(dāng)重要的,因此以后在寫這樣的查詢的時候我們不要忘記了多寫幾個括號,至少這樣能避免很多錯誤,因?yàn)檫@樣的錯誤是很難被開發(fā)人員發(fā)現(xiàn)的.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 六枝特区| 泊头市| 沙田区| 长顺县| 惠安县| 龙州县| 英德市| 富顺县| 顺平县| 常熟市| 新干县| 虞城县| 苏尼特左旗| 水富县| 巴南区| 竹溪县| 鄂尔多斯市| 青神县| 台湾省| 吉木乃县| 盐津县| 枣强县| 大安市| 天峨县| 石嘴山市| 兰考县| 苏尼特左旗| 钟山县| 仪征市| 芜湖县| 抚远县| 汾西县| 华坪县| 长海县| 巴楚县| 霍山县| 涞水县| 霍山县| 乌海市| 怀仁县| 循化|