一篇文章读懂MySQL的各种联合查询
一篇文章讀懂MySQL的各種聯(lián)合查詢
聯(lián)合查詢是指將兩個或兩個以上的表的數(shù)據(jù)根據(jù)一定的條件合并在一起!
聯(lián)合查詢主要有以下幾種方式:
舉例如下:
先建兩張表:
插入數(shù)據(jù):
INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('3', '令狐沖', '24', NULL, '1'); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('4', '洪七公', '70', NULL, '2'); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('5', '喬峰', '35', NULL, '2'); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('6', '滅絕師太', '70', NULL, '3'); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('7', '周芷若', '20', NULL, '3'); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('8', '張三豐', '100', NULL, '4'); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('9', '張無忌', '25', NULL, '5'); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('10', '韋小寶', '18', NULL, NULL); INSERT INTO `t_emp` (`id`, `name`, `age`, `sex`, `deptId`) VALUES ('26', 'lin', '12', NULL, '12'); INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('1', '華山', '華山'); INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('2', '丐幫', '洛陽'); INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('3', '峨眉', '峨眉山'); INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('4', '武當(dāng)', '武當(dāng)山'); INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('5', '明教', '光明頂'); INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('6', '少林', '少林寺'); INSERT INTO `t_dept` (`id`, `deptName`, `address`) VALUES ('7', '華山', '北京');全連接是將表1的數(shù)據(jù)一條一條的與表2的數(shù)據(jù)進行拼接,產(chǎn)生table1table2條數(shù)據(jù)
全連接測試:
可以看到,表的數(shù)據(jù)是79條,字段的個數(shù)是3+3個,不過這種查詢沒什么意義,讓我們來看一下內(nèi)連接;
內(nèi)連接
內(nèi)連接進行查詢的過程是:將表A的數(shù)據(jù)一條一條拿出來跟表B的數(shù)據(jù)進行對比,滿足條件的數(shù)據(jù)就保留下來
測試如下:
外連接:外連接有兩種類型,左外連接和右外連接,外連接和內(nèi)連接的區(qū)別是,無論表A與表B是否有符合條件的數(shù)據(jù),主表都會保留,這里的主表是指左連接時左邊的表,右連接時右邊的表;
1). 左連接:關(guān)鍵字是left join,直接看數(shù)據(jù),更好理解
可以看到,左表(主表)的數(shù)據(jù)都保留下來了
2). 右連接
可以看到,右表(主表)的數(shù)據(jù)都保留下來了
介紹一下using關(guān)鍵字:
連接過程:
1、在進行連接查詢中,使用on的地方就可以用using來代替,不過前提是,進行聯(lián)合的條件的字段是同名的
2、如果使用using關(guān)鍵字來進行聯(lián)合,最終相同的字段只會顯示一個!
left join后面的篩選語句用where和on的區(qū)別:
其實主要就是sql語句執(zhí)行的順序不同,導(dǎo)致執(zhí)行的結(jié)果也不一樣,大家記得留意這個問題,很容易踩坑,where語句執(zhí)行比on偏后,所以使用where來篩選其實就是聯(lián)合查詢之后再進行篩選的。下面舉個例子:(還是使用上面的數(shù)據(jù))
第一個是不帶where和and 的左連接,上面已經(jīng)介紹,這里不再贅述
第二個是帶where語句,可以看到,其實就是再第一個的基礎(chǔ)上進行篩選
第三個和第四個是帶on語句,我們可以看到帶on語句之后,left join左邊的表是沒變化的,都是全表,而left join右邊的表卻得到篩選了,為什么會這樣?這是因為on的執(zhí)行順序在join執(zhí)行順序之前,見下圖:
所以就算添加了on的篩選語句,它其實是先篩選右表的數(shù)據(jù),然后再用左表與剩余的右表數(shù)據(jù)進行連接查詢
好了,今天的內(nèi)容就到此為止了,后續(xù)會不斷的更新,歡迎大家點贊關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的一篇文章读懂MySQL的各种联合查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring源码分析第一天------源
- 下一篇: linux cmake编译源码,linu