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


在这里插入图片描述
建表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连接

1.左连接(左外连接)

left join = left outer join
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.右连接(右外连接)

right join = right outer join
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.A表的独有

在这里插入图片描述
在这里插入图片描述

4.内连接

在这里插入图片描述
在这里插入图片描述

5.B表的独有

在这里插入图片描述
在这里插入图片描述

6.全表外连接

在这里插入图片描述
在这里插入图片描述

7.全连接

在这里插入图片描述

在这里插入图片描述

8.自连接

如果要来连接的表中有列名相同,并且连接的条件就是列名相等,那么on条件可以换成using字句
在这里插入图片描述

再举个例子有如下表:
在这里插入图片描述
假设发现某物品(ID为DINTR)存在问题,想知道生产该物品的供应商所生产的其他物品是否出现问题
,可以通过子查询解决
在这里插入图片描述
也可用自连接
在这里插入图片描述
由于两个表是相同的表,需要为各表取别名防止歧义性。
通常自来连接比子查询快得多,因为使用子查询的时候需要创建临时表,使用完后还得销毁

9.自然连接

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

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值