MySql的那些左连接、左外连接、内连接等等

原文链接: https://blog.csdn.net/u012954380/article/details/79672133

首先,我们新建两个表(员工表,和部门表)

    DROP DATABASE db0206;
    CREATE DATABASE db0206;
    USE db0206;
     
    CREATE TABLE `db0206`.`tbl_dept`(  
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `deptName` VARCHAR(30),
      `locAdd` VARCHAR(40),
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB CHARSET=utf8;
     
    CREATE TABLE `db0206`.`tbl_emp`(  
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(20),
      `deptId` INT(11),
      PRIMARY KEY (`id`),
      CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES tbl_dept(id)
    ) ENGINE=INNODB CHARSET=utf8;
    /*插入数据*/
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);

然后,得到两表是这样的

MySql的那些左连接、左外连接、内连接等等_第1张图片

开始愉快的学习吧
1.内连接(内连接就是两张表中都包含的数据,因为部门表包含了员工表,所以内连接就是上图中绿色部分)

SELECT * FROM tbl_dept a INNER JOIN tbl_emp b ON a.id = b.deptId;

MySql的那些左连接、左外连接、内连接等等_第2张图片
可以看出它把员工表中的所有数据都查询出来了,而且连着部门表中相对应的数据也查询出来了


2.左外连接(左外连接就是查询join左边表中的所有数据,并且把join右边表中对应的数据查询出来)

SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;(会查询上图中橙色部分和绿色部分)

MySql的那些左连接、左外连接、内连接等等_第3张图片
从上图中可以看出,由于部门表在join的右边,所以查询会把部门表中所有的数据查询出来。而员工表中没有对应的部门只能显示null了。

如果我们把员工表放join的左边呢?

SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId=b.id;(查询绿色部分)

MySql的那些左连接、左外连接、内连接等等_第4张图片
这样只能把员工表和与之对应的部门表的数据给查询出来了,多余的部门就没有查出来了。就是这么简单
3.右外连接(与左外连接正好相反,它查询的是join右边的部分)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId;(查询绿色部分)

MySql的那些左连接、左外连接、内连接等等_第5张图片

4左连接(其实就是在左外连接在后面加了一个where条件,查询只存在于join左边表的内容)

SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;(图中橙色部分)

MySql的那些左连接、左外连接、内连接等等_第6张图片
5.右连接(和左连接相反,查询只存在于join右边表的数据)

SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId WHERE a.id IS NULL;(由于部门表包含了所有的员工表,所以查出来的是空)


6.-- 全连接(查询俩张表的全部内容)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptId
UNION
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;(其实就是一个左外连接加一个右外连接,所以把图中橙色部分和绿色部分都查出来了)

MySql的那些左连接、左外连接、内连接等等_第7张图片

7.-- (两张表中都没有同时出现的数据集)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptId WHERE a.id IS NULL
UNION
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;(也就是图中橙色部分)

MySql的那些左连接、左外连接、内连接等等_第8张图片

完整代码如下

    DROP DATABASE db0206;
    CREATE DATABASE db0206;
    USE db0206;
     
    CREATE TABLE `db0206`.`tbl_dept`(  
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `deptName` VARCHAR(30),
      `locAdd` VARCHAR(40),
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB CHARSET=utf8;
     
    CREATE TABLE `db0206`.`tbl_emp`(  
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(20),
      `deptId` INT(11),
      PRIMARY KEY (`id`),
      CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES tbl_dept(id)
    ) ENGINE=INNODB CHARSET=utf8;
    /*插入数据*/
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);
     
    INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);
     
     
    -- 内连接(查询两个表都存在的内容)
    SELECT * FROM tbl_dept a INNER JOIN tbl_emp b ON a.id = b.deptId;
     
     
    -- 左外连接(查询join左边表的全部内容)
    SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;
    SELECT * FROM tbl_dept LEFT JOIN tbl_emp ON tbl_dept.id = tbl_emp.deptId;
     
    SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId=b.id;
    SELECT * FROM tbl_emp LEFT JOIN tbl_dept ON tbl_emp.deptId=tbl_dept.id;
     
     
    -- 右外连接(查询join右边表的全部内容)
    SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId;
     
    SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id;
     
     
    -- 左连接(查询只存在于join左边表的内容)
    SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;
     
    SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id WHERE b.id IS NULL;
     
    -- 右连接(查询只存在于join右边表的内容)
    SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId WHERE a.id IS NULL;
     
    SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId IS NULL;
     
     
    -- 全连接(查询俩张表的全部内容)
    SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptId
    UNION
    SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;
     
    -- 两张表中都没有出现的数据集
    SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptId WHERE a.id IS NULL
    UNION
    SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;

版权声明:本文为CSDN博主「为湖」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012954380/article/details/79672133

你可能感兴趣的:(MySql的那些左连接、左外连接、内连接等等)