数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)

文章目录

  • 7种join连接
    • 1.左连接(左外连接)
    • 2.右连接(右外连接)
    • 3.A表的独有
    • 4.内连接
    • 5.B表的独有
    • 6.全表外连接
    • 7.全连接
  • 8.自连接
  • 9.自然连接

数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第1张图片
建表sql语句

drop table if exists t_dept;
 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=1 DEFAULT CHARSET=utf8;
 
drop table if exists t_emp;
CREATE TABLE `t_emp` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(20) DEFAULT NULL,
  `age` INT(3) DEFAULT NULL,
 `deptId` INT(11) DEFAULT NULL,
empno int  not null,
 PRIMARY KEY (`id`),
 KEY `idx_dept_id` (`deptId`)
 #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
 INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');
 
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
 INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010);

多表连接有两种方式:全连接和join连接
全连接:将各个表用逗号隔开,就制定了一个全连接。如果语句如下:

select * from t_emp ,t_dept;

直接就变成了所谓的笛卡尔积,即行数为左边行数*右表行数
在这种情形下,通常需要使用where字句限定条件,称为等值连接
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第2张图片

7种join连接

1.左连接(左外连接)

left join = left outer join
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第3张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第4张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第5张图片

2.右连接(右外连接)

right join = right outer join
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第6张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第7张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第8张图片

3.A表的独有

数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第9张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第10张图片

4.内连接

数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第11张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第12张图片

5.B表的独有

数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第13张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第14张图片

6.全表外连接

数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第15张图片
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第16张图片

7.全连接

数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第17张图片

数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第18张图片

8.自连接

如果要来连接的表中有列名相同,并且连接的条件就是列名相等,那么on条件可以换成using字句
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第19张图片

再举个例子有如下表:
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第20张图片
假设发现某物品(ID为DINTR)存在问题,想知道生产该物品的供应商所生产的其他物品是否出现问题
,可以通过子查询解决
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第21张图片
也可用自连接
数据库的7种Join查询,左右连接、左右外连接、内连接、全表连接、全表外连接(图解版,带建表语句)_第22张图片
由于两个表是相同的表,需要为各表取别名防止歧义性。
通常自来连接比子查询快得多,因为使用子查询的时候需要创建临时表,使用完后还得销毁

9.自然连接

select columns from table1 natural join table2;
有些列名在两个表是共有的(名字相同,属性相同),但是连接两个表时,不列出相同的两个列名就可以用自然连接,使相同列名只返回一次,是特殊的等值连接

你可能感兴趣的:(数据库,数据库,mysql,sql)