日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

一篇文章读懂MySQL的各种联合查询

發(fā)布時間:2025/3/12 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇文章读懂MySQL的各种联合查询 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一篇文章讀懂MySQL的各種聯(lián)合查詢

聯(lián)合查詢是指將兩個或兩個以上的表的數(shù)據(jù)根據(jù)一定的條件合并在一起!

聯(lián)合查詢主要有以下幾種方式:

  • 全連接:將一張表的數(shù)據(jù)與另外一張表的數(shù)據(jù)彼此交叉聯(lián)合查詢出來
    舉例如下:
    先建兩張表:
  • CREATE TABLE `t_dept` (`id` int(11) NOT NULL AUTO_INCREMENT,`deptName` varchar(30) DEFAULT NULL,`address` varchar(40) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8` CREATE TABLE `t_emp` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` int(3) DEFAULT NULL,`sex` varchar(255) DEFAULT NULL COMMENT '性別',`deptId` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_dept_id` (`deptId`) ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8

    插入數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。