子查询就是查询中还可以嵌套其他的查询,通常是内层查询的结果作为外层查询的条件来使用
执行循序,自内向外依次执行
一、内层查询返回“单列单行”的结果
-- 1、查询宋江的出生日期
SELECT TIMESTAMPDIFF(year,birthday,NOW()) FROM tb_student WHERE student_name = "宋江";
-- 2、再使用宋江的出生日期作为条件执行查询
SELECT * FROM tb_student WHERE TIMESTAMPDIFF(year,birthday,NOW()) <(
SELECT TIMESTAMPDIFF(year,birthday,NOW()) FROM tb_student WHERE student_name = "宋江"
); 二、内层查询返回“单列多行”的结果
需要使用IN、NOT IN、ANY、ALL关键字在外层查询中进行比较,执行外层查询
-- 子查询中使用IN关键字:外层查询的字段值是否包含在内层查询返回的结果中,若是返回true,反之返回false。
-- 查询java、HTML的成绩信息
SELECT sj.subject_name,sc.* FROM tb_score sc INNER JOIN tb_subject sj
WHERE sc.subject_id =sj.subject_id
AND sj.subject_name IN("java","html"); -- 使用subject_name作为条件查询对应的subject_id
SELECT subject_id FROM tb_subject WHERE subject_name IN("java","html");
-- 再使用subject_id作为外层查询的条件查询成绩信息
SELECT sj.subject_name,sc.* FROM tb_score sc,tb_subject sj
WHERE sc.subject_id = sj.subject_id AND sc.subject_id IN(
SELECT subject_id FROM tb_subject WHERE subject_name IN("java","html")
); -- NOT IN
-- 查询java和HTML以外 的其他课程的成绩信息
SELECT sj.subject_name,sc.* FROM tb_score sc,tb_subject sj
WHERE sc.subject_id = sj.subject_id AND sc.subject_id IN(
SELECT subject_id FROM tb_subject WHERE subject_name NOT IN("java","html")
); -- 查询比JavaScript中所有成绩都高的其他课程的成绩信息
-- 1、查询JavaScript课程的subject_id
SELECT subject_id FROM tb_subject WHERE subject_name = "javascript"; -- 2、使用subject_id作为条件查询对应的所有成绩
SELECT student_score FROM tb_score WHERE subject_id IN(
SELECT subject_id FROM tb_subject WHERE subject_name = "javascript"
); -- 3、再使用JavaScript课程的所有成绩与外层的成绩进行比较
SELECT * FROM tb_score WHERE student_score > ALL(
SELECT student_score FROM tb_score WHERE subject_id IN(
SELECT subject_id FROM tb_subject WHERE subject_name = "javascript"
)
); SELECT * FROM tb_score WHERE student_score > ANY(
SELECT student_score FROM tb_score WHERE subject_id IN(
SELECT subject_id FROM tb_subject WHERE subject_name = "javascript"
)
)ORDER BY student_score; 三、内层查询返回“多列单行”的结果
多列的结果要与外层查询对应的多个字段同时进行比较,才认为是满足条件
-- 针对tb_emp表查询与史密斯的部门编号和岗位都相同的其他人员信息
SELECT DEPTNO ,JOB FROM tb_emp WHERE ENAME = "smith";
以下两种方法都可以
SELECT * FROM tb_emp WHERE( DEPTNO =(
SELECT DEPTNO FROM tb_emp WHERE ENAME = "smith") AND JOB=(
SELECT JOB FROM tb_emp WHERE ENAME = "smith")AND ENAME <> "smith"
); SELECT * FROM tb_emp WHERE (DEPTNO,JOB) = (SELECT DEPTNO,JOB FROM tb_emp WHERE ENAME = "smith") AND ENAME <> "smith";
四、内层查询返回“多列多行”的结果
当内层查询返回的结果是“多列多行”或以下范围的值时,外层查询可以使用exists关键字判断内层查询是否或(没有)数据返回。
使用EXISTS关键字:内层查询若有数据返回则为true,否则false
SELECT ge.grade_name,st.* FROM tb_student st,tb_grade ge
WHERE EXISTS (
SELECT * FROM tb_grade WHERE grade_name IN ('二年级','三年级')) AND
st.grade_id = ge.grade_id AND ge.grade_name IN ('二年级','三年级'
); 子查询中使用NOT EXISTS关键字:与exists相反

MySQL 07章_子查询的更多相关文章

  1. mysql 06章_分组查询和链接查询

    一.分组查询 在进行查询时,通常需要按某个或某些字段进行一些统计,因此就需要使用分组查询,但分组后通常需要与聚合函数使用,分组才有意义. 语法:SELECT <字段列表|*> FROM 表 ...

  2. MySQL 05章_模糊查询和聚合函数

    在之前的查询都需要对查询的关机中进行“精确”.“完整”完整的输入才能查询相应的结果, 但在实际开发过程中,通常需要考虑用户可能不知道“精确”.“完整”的关键字, 那么就需要提供一种不太严格的查询方式, ...

  3. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

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

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

  5. Oracle学习总结_day03_day04_条件查询_排序_函数_子查询

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day03_条件查询_排序_函数 清空回收站: PUR ...

  6. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  7. MySQL 使用JOIN优化子查询

    1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | na ...

  8. mysql sql_safe_updates 不支持子查询的更新。

    考虑到开发人员有时候不小心误更新数据,要求线上库的 MySQL 实例都设置 sql_safe_updates=1 来避免没有索引的 update.delete. 结果有一天开发发现下面的一个SQL 没 ...

  9. php+mysql 内联接 和 子查询

    INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录 $sql="SELECT * FROM subject as a INNER JOIN e_user as b ON a. ...

随机推荐

  1. JVM 源码分析之 javaagent 原理完全解读

    转载:https://infoq.cn/article/javaagent-illustrated 本文重点讲述 javaagent 的具体实现,因为它面向的是我们 Java 程序员,而且 agent ...

  2. 什么是NVMe硬盘?

    本文摘自:https://zhidao.baidu.com/question/590890784.html NVMe硬盘指的是非易失性内存主机控制器接口规范(Non-Volatile Memory e ...

  3. python:Django 简介。

    Django是基Python的重要WEB框架. 1.安装Django Web框架 安装  pip 安装 在命令行模式 执行  [pip install django == 2.0]或者 [pip in ...

  4. python列表中enumerate和zip函数用法

    enumerate: 定义:enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标 例子: list1 =[89,98,00,75,6 ...

  5. 矢量切片应用中geoserver与geowebcache分布式部署方案

    在进行GIS项目开发中,常使用Geoserver作为开源的地图服务器,Geoserver是一个JavaEE项目,常通过Tomcat进行部署.而GeoWebCache是一个采用Java实现用于缓存WMS ...

  6. idea springboot 打包 war

    1.pom文件中将项目改为   war

  7. python之pypinyin

    python 汉字拼音库 pypinyin 这个库还是很好用的,这个库还是很简单的,中文注解,下面是源码,看注释就可以大致明白方法的意思 #!/usr/bin/env python # -*- cod ...

  8. python_django_views视图模块

    视图(views.py):接收web请求,并响应web请求 在视图响应web请求的过程中,响应文件可能是网页,也可能是json数据 若响应的是网页,我们可分为: 地址重定向的网页请求(子类HttpRe ...

  9. 【POJ3155】生活的艰辛Hard Life

    题面 Description ADN公司内部共 n个员工,员工之间可能曾经因为小事有了过节,总是闹矛盾.若员工u和员工 v有矛盾,用边(u, v)表示,共 m个矛盾.最近,ADN公司内部越来越不团结, ...

  10. splay 模板 洛谷3369

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入 xx 数 删除 xx 数(若有多个相同的数,因只删除一个) 查询 xx 数的排名(排名定义为比当前数小的数 ...