SQL数据连接知识点的讲解(2)

本篇文章要总结数据表的连接涉及查询,所以把要用到的表先展示
班级表classes:(已经开班的班级号为1 2 3 )
在这里插入图片描述
学生表student:
在这里插入图片描述

一、SQL连接

在学生表中查找出已经开班的学生姓名和年龄
select name,age from student where cls_id in (1,2,3);
输出结果:
在这里插入图片描述

二、内连接

1、inner join on

假设不知道班级表中有哪些班级开班了(即不知道班级表中id有哪些),在学生表中找出开班同学姓名和年龄
select student.name,stdent.age from student inner join classes on student.cls_id=classes.id;
简便写法:
select st.name,st.age from student as st inner join classes as cls on st.cls_id=cls.id;
输出结果:
在这里插入图片描述

2、using

简化连接查询:连接的列具有相同的列明和数据类型
由于两张表中相同的列名为id列 一般连接查询方法:
select st.name,st.age from student as st inner join classes as cls on st.id=cls.id;
输出结果:
在这里插入图片描述
简化查询方法:
select st.name,st.age from student as st inner join classes cls using(id);
输出结果:在这里插入图片描述

三、自联结

1 对一个表进行操作

一个表的一列关联到该表的另一列,解决一个表与列之间的关系
查找出id=cls_id两列相等学生姓名
select name from student where id=cls_id;
输出结果:
在这里插入图片描述
把一个表名为两个别名查找某一列的信息
select st.name from student as st inner join student as st1 on st.id=st1.id;
输出结果是学生表所有学生的姓名:
在这里插入图片描述

2、case 多条件判断

case when … then …when … then else… end
----多条件判断
----简单case 函数
select name,(case gender when ‘男’ then 1 when ‘女’ then 2 else 3 end) ‘性别’ from student;
输出结果:
在这里插入图片描述
----case搜索函数
select name,(case when height > 180.0 then ‘第一类’ when height between 170.0 and 179.0 then ‘第二类’ else ‘第三类’ end)‘身高’ from student;
输出结果:
在这里插入图片描述

四、外连接

以一张表为基础取另一张表的数据,没有的空值填充

1、左连接 left join

left join左边的为左表
以学生表作为左表
select * from student left join classes on student.id=classes.id;
输出结果:
在这里插入图片描述
以班级表作为左表
select * from classes left join student on classes.id=student.id;
输出结果:
在这里插入图片描述

2、右连接

以右边的表为基准
先以班级表为基准 和 以班级表为左表查出结果相同
select * from student right join classes on student.id=classes.id;
在这里插入图片描述
以学生表为基准 和 以学生表为左表查出的结果相同
select * from classes right join student on student.id=classes.id;
在这里插入图片描述

五、全连接

union

保证字段名相同且数据类型相同
select name from student union select name from classes;
输出结果:
在这里插入图片描述
如果数据类型不相同出现的结果
select age from student union select name from classes;
输出结果:
在这里插入图片描述

六、交叉连接

cross join

将学生表和班级表进行交叉总共有17乘以3=51行数据
不带有where时候返回的是笛卡尔积行数等于两个表的乘积
select * from student cross join classes;
输出结果较长不再展示。

带有where返回的是匹配的行数,即满足条件的行数
select * from student cross join classes where student.age > 18;
在这里插入图片描述

七、数据合并

1、union

去除重复值
select age from student union select name from classes;
输出结果:
在这里插入图片描述

2、union all

不去除重复值
select age from student union all select name from classes;
输出结果:
在这里插入图片描述

八、子查询

1、标量子查询

(子查询中查出来数值只有一个)
select name from student where cls_id=(select id from classes where name=‘sql01期’);
输出结果:在这里插入图片描述

2、列级子查询

(子查询中查出来的数值不止一个)
select name from student where cls_id in (select id from classes)
输出结果(内连接也可完成):
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值