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. goland中引用包

    首先在工程目录下新建三个目录:bin, pkg,src Bin文件夹是放置编译后的exe文件 Pkg文件夹是放置包生成后的.a文件 Src文件夹是放置包文件的地方 工程组织目录如下,在src中有tes ...

  2. 11.23 Eclipse

    一.Eclipse Workspace File-->Switch Workspace 编译环境:Window -- Preferences – Java - Compiler 运行环境:Win ...

  3. 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术

            服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器.集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任 ...

  4. 微信小程序高度设置为100%

    在网页中设置body,html{height:100%}; 将body和html设置为100%,这样我们就可以在他们的子元素中使用height:100%来使的我们的容器元素占满屏幕的高度啦. 但是在微 ...

  5. Ionic background地址写法问题

    1.背景图片 background:url(‘/img/text.jpg') 这种写法在手机上不好使 ’../img/text.jpg' 这种在手机上好使

  6. FreeMarker使用后台枚举

    //页面使用枚举全路径访问 model.addAttribute("enums", BeansWrapper.getDefaultInstance().getEnumModels( ...

  7. [原创]java WEB学习笔记23:MVC案例完整实践(part 4)---模糊查询的设计与实现

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

  8. [原创]java WEB学习笔记06:ServletContext接口

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

  9. Python3 函数 一

    什么是函数? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal ...

  10. a标签包着img事件 ie下 a标签的click事件失效

    整个大的背景框有个点击事件, 如果标签结构是(详细的css样式略) a{background:green;} <a href=""> <img src=" ...