嵌套查询

一个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. Quartz.Net 使用心得(二)

    工作中需要做一个简易的Cron字符串生成器,并且要获取生成的Cron后面10次的触发时间来验证. 此问题困扰了我很久时间,CSDN上有一个Java版本的,本人菜鸟,想移植到C#中,语法上怎么也不通过. ...

  2. 复习es6-let和const

    1.声明变量的方法 es5 : var   function es6 : var   function   let    const   class 2.let(const)与var 不同 let不能 ...

  3. Linux: 通过命令行上传文件到ftp服务器

    url -T fie-name ftp://server-address --user user:password

  4. 从零单排入门机器学习:Octave/matlab的经常使用知识之矩阵和向量

    Octave/matlab的经常使用知识之矩阵和向量 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错.算是入门了.这次打算以该课程的作业为主线,对机器学习基本知识做一 ...

  5. datatables接口

    /*资源表格接口*/ var dataTableHeader=function(elem,unSorts,defaultSort,screens,status,toggleVis,ipAddress, ...

  6. MAC Wireshark抓包IOS

    网络抓包是个基础技能,对于网络协议的掌握有一定的要求.iOS上实现网络抓包可以用Charles(针对http和https),tcpdump(快速分析网络包),和Wireshare.之前写过一篇介绍tc ...

  7. python-paramiko初体验

    什么pexpect.pxshll在paramiko面前都是浮云,重要的是paramiko支持windows. 小试牛刀 import paramiko paramiko.util.log_to_fil ...

  8. C#邮件发送(含附件)

    class SendEmail { static void Main(string[] args) { string from = "发件人@yingu.com"; string ...

  9. LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)

    题目标签:HashMap 题目给了我们两个句子,让我们找出不常见单词,只出现过一次的单词就是不常见单词. 把A 和 B 里的word 都存入 map,记录它们出现的次数.之后遍历map,把只出现过一次 ...

  10. settimeout--原来定时器是有三个及以上参数的

    我平常使用的 settimeout 定时,只知道他有两个参数,一个是function异步成功后的回调函数,一个是delay延时毫秒,今天发现它还可以接着传餐,作为 执行回调函数的参数 语法:var t ...