数据库技术课程复习6---MySQL语言(3)(多表查询---连接查询,嵌套查询,集合查询)

0.学习前言

多表查询是最为实用的部分,值得好好学习掌握,一起加油鸭!


在这里插入图片描述

1.连接查询

1.1等值连接查询

等值连接:连接运算符为=
[例] 查询每个学生及其选修课程的情况

SELECT  Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno;

自然连接:把重复的列去掉

SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE  Student.Sno = SC.Sno;

1.2自身连接

自身连接:一个表与其自己进行连接,需要给表起别名以示区别,由于所有属性名都是同名属性,因此必须使用别名前缀。

[例] 查询每一门课的间接先修课(即先修课的先修课)

SELECT  FIRST.Cno,SECOND.Cpno FROM  Course  FIRST,Course  SECOND WHERE FIRST.Cpno = SECOND.Cno;

1.3外连接

外连接与普通连接的区别:
普通连接操作只输出满足连接条件的元组。外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。

SELECT * FROM Course FIRST RIGHT JOIN Course SECOND ON (FIRST.Cpno=SECOND.Cno); 

A left join B: 是以A表的记录为基础的,A的每一条记录依次和B连接,A的记录将会全部表示出来,而B只会显示符合连接条件的记录.
A right join B: 是以B表的记录为基础的,B的每一条记录依次和A连接,B的记录将会全部表示出来,而A只会显示符合连接条件的记录

1.4复合条件连接

复合条件连接:WHERE子句中含多个连接条件
: 查询选修2号课程且成绩在90分以上的所有学生的学号和姓名

SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND Cno= ‘2’ AND Grade > 90;

2.嵌套查询

2.1嵌套查询概述

一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
子查询不能使用ORDER BY子句,有些嵌套查询可以用连接运算替代。
可分为相关子查询不相关子查询
相关子查询:子查询的查询条件依赖于父查询
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表。然后再取外层表的下一个元组。重复这一过程,直至外层表全部检查完为止。

2.2带有IN谓词的子查询

[例] 查询与“刘三姐”在同一个系学习的学生。
思路:首先找到刘三姐所在的系,然后找到这个系里所有的学生。

SELECT Sno,Sname,Sdept FROM Student WHERE Sdept  IN
   (SELECT Sdept FROM Student WHERE Sname= ‘ 刘三姐 ’)

此查询为不相关子查询。

三重嵌套例子:
在这里插入图片描述
上例也可以用连接查询实现:

SELECT Student.Sno,Sname
	FROM Student,SC,Course
		WHERE Student.Sno=SC.Sno 
			AND SC.Cno=Course.Cno 
				AND Course.Cname='DB_DESIGN';

2.3带有比较运算符的子查询

当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。
与ANY或ALL谓词配合使用
在这里插入图片描述
这是一个相关子查询。

2.4带有ANY(SOME)或ALL谓词的子查询

谓词语义
ANY:任意一个值(只要有一个值)
ALL:所有值
在这里插入图片描述
上例还可以用聚集函数实现:思路是只要比最大的那个小就满足条件了。<>表示不等于。

SELECT Sname,Sage
     FROM   Student
     WHERE 
     	Sage < (SELECT MAX(Sage)
                               FROM Student
                               WHERE Sdept= ‘CS ')
           AND Sdept <> ' CS ’;

2.5带有EXISTS谓词的子查询

EXISTS谓词 是存在量词 ∃ \exist
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
若内层查询结果非空,则外层的WHERE子句返回
若内层查询结果为,则外层的WHERE子句返回
由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
[例] 查询所有选修了1号课程的学生姓名。
用嵌套查询

SELECT Sname
     FROM Student
     WHERE EXISTS
         (SELECT * FROM SC
             WHERE Sno=Student.Sno AND Cno= ' 1 ')

用连接查询

SELECT Sname
	FROM Student, SC
		WHERE Student.Sno=SC.Sno AND SC.Cno= '1';

由于SQL语言中没有全称量词 ∀ \forall ,可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:没有一个不
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.集合查询

参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
集合操作的种类:
并操作UNION
交集

笛卡尔积

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值