MySql 数据库多表链接查询的方式
數(shù)據(jù)庫中多表聯(lián)查可以通過連接運(yùn)算實(shí)現(xiàn),即將多張表通過主外鍵關(guān)系關(guān)聯(lián)在一起進(jìn)行查詢,分為非等值查詢和等值查詢兩大類。
一.非等值查詢:
語法:
select * from 表1,表2此查詢方式的實(shí)質(zhì)是笛卡爾積的應(yīng)用,即表1有x行,表2有y行,得到的結(jié)果就是x*y行。因此非等值查詢?cè)趹?yīng)對(duì)數(shù)據(jù)量較小的情況時(shí)可以選擇,但當(dāng)數(shù)據(jù)量龐大時(shí),采用非等值查詢方式會(huì)造成大量的數(shù)據(jù),從而降低效率,因此不推薦使用非等值查詢。
二.等值查詢
語法:
select * from 表1,表2 where 表1.字段1 = 表2.字段2....等值查詢是通過where 后面的判斷條件去獲取自己需要的數(shù)據(jù),可以分為以下三種:
1.左連接: left join
select * from 表1 left join 表2 on 表1.字段1 = 表2.字段1?以left join 左邊的表(表1)為主表,從左表中返回所有的記錄,即便在右表(表2)中沒有匹配的行。如下圖所示:left join取得就是左表紅色區(qū)域的數(shù)據(jù)
取左表中獨(dú)有的數(shù)據(jù):on 的后面,根據(jù)條件進(jìn)行過濾篩選,再生成臨時(shí)查詢結(jié)果。where 的后面,從臨時(shí)查詢結(jié)果中再根據(jù)條件進(jìn)行篩選,生成最終結(jié)果。
select * from A left join Bon A.id = B.id where B.id is null如下圖:
2.右連接:right join?
select * from 表1 right join 表2on 表1.字段1 = 表2.字段1?與 left join 相對(duì)應(yīng),右邊的表(表2)為主表,從右表中返回所有的記錄,即便在左表(表1)中沒有匹配的行。如下圖
取右表獨(dú)有的數(shù)據(jù):
select * from A right join B on A.id = B.id where A.id is null如下圖:?
?
?3.交集:inner join
?
select * from A inner join B on A.id = B.id組合兩個(gè)表中的記錄,只要在公共字段中有相符合的值,都會(huì)被取到,即在表中至少一個(gè)匹配時(shí),就會(huì)返回記錄,實(shí)際結(jié)果為兩張或多張表的交集。
?
注意: inner join不會(huì)統(tǒng)計(jì)空值?
4.并集:union與union all
union與union all都是求多表的并集,但兩種方式得到的結(jié)果截然不同,具體如下。
?union 語法:
select * from A union (select * from B)?取得是下圖中紅色區(qū)域的數(shù)據(jù):
?
可以看到,union合并的是結(jié)果集,不區(qū)分來自于哪一張表,所有可以合并多張表查詢出來的數(shù)據(jù),但是會(huì)過濾掉重復(fù)的數(shù)據(jù)。
注意:
1.當(dāng)表列名不一致時(shí),會(huì)以第一張表的表頭為準(zhǔn)
2.不同數(shù)據(jù)類型可以并到一個(gè)列中
3.如果查詢的表的列數(shù)量不相等是,就會(huì)報(bào)錯(cuò)
4.每個(gè)字句中的的排序是沒有意義的,mysql在進(jìn)行合并的適合會(huì)忽略掉,如需要排序,可以對(duì)合并后的整張表進(jìn)行排序union all 語法:
select * from A union all (select * from B)?取得是下圖中紅色區(qū)域的數(shù)據(jù):
?可以看到,union all 得到的結(jié)果也是結(jié)果的并集,但是不會(huì)把重復(fù)的數(shù)據(jù)過濾掉,而是全部顯示出來。
聯(lián)表查詢中on和where的區(qū)別:
1.on在內(nèi)連接中可省略,外連接不可省略;
2.on在內(nèi)連接中執(zhí)行效果和外連接執(zhí)行效果不同;left join...on查詢不能過濾掉左表中的數(shù)據(jù),而內(nèi)連接on查詢可以過濾掉全局?jǐn)?shù)據(jù)。
3.外連接中on和where不同,on篩選笛卡爾積過濾條件,where篩選具體業(yè)務(wù)
?
總結(jié)
以上是生活随笔為你收集整理的MySql 数据库多表链接查询的方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html打开网页一段时间字幕滚动,网页代
- 下一篇: 软件测试计划的主要内容