目录
- 1️⃣前言
- 2️⃣交叉连接
- 3️⃣内连接
- 4️⃣左连接和右连接
- 5️⃣子查询
1️⃣前言
📙什么是表连接?
- 表连接一般体现在表与表之间的关系上
- 我们会从多个数据表中读取数据。
- 当我们需要同时显示多个表中的字段时,就可以用表连接来实现。
表连接就是同时查询两个或两个以上的表,简单地说就是我们在查询时,需要显示的数据来自多张表。
📗准备工作
由几个实例,来弄懂表连接的操作。
准备工作如下:
- 创建学生表
- 插入数据
- 因此学生表如下:
- 再创建一张选科类别表:
- 插入数据:
- 因此选课类别表如下:
好了,准备工作完成,接下来就是表连接的操作!
2️⃣交叉连接
💡理解:
- 假如表1有
n
行数据,表2有m
行数据 - 那么
select * from 表1,表2;
就会返回n*m
行数据 - 交叉连接是会产生很多冗余的数据
- 一般我们会结合条件筛选,去掉无用的数据行
🔋实例:
事实上,交叉连接就类似于数学上的笛卡尔积,也就是表中的每一行去和另一张表的每一行进行匹配,形成笛卡尔积。像上述表中的数据,很多是冗余的。我们真正想匹配的数据其实只有几行,具体如下:
所以加上条件查询where s_dept = d_num
后,
结果如下:
3️⃣内连接
💡理解:
- 内连接就是查询多张表的交集
- 也就是公共部分
- 返回两个表中字段匹配关系的记录
- 语法一是隐式内连接
- 语法二是显示内连接
🔋实例:
- 查看每位同学的选科情况
隐式内连接:
显示内连接:
备注:关键字inner
可以省略。
- 查询选科是物化生和历化生的同学有哪些:
- 查询每种选科的学生数:
4️⃣左连接和右连接
🌳左连接的语法:
select * from 表1 left outer join 表2 on 条件;
🌳右连接的语法:
select * from 表1 right outer join 表2 on 条件;
💡理解:
- 左连接是
left outer join
,其表示获取左表的全部记录,右表没有对应匹配也没有关系。 - 右连接是
right outer join
,类似的,右连接与左连接差不多,右连接表示获取右表所有记录,即使左表没有对应匹配。
🔋实例:
左连接如下:
在上述例子中,左表是student
,其中吴九同学的选科编号是5,但是选科表dept
的编号里并没有编号5,虽然没有相应的编号对应上,但是我们使用左连接的方法任然可以使得吴九同学的数据记录给展示出来。无对应上的值用NULL代替。
当然,右连接的使用也类似。
具体如下:
5️⃣子查询
💡理解:
子查询指的是在一个完整的查询语句中,嵌套若干个不同功能的小嵌套,从而一起完成复杂的查询要求。
有时,我们的查询条件是另一个 SQL 语句的查询结果,这时就可以使用子查询。
简单的说,子查询就是select
的嵌套。
🔋实例:
需求1:
- 查询学生表里,年龄最小的学生的所有信息。
首先,我们得知道学生表里年龄最小是多少?做法如下:
其次,了解到学生年龄最小是17岁后,就可以查询年龄为17的学生的信息:
如果用子查询的方法,可以一条语句搞定。
则具体如下:
需求2:
- 查询选科为物化生和历化生的学生信息
这个需求其实可以用子查询或者内连接来实现。
子查询的做法如下:
内连接的做法如下:
需求3:
- 查询选科为历生政并且年龄小于19的学生信息
首先,我们需要知道选科为历生政的信息:
其次,在学生表里查询年龄小于19的学生信息:
所以用子查询的方法如下:
像上面这种查询后返回的是表,那么返回结果必须有一个别名才能实现子查询。
所以说白了,子查询的特点就是将你查询完的结果进行再次利用,嵌套地使用查询语句
好了,表的连接就看到这,希望这篇文章对你有所帮助!