SQL连接、嵌套和集合查询
一:连接查询
1 、不同表之间的连接查询
例 查询每个学生及其选修课程的情况。
本查询实际上是涉及Students与Reports两个表的连接操作。这两个表之间的联系是通过公共属性Sno实现的,因此,其操作命令为:
SELECT Students.*, Reports.*
FROM Students, Reports
WHERE Students.Sno = Reports.Sno;
说明:若在以上等值连接中把目标列中重复的属性列去掉则为自然连接,其命令为
SELECT Students.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Students, Reports
WHERE Students.Sno= Reports.Sno;
例 查询每个学生的学号(Sno)、姓名(Sname)、选修的课程名(Cname)及成绩(Grade)。
本查询涉及到三个表的连接操作,完成该查询的SQL语句如下:
SELECT Students.Sno, Sname, Cname, Grade
FROM Students, Reports, Courses
WHERE Students.Sno= Reports.Sno AND Reports.Cno=Courses.Cno;
2、 自身连接
例 查询每一门课的间接先修课(即先修课的先修课)。
在 Courses表关系中,只有每门课的直接先修课信息,而没有先修课的先修课。要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课程。这就需要要将Courses表与其自身连接。为方便连接运算,这里为Courses表取两个别名分别为A,B。则完成该查询的SQL语句 为:
SELECT A.Cno, A.Cname, B.Pre_Cno
FROM Courses A, Courses B
WHERE A.Pre_Cno =B.Cno;
二:嵌套查询
1、带谓词IN的嵌套查询
例 查询选修了编号为“C02”的课程的学生姓名(Sname)和所在系(Sdept)。
SELECT Sname, Sdept
FROM Students
WHERE Sno IN
(SELECT Sno
FROM Reports
WHERE Cno='C02');
例 查询与“李伟”在同一个系学习的学生学号(Sno)、姓名(Sname)和系名(Sdept)。
该查询可构造嵌套查询实现,其SQL语句如下:
SELECT Sno, Sname, Sdept
FROM Students
WHERE Sdept IN
(SELECT Sdept
FROM Students
WHERE Sname=’李伟’);
说明:本例中的查询也可以用自身连接来完成,其SQL语句如下:
SELECT A.Sno , A.Sname , A.Sdept
FROM Students A , Students B
WHERE A.Sdept=B.Sdept AND B.Sname=’李伟’;
例 查询选修了课程名为“数据结构”的学生学号(Sno)和姓名(Sname)。
本查询涉及学号、姓名和课程名(Cname)三个属性。学号和姓名存放在Students表中,课程名的存放在Courses表中,但Students与 Courses两个表之间没有公共属性,必须通过Reports表建立它们之间的联系。所以本查询实际上涉及三个关系的连接操作。
SELECT Sno, Sname
FROM Students
WHERE Sno IN
(SELECT Sno
FROM Reports
WHERE Cno IN
(SELECT Cno
FROM Courses
WHERE Cname = ‘数据结构’));
说明:本查询同样可以用连接查询实现:
SELECT S.Sno, Sname
FROM Students S, Reports R, Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno AND C.Cname='数据结构';
1、带谓词IN的嵌套查询
例 查询选修了编号为“C02”的课程的学生姓名(Sname)和所在系(Sdept)。
SELECT Sname, Sdept
FROM Students
WHERE Sno IN
(SELECT Sno
FROM Reports
WHERE Cno='C02');
例 查询与“李伟”在同一个系学习的学生学号(Sno)、姓名(Sname)和系名(Sdept)。
该查询可构造嵌套查询实现,其SQL语句如下:
SELECT Sno, Sname, Sdept
FROM Students
WHERE Sdept IN
(SELECT Sdept
FROM Students
WHERE Sname=’李伟’);
说明:本例中的查询也可以用自身连接来完成,其SQL语句如下:
SELECT A.Sno , A.Sname , A.Sdept
FROM Students A , Students B
WHERE A.Sdept=B.Sdept AND B.Sname=’李伟’;
例 查询选修了课程名为“数据结构”的学生学号(Sno)和姓名(Sname)。
本查询涉及学号、姓名和课程名(Cname)三个属性。学号和姓名存放在Students表中,课程名的存放在Courses表中,但Students与 Courses两个表之间没有公共属性,必须通过Reports表建立它们之间的联系。所以本查询实际上涉及三个关系的连接操作。
SELECT Sno, Sname
FROM Students
WHERE Sno IN
(SELECT Sno
FROM Reports
WHERE Cno IN
(SELECT Cno
FROM Courses
WHERE Cname = ‘数据结构’));
说明:本查询同样可以用连接查询实现:
SELECT S.Sno, Sname
FROM Students S, Reports R, Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno AND C.Cname='数据结构';
3、带谓词EXISTS的嵌套查询
例 查询所有选修了编号为“C01”课程的学生姓名(Sname)和所在系(Sdept)。
本查询的SQL语句是:
SELECT Sname, Sdept
FROM Students
WHERE EXISTS
(SELECT *
FROM Reports
WHERE Sno=Students.Sno AND Cno='C01'); 例 查询选修了所有课程的学生姓名(Sname)和所在系。
由于没有全称量词,可将题目的意思转换成等价的用存在量词的形式:查询这样的学生,没有一门课程是他不选修的。其SQL语句为:
SELECT Sname, Sdept
FROM Students
WHERE NOT EXISTS
(SELECT *
FROM Courses
WHERE NOT EXISTS
(SELECT * FROM Reports WHERE Sno=Students.Sno
AND Cno=Courses.Cno));
三:集合查询
例 查询计算机科学系的学生或年龄不大于20岁的学生信息。
SELECT *
FROM Students
WHERE Sdept='计算机'
UNION
SELECT *
FROM Students
WHERE Sage<=20;
例 查询数学系的学生且年龄不大于20岁的学生的交集,这实际上就是查询数学系中年龄不大于20岁的学生。
SELECT *
FROM Students
WHERE Sdept='数学' AND Sage<=20;
例 查询数学系的学生与年龄不大于20岁的学生的差集。
本查询的等价说法是,查询数学系中年龄大于20岁的学生。
SELECT *
FROM Students
WHERE Sdept='计算机' AND Sage>20;

  

SQL连接、嵌套和集合查询---的更多相关文章

  1. SQL简单嵌套查询与非嵌套查询的比较(MSSQL2005)

    某天的工作是修复某个项目的bug,接着就发现,其sql极其混乱,有非常多的left join和in操作,还有嵌套查询(只有一个表的嵌套查询).不知道看到过哪里的资料说,嵌套查询速度慢,于是我把全部嵌套 ...

  2. 【SQL查询】集合查询之INTERSECT

    [SQL查询]集合查询之INTERSECT 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~ ...

  3. sql连接查询中的分类

    sql连接查询中的分类 1.内连接(结果不保留表中未对应的数据) 1.1等值连接:关联条件的运算符是用等号来连接的. 1.2不等值连接:连接条件是出等号之外的操作符 1.3自然连接:特殊的等值连接,在 ...

  4. sql之left join、right join、inner join的区别,连接自己时的查询结果测试

    sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括 ...

  5. sql连接查询(inner join、full join、left join、 right join)

    sql连接查询(inner join.full join.left join. right join) 一.内连接(inner join) 首先我这有两张表 1.顾客信息表customer 2.消费订 ...

  6. SQLServer SQL连接查询深度探险(摘录

    SQL连接查询深度探险[摘录] 测试环境: Windows XP Profession MySQL 5.0.45 Oracle 9i DB2 UDB 9.1 测试的SQL脚本如下:此脚本适合MySQL ...

  7. SQL基础--查询之四--集合查询

    SQL基础--查询之四--集合查询

  8. SQL SERVER技术内幕之6 集合查询

    1.定义 集合运算会对两个输入查询的结果集进行逐行比较,根据比较结果和所使用的集合运算来确定某一行是否应该包含在集合运算的结果中.因为集合运算是针对集合之间进行的计算,所以集合运算涉及的两个查询不能包 ...

  9. SQL连接查询基础知识点

    什么是连接 连接(join)查询是基于多个表中的关联字段将数据行拼接到一起,可以同时返回多个表中的数据. 下面以两个表为例子,举例说明一下不同的连接. SELECT * FROM products i ...

随机推荐

  1. C++学习笔记30,指针的引用(2)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guang_jing/article/details/32910093 能够创建不论什么类型的引用,包 ...

  2. linux 4 -awk

    十一.  awk编程:     1.  变量:     在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&q ...

  3. 牛客小白月赛1 E 圆与三角形 【数学】

    题目链接 https://www.nowcoder.com/acm/contest/85/E 思路 在三角形中,这一串东西的值恒为1 又 SIN A 的最大值 为1 所以 这串式子的最大值 就是 r ...

  4. vim编辑器常规配置

    为了很舒服的编写程序,请把vim配置好 # apt install vim    安装vim编辑器 #sudo vim /etc/vim/vimrc   ///必须加上权限sudo 在这个文件中,会有 ...

  5. [原创]java WEB学习笔记19:初识MVC 设计模式:查询,删除 练习(理解思想),小结 ,问题

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. Google员工自述:在哈佛教书和在Google工作的差别

    感谢伯乐在线的投递编者按:2003年到2010年期间,原文作者Matt Welsh 是哈佛大学工程和应用科学学院的计算机科学系教授.2010年加入Google,是一名高级工程师.他当前的工作重点是广域 ...

  7. Linux Network Namespace

    Linux Network Namespaces Linux kernel在2.6.29中加入了namespaces,用于支持网络的隔离,我们看一下namespace是如何使用的 创建与配置 创建一个 ...

  8. 织梦dedecms 调用文章图片数功能

    function BodyImgNum($aid) { global $dsql; $sql = "select aid,body from dede_addonarticle where ...

  9. ThinkPad.E440_安装固态硬盘

    1.ThinkPad(E440) 加装SSD固态硬盘,并改装双硬盘_百度经验.html(https://jingyan.baidu.com/article/9f63fb91856ec7c8400f0e ...

  10. Neutron Callback System

    用于core and service components之间的通信,传递resource的lifecycle events (e.g. before creation, before deletio ...