当前课程知识点:数据库概论 >  第三章 结构化查询语言SQL >  3.4 复杂SQL查询操作1 >  复杂SQL查询操作1

返回《数据库概论》慕课在线视频课程列表

复杂SQL查询操作1在线视频

复杂SQL查询操作1

下一节:复杂SQL查询操作2

返回《数据库概论》慕课在线视频列表

复杂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

第三章 结构化查询语言SQL

-3.1 SQL概述

-- SQL概述

-3.1 SQL概述--作业

-3.2 数据定义DDL

--数据定义DDL

-3.2 数据定义DDL--作业

-3.3 SQL数据更新DML

--SQL数据更新DML

-3.3 SQL数据更新DML--作业

-3.4 复杂SQL查询操作1

--复杂SQL查询操作1

-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1

-3.5 复杂SQL查询操作2

--复杂SQL查询操作2

-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2

第四章 数据库完整性、视图与安全性

-4.1 数据完整性

--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访问数据库

--Java访问数据库

-9.2 Java访问数据库--作业

第十章 其他数据库技术概述

-10.1 数据库新技术概述

--Video

复杂SQL查询操作1笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。