嵌套查询

一个SELECT-FROM-WHERE语句称为一个查询块。

嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询。

注:子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。

1.带有IN谓词的子查询:

子查询往往是一个集合。

查询与jason在同一个系的学生:

SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN
(SELECT Sdept FROM Student WHERE Sname='jason');

子查询的查询条件不依赖于父查询,成称为不相关子查询。

子查询的查询条件依赖于父查询,成称为相关子查询。

查询选修了DB_Design的学生学好和姓名。

SELECT Sno,Sname FROM Student WHERE Sno IN
(SELECT Sno FROM SC WHERE Cno IN
(SELECT Cno FROM Course WHERE Cname='DB_Design')
);

2.带有比较运算符的子查询:

当用户确切知道内层查询返回的是单个值时,可以用>、<、=、>=、<=、!=(<>)等比较运算符。

SELECT Sno,Sname,Sdept FROM Student WHERE Sdept=
(SELECT Sdept FROM Student WHERE Sname='jason');

SELECT Sno,Cno FROM SC x WHERE Grade>=
(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);  (相关子查询)

3.带有ANY(SOME)或ALL谓词的子查询:

子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。使用ANY或ALL也必须同时使用比较运算符。

>ANY   :  大于子查询结果中的某个值

>ALL    :  大于子查询结果中的所有值

=ANY   :   等于子查询结果中的某个值

查询非计算机系中比计算机系任意一个学生年龄小的学生姓名和年龄。

SELECT Sname,Sage FROM Student

WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept!='CS';

可使用聚集函数,且效率更高:

SELECT Sname,Sage FROM Student

WHERE Sage<

(SELECT MAX(Sage) FROM Student WHERE Sdept='CS')

AND Sdept!='CS';

4.带有EXISTS谓词的子查询:

EXISTS代表存在量词∃。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑值true或者false。

查询所有选修了1001课程的学生姓名。

SELECT Sname FROM Student WHERE EXISTS
(SELECT * FROM Sc WHERE Student.Sno=Sc.Sno AND Cno='1001');

查询没有选修1001课程的学生姓名。

SELECT Sname FROM Student WHERE NOT EXISTS
(SELECT * FROM Sc WHERE Student.Sno=Sc.Sno AND Cno='1001');

一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询代替,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用到EXISTS谓词的子查询代替。

SQL中没有全称量词,全称量词用存在量词表示。

●查询选修了全部课程的学生姓名。(有点绕)

SELECT Sname FROM Student WHERE NOT EXISTS(
SELECT * FROM Course WHERE NOT EXISTS(
SELECT * FROM Sc WHERE Student.Sno=Sc.Sno AND Course.Cno=Sc.Cno));

SQL中没有蕴含逻辑运算 p→q=¬p∨q

●查询至少选修了学生2016002选修的全部课程的学生号码。

SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS(
SELECT * FROM SC SCY WHERE SCY.Sno='2016002' AND NOT EXISTS (
SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));

mysql_数据查询_嵌套查询的更多相关文章

  1. SQL数据查询之——嵌套查询

    一.概念描述 在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块.将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询.例如: ...

  2. mybatis 关联查询和嵌套查询的简单示例

    两个表: Customer 顾客表 create table if not exists customer( customer_id int primary key auto_increment, f ...

  3. SQL基本查询_子查询(实验四)

    SQL基本查询_子查询(实验四) 1.查询所有员工中薪水低于"孙军"的员工姓名和薪水: 2.查询与部门编号为"01"的岗位相同的员工姓名.岗位.薪水及部门号: ...

  4. SQL Server 之 子查询与嵌套查询

    当由where子句指定的搜索条件指向另一张表时,就需要使用子查询或嵌套查询. 1 子查询 子查询是一个嵌套在select.insert.update或delete语句或其他子查询中的查询.任何允许使用 ...

  5. SQL基础--查询之三--嵌套查询

    SQL基础--查询之三--嵌套查询

  6. 多表查询_子查询概述和多表查询_子查询情况1&情况2&情况3

    子查询 概念:查询中嵌套查询,称嵌套查询为子查询 -- 查询工资最高的员工信息 -- 1.查询最高的工资是多少 9000 select max(salary) from emp; -- 查询员工信息, ...

  7. 数据库开发基础-SQl Server 主键、外键、子查询(嵌套查询)

    主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...

  8. mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别

    (转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...

  9. Oracle子查询(嵌套查询)

    概念: 所谓子查询,即一个select语句中嵌套了另外的一个或者多个select语句 需求:查找和Smith同部门的所有员工的id和last_name 目标: 员工id,last_name from: ...

随机推荐

  1. 8、Java并发性和多线程-静态条件与临界区

    以下内容转自http://ifeve.com/race-conditions-and-critical-sections/: 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源 ...

  2. VS2017-NetCore项目整合Log4Net

    1新建NetCore项目,我这里NetCoreSDK版本是2.2.0. 2.进入NuGet程序包官网 : https://www.nuget.org,搜索以下两个包并安装到项目中. Microsoft ...

  3. 用两种方法(递归和DP)实现了青蛙跳台阶

    做了这道题目: https://www.nowcoder.net/practice/8c82a5b80378478f9484d87d1c5f12a4?tpId=13&tqId=11161&am ...

  4. LeetCode 8. String to Integer (atoi) (字符串到整数)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  5. Ubuntu12.04.3LTS安装Oracle Java 7

    今天在ubuntu 12.04 LTS 上安装Matlab时总是出错,显示拷贝jar包(cp "xx.jar")出现错误,在网上搜索了一下发现原来是没有安装java.自己打算安装o ...

  6. 【C++】双向线性链表容器的实现

    // 双向线性链表容器 #include <cstring> #include <iostream> #include <stdexcept> using name ...

  7. oninput 中文输入

    使用 input 监听 input 中文输入,会被每次输入的字母打断,下面就解决这个问题 $('input') .off() .on('input',function(){ if($(this).pr ...

  8. EF TMD

    TMD 几个月前,本着学习的心态,首次在项目中应用EF.因为这里老是赶.赶.赶,当时只是匆匆而就,浅尝辄止,搞到现在对EF一知半解,每次在新项目使用,都担惊受怕,大费周折,不知道什么时候,在什么地方就 ...

  9. Combining an audio file with video file in python

    Combining an audio file with video file in python - Stack Overflow https://stackoverflow.com/questio ...

  10. 0x0118消息就是WM_SYSTIMER

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/c0f9bac9-d211-4b8b-ba99-f5a0ed0d2e0a/what-is-w ...