子查询就是查询中还可以嵌套其他的查询,通常是内层查询的结果作为外层查询的条件来使用
执行循序,自内向外依次执行
一、内层查询返回“单列单行”的结果
-- 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. 剑指offer——56在排序数组中查找数字

    题目描述 统计一个数字在排序数组中出现的次数.   题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N) ...

  2. el-select 1.4.x版本实现2.x.x版本的reserve-keyword功能

    今天在维护以前的项目时,发现了一个小bug,其实也不算是bug,只是客户对这个控件的体验不是很满意. 我们在element 2.x.x的版本的官方文档中可以发现el-select组件的属性中比1.x. ...

  3. background-size的值cover、contain和100%

    图1 给一个宽600px,高600px的div添加一张宽480px,高360px的背景图片.不重复显示的情况下,默认显示为图1. 1.background-size: 100% 100%; 会将图片的 ...

  4. BigDecimal的操作工具类

    import java.math.BigDecimal; /** * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类 * @author ameyume * */ public cla ...

  5. dnslog小技巧

    一.dnslog利用场景 主要针对无回显的情况. Sql-Blind RCE SSRF RFI(Remote File Inclusion) 二.原理 将dnslog平台中的特有字段payload带入 ...

  6. HTML5字体、伪元素、背景

    1.字体样式: 选择器  { font:font-style  font-weight  font-size / line-height   font-family:} 例:p { font: ita ...

  7. linux 6 timezone修改

    linux 6 / Amazon linux 因为正好在使用Amazon 的linux AMI  又遇到了需要修改系统时区这个case 所以就调查了一下修改方法,因为Amazon的linux版本是由A ...

  8. Linux grep return code

    The exit code is 1 because nothing was matched by grep. EXIT STATUS The exit status is 0 if selected ...

  9. Python学习笔记(七)——魔法方法

    1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...

  10. Jmeter-【beanshell处理器】-随机获取手机号

    一.通过操作变量 二.引用外部Java文件 三.引用外部class文件