SQL多表查询总结
前言
连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。
只有真正了解它们之间的区别,才能正确使用。
一、Union
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。
当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
注意:使用UNION时,两张表查询的结果有相同数量的列、列类型相似。
学生表信息(Students):
| ID | Name | Age | City | MajorID |
|---|---|---|---|---|
| 1 | Jack | 12 | Beijing | 10 |
| 2 | Lucy | 13 | Shanghai | 11 |
教师表信息(Teachers):
| ID | Name |
|---|---|
| 1 | Jack |
| 2 | Mrs Lee |
(1)基本UNION查询,查询学校教师、学生的总的信息表,包括ID和姓名
SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers
查询结果:
| ID | Name |
|---|---|
| 1 | Jack |
| 2 | Lucy |
| 2 | Mrs Lee |
(2)查询教师学生全部姓名
因为UNION只会选择不同的值,如果学生中和教师中有重名的情况,这就需要UNION ALL
SELECT Name FROM Students
UNION ALL
SELECT Name FROM Teachers
查询结果:
| ID | Name |
|---|---|
| 1 | Jack |
| 2 | Lucy |
| 1 | Jack |
| 2 | Mrs Lee |
二、INNER JOIN(内连接)
INNER JOIN(内连接),也成为自然连接
作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。
注意⚠️: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
重点:内连接,只查匹配行。
语法:(INNER可省略)
SELECT fieldlist
FROM table1 [INNER] join table2
ON table1.column=table2.column
学生表信息(Students):
| ID | Name | Age | City | MajorID |
|---|---|---|---|---|
| 1 | Jack | 12 | Beijing | 10 |
| 2 | Lucy | 13 | Shanghai | 11 |
专业信息表(Majors):
| ID | Name |
|---|---|
| 10 | English |
| 15 | Computer |
实例:查询学生信息,包括ID,姓名、专业名称
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN Majors
ON Students.MajorID = Majors.ID
查询结果:
| ID | Name | MajorName |
|---|---|---|
| 1 | Jack | English |
根据结果可以清晰看到,确实只有匹配的行。学生Lucy的信息丢失了。
三、外连接
与内连接相比,即使没有匹配行,也会返回一个表的全集。
外连接分为三种:左外连接,右外连接,全外连接。
对应SQL:LEFT/RIGHT/FULL OUTER JOIN。
通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。
重点:至少有一方保留全集,没有匹配行用NULL代替。
1、LEFT JOIN (左连接)
结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。
依然沿用内链接的例子:
(1)使用左连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID
查询结果:
| ID | Name | MajorName |
|---|---|---|
| 1 | Jack | English |
| 2 | Lucy | Null |
通过结果,我们可以看到左连接包含了第一张表的所有信息,在第二张表中如果没有匹配项,则用NULL代替。
2、RIGHT JOIN (右连接)
右外连接保留了第二个表的所有行,但只包含第一个表与第二个表匹配的行。第一个表相应空行被入NULL值。
右连接与左连接思想类似。只是第二张保留全集,如果第一张表中没有匹配项,用NULL代替
依然沿用内链接的例子,只是改为右连接
(2)使用右连接查询学生的信息,其中包括学生ID,学生姓名和专业名称
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHT JOIN Majors
ON Students.MajorID = Majors.ID
查询结果:
| ID | Name | MajorName |
|---|---|---|
| 1 | Jack | English |
| Null | Null | Computer |
通过结果可以看到,包含了第二张表Majors的全集,Computer在Students表中没有匹配项,就用NULL代替。
3、FULL JOIN (全连接)
会把两个表所有的行都显示在结果表中
(3)使用全连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID
查询结果:
| ID | Name | MajorName |
|---|---|---|
| 1 | Jack | English |
| 2 | Lucy | Null |
| Null | Null | Computer |
包含了两张表的所有记录,没有记录丢失,没有匹配的行用NULL代替。
4、CROSS JOIN(交叉连接)
交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
简单查询两张表组合,这是求笛卡儿积,效率最低。
笛卡儿积:笛卡尔乘积,也叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
(4)交叉连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
查询结果:
| ID | Name | MajorName |
|---|---|---|
| 1 | Jack | English |
| 2 | Lucy | English |
| 1 | Jack | Computer |
| 2 | Lucy | Computer |
(5)查询多表,其实也是笛卡儿积,与CROSS JOIN等价,以下查询同上述结果一样。
这个可能很常见,但是大家一定要注意了,这样就查询了两张表中所有组合的全集。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors
查询结果:
| ID | Name | MajorName |
|---|---|---|
| 1 | Jack | English |
| 2 | Lucy | English |
| 1 | Jack | Computer |
| 2 | Lucy | Computer |
(6)增加查询条件
注意:在使用CROSS JOIN关键字交叉连接表时,因为生成的是两个表的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义搜索条件。
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID
查询结果:
| ID | Name | MajorName |
|---|---|---|
| 1 | Jack | English |
查询结果与INNER JOIN一样,但是其效率就慢很多了。
以上~
SQL多表查询总结的更多相关文章
- sql多表查询之一:Where 和 On的秘密
原文 sql多表查询之一:Where 和 On的秘密 对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术.什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某 ...
- oracle SQL多表查询
SQL多表查询 1.集合理论 1.1 什么是集合 具有某种特定性质的事物的总体. 集合的特性:无序性.互异性.确定性. 一个集合可以小到从一个表中取出一行中的一列. 1 ro ...
- SQL联表查询
数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...
- Sql Server的艺术(四) SQL多表查询
表的基本连接 SQL的一个重要特性就是能通过JOIN关键词,从多个交叉表中查询.分析数据. 连接表的目的 在关系数据库中,数据表设计的一个重要原则就是要避免冗余性. 减少了冗余信息,节省了数据库存储空 ...
- sql多表查询(单表查询略过)
表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...
- sql 多表查询结果验证
1.笛卡尔积 定义: 设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成的有序对,所有这样的有序对组成的集合 ,叫做A与B的笛卡尔积,记作AxB. 上面有一个很关键的词为“有序”,因此,我们 ...
- 【数据库】sql连表查询
SQL总结 连表查询 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两 ...
- Server Sql 多表查询、子查询和分页
一.多表查询:根据特定的连接条件从不同的表中获取所需的数据 多表查询语法: SELECT table1.column, table2.column FROM table1, table2 WHERE ...
- sql 两表查询后 更新某表中部分字段
这是上一个sql更新某表字段的一个延伸,在更新表数据时,实际上会有多表数据查询场景,查询后,只需要更新某一个表中的数据,以下提供两个方法, 第一种使用update 两表查询 update api_ma ...
随机推荐
- Linux 查看本机串口方法
最近在了解嵌入式方面的知识,就随笔记录一下: 查看Linux本机串口: 1.查看串口是否可用 可以对串口发送数据比如对com1口,echo /dev/ttyS02.查看串口名称使用 ls -l /de ...
- 点击eclipse包报错
每次只要新建一个package包,或者鼠标选择某个package包,系统就会提示:An error has occurred. See error log for more details. org/ ...
- .NET MVC 后台接受base64的上传图片
#region 配合前端的多张图片上传 #region 上传图片方法 /// <summary> /// 接口方法 /// </summary> /// <param n ...
- tcpdump抓包具体分析
Tcpdump抓包分析过程 一.TCP连接建立(三次握手) 过程 客户端A,服务器B,初始序号seq,确认号ack 初始状态:B处于监听状态,A处于打开状态 A -> B : seq = x ...
- mysql覆盖索引详解
覆盖索引的定义: 如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引, ...
- Linux 小知识翻译 - 「别名」
实际上,「别名」被用在多种场合下.比如「命令的别名」,「邮件地址的别名」等等. 所以,单独说「别名」的时候,根据不用的场合,代表的意思也不一样. 一般来说,「别名」是指意思差不多的东西. 「别名」的英 ...
- PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记
PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...
- 阿里八八β阶段Scrum(5/5)
今日进度 陈裕鹏: 简单信息抽取编码完成 叶文滔: 处理了信息抽取编码的一些BUG,修复了日程界面不会自动更新添加的日程的BUG,修改了原先测试用的TAG以及数据分析部分数据计算数值错误的问题 王国超 ...
- Mongodb主从模式SECONDARY提升为PRIMARY
生产环境不建议仅使用PRIMARY-SECONDARY模式 当primary挂掉,并且无法恢复时,可以把secondary提升为主节点. 注意:此时从节点可能有部分数据未同步过来,部分数据可能丢失. ...
- Spark LR逻辑回归中RDD转DF中VectorUDT设置
System.setProperty("hadoop.home.dir", "C:\\hadoop-2.7.2"); val spark = SparkSess ...