当前课程知识点:数据库概论 > 第三章 结构化查询语言SQL > 3.4 复杂SQL查询操作1 > 复杂SQL查询操作1
各位同学大家好我是来自云南大学软件学院的张璇
下面为大家介绍较为复杂的SQL查询操作
首先我们介绍子查询
子查询是在Select命令中增加IN子句比较运算符子句或者EXISTS子句
来看看IN子句
先举一个简单的例子
我们要查询计算机系和外语系学生的姓名和性别
那就写为Select sname, gender
这是我们前面说过的from S 从学生表里面选区
where条件呢
dept IN ('计算机', '外语')
这里IN子句相当于给了一个条件集合
所有符合这个集合中任一元素的查询目标我们都需要
当然
我们说SQL查询命令可以有多种形式
这里的IN子句
实际上可以改写为dept ='计算机' ORdept='外语'
不过
当IN子句指定的集合元素比较多的时候
自然使用后一种方式显然就很麻烦
因此
IN子句也是非常有用的
IN子句也是非常有用的
另外
我们使用IN子句
还可以指定查询条件来自于另外一个数据表
比如说
我们查询选修了课程名为“数据库概论”的学生学号和姓名
注意这里的查询条件是课程名称
存放在课程表C中
而学生的学号和姓名在学生表S中
学生选课的信息又放在成绩表SC中
所以
我们这么来查询
我们要查询的目标学生学号s#
和姓名sname放在select后面
而这两个列的数据在学生表s里面
from后面就是学生表标识符s
而条件是学生选了 数据库概论 课程
学生的选课数据在成绩表SC中
因此
where条件是
找学号在成绩表中的
那些选修了 数据库概论 课程的学生
因此
用in子句在sc表中找学生
但因为课程名称在课程表c中
因此
还需要再嵌套增加一个IN子句
这个子句在C表中设定课程名称cname为 数据库概论
select查询目标是课程号c#
把查询得到的课程号c#返回到成绩表sc中
对应查询选课的学生
返回学号s#
在学生表中找出学号s#和学生姓名sname
如果不用IN子句的子查询方式
我们也可以得到同样的查询结果
用什么其他方式呢
我们后面介绍
我们下面把子查询介绍完
除了IN子句
我们还可以使用
> < =等
比较运算符
同时配合使用ANY|SOME或ALL谓词
ANY和SOME一样
表示比较子查询结果的某个值
ALL则表示比较所有值
举个例子
如果要查询非计算机系的其他系中
比计算机系所有学生入学年龄小的学生学号
姓名 年龄和所在系
怎么做呢
首先
select后面放查询目标
s#是学号
姓名sname
入学年龄age和所在系dept
这些数据都在学生表中
所以呢
from s 就可以了
from s 就可以了
条件是入学年龄要小于计算机系的所有学生
因此
where条件是age小于所有ALL
子查询里面就是计算机系学生的入学年龄
这个比较简单
就是查找一下 计算机系学生的年龄用 select age from s
where dept =‘计算机’
当然还需要增加一个条件
我们查询得到的学生不要计算机系的
是其他系的
因此
增加一个and条件dept<>'计算机'
由于计算机系所有学生的入学年龄不是18岁
就是19岁
因此
查询结果是入学年龄小于18岁的其他系学生
我们得到两位17岁入学的旅游系学生数据
最后一个子查询操作是用EXISTS谓词
带有EXISTS谓词的子查询它不返回任何数据
只产生逻辑真值 true
或逻辑假值 false
例如
查询所有选修了c1课程的学生学号和姓名
select s#
sname from s就不用说明了
我们看下子查询部分
使用EXISTS 子句
由于子查询返回结果我们不需要知道查询结果值
因此
子查询通常不需要指定列名
这里用*就可以
在子查询中
我们从成绩表SC中设置条件
成绩表sc中的学号s#等于学生表s中的学号s#
并且成绩表中的课程号为c1
当有学生选修了课程c1
则子查询结果非空
就返回真值
把选修了c1课程的学生返回出来
当然
这个EXISTS子查询我们完全可以用前面的IN子查询方式来写
怎么写
请大家自己尝试一下
前面我们介绍的是子查询
但其实我们是可以用其他查询语句替代子查询的
下面
来介绍一下Join谓词
我们可以使用Join谓词将两个数据表连接
实现两个及两个以上数据表的联合查询
使用Join谓词的SQL查询语法如下
两个数据表之间使用不同的连接方式
两个数据表之间使用不同的连接方式
即join_type
连接
然后在ON后面指定用于连接数据表的列
也就是说
当这个列下面有相同数据时
对应记录行进行连接
连接方式join_type有两类
INNER连接和OUTER连接
我们下面先介绍INNER连接
INNER联接基于列值之间的相等性
只有两个表之间联接列数值相等的行记录才在结果集中返回
如果不指定联接JOIN的操作类型
就默认为INNER
我们举个例子就更容易明白
假设
我们要查询
学生的学号姓名和课程成绩
这里查询目标在两个数据表中
第一个是是学生数据表
第二个是成绩表sc
学生的学号和姓名在学生表s中
而课程成绩在成绩表中
我们用JOIN谓词这样写SQL语句
Select S.s#, sname, c#, grade from S [INNER] JOIN SC ON S.s#=SC.s#
由于要连接 SC表
所以就 join SC
这里的INNER
可以省略掉
因为它是是默认的另连接方式
On 后面指定相应用什么列进行连接
那就是S.s#=SC.s#
在这里我们注意到了
Select后面的s#我们前面限定了S.
意思是学号专门从学生表S中返回
意思是学号专门从学生表S中返回
因为成绩表SC中也有学生学号
所以这里限定一下
而外要条件也做了类似的限定
而其他查询的列标识符我们前面没有限定
是因为这些列没有同时在两个数据表中出现
ON后面指定连接学生表S和成绩表SC的列是学生学号s#
这里分别加上数据表的限定
那么
这里分别加上数据表的限定
那么
得到的结果就是
当学生表中的学号与成绩表中的学号一致时
我们就把对应的数据记录连接起来
我们就得到了学生的学号姓名
和对应的选课课号和成绩
很明显
使用JOIN谓词写的这个查询语句
可以用子查询方式得到同样的查询结果
使用哪一种方式
各位同学根据自己的思维方式来选择
接下来
我们再介绍一种等价形式
可以同样查询到学生的学号 姓名和课程成绩
在这里我们注意到
在这里我们注意到
我们唯一不同在于
我们唯一不同在于
from 后面 我们只需要使用S,SC
from 后面 我们只需要使用S,SC
这里我们没有使用Join
这里我们没有使用Join连接词意味着也是把数据表联系起来
并且在where里面写上相应连接的列即可
所以
我们有了第三种等价SQL语句形式
现在
我们了解了INNER JOINT的使用
那么
还有一种OUTER JOIN会得到什么不同的结果呢
我们一起来看看
OUTER JOIN是这样
它返回连接两个表中的所有行
如果连接表中指定连接的列没有相等的数据
那么返回结果中没有数据的列显示为空NULL
还是用举例的方式来说明
如果我们要查询所有学生的选课信息
包括没有选课的学生
这时候就需要用OUTER JOIN
SQL语句这样写
from后面学生表与成绩表连接时
我们使用LEFT OUTER JOIN
结果是所有学生的选课数据都有
其中有一个学生没有选课
那么
他的课程号和成绩为空NULL
这里的LEFT意思是返回左边数据表的所有数据
对于右边数据表SC没有对应匹配数据的
就显示为空NULL
那如果我们把LEFT改为RIGHT呢
很自然就是反过来
返回右边数据表SC的所有数据
对于左边数据表S没有对应匹配数据的时候
显示为空NULL
我们得到的结果是这样
刚刚没有选课的那个学生就不在返回结果中了
那么
这个SQL命令的意思是
返回学生的选课数据
包括选课了未登记进S表的学生
而FULL OUTER JOIN
自然就是返回所有
LEFT OUTER JOIN和RIGHT OUTER JOIN的数据
我们就不重复解释了
以上
我们介绍了稍微复杂一点点的SQL查询操作
主要介绍的是子查询和连接JOIN查询
它们本质上都是连接数据表的查询
也常常会使用到d
下面
我们再看看其他SQL查询操作
谢谢大家
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video