MySQL 07章_子查询
子查询就是查询中还可以嵌套其他的查询,通常是内层查询的结果作为外层查询的条件来使用
执行循序,自内向外依次执行
一、内层查询返回“单列单行”的结果
-- 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章_子查询的更多相关文章
- mysql 06章_分组查询和链接查询
一.分组查询 在进行查询时,通常需要按某个或某些字段进行一些统计,因此就需要使用分组查询,但分组后通常需要与聚合函数使用,分组才有意义. 语法:SELECT <字段列表|*> FROM 表 ...
- MySQL 05章_模糊查询和聚合函数
在之前的查询都需要对查询的关机中进行“精确”.“完整”完整的输入才能查询相应的结果, 但在实际开发过程中,通常需要考虑用户可能不知道“精确”.“完整”的关键字, 那么就需要提供一种不太严格的查询方式, ...
- mysql update不支持子查询更新
先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...
- SQL基本查询_子查询(实验四)
SQL基本查询_子查询(实验四) 1.查询所有员工中薪水低于"孙军"的员工姓名和薪水: 2.查询与部门编号为"01"的岗位相同的员工姓名.岗位.薪水及部门号: ...
- Oracle学习总结_day03_day04_条件查询_排序_函数_子查询
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day03_条件查询_排序_函数 清空回收站: PUR ...
- Mysql - 性能优化之子查询
记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...
- MySQL 使用JOIN优化子查询
1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | na ...
- mysql sql_safe_updates 不支持子查询的更新。
考虑到开发人员有时候不小心误更新数据,要求线上库的 MySQL 实例都设置 sql_safe_updates=1 来避免没有索引的 update.delete. 结果有一天开发发现下面的一个SQL 没 ...
- php+mysql 内联接 和 子查询
INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录 $sql="SELECT * FROM subject as a INNER JOIN e_user as b ON a. ...
随机推荐
- 第48章 MDK的编译过程及文件类型全解
Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...
- 正则化:L0 vs L1 vs L2
原文地址:https://www.jianshu.com/p/e5c9a9fc84d4 为什么正则化可以缓解过拟合? 过拟合时,拟合函数的系数往往非常大.过大的权重会导致模型过多地学习到某些数据的个性 ...
- HDU 6697 Closest Pair of Segments (计算几何 暴力)
2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...
- 问题:Error running 'lugia-web': Address loaclhost:1099 is already in use
解决方法:cmd输入下面命令: 第一步: netstat -ano|findstr 1099 找到对应的pid 为3576.(每次不一样). 第二步:taskkill -f -pid 3576
- Java 序列化和反序列化(一)Serializable 使用场景
目录 Java 序列化和反序列化(一)Serializable 使用场景 1. 最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:tr ...
- 净心诀---python3生成器进阶
列表推导式 把需要用一个函数写成的小功能,利用一行表达式完成 例子: l = [1,2,3,4,5] # 所有的偶数都放到新的列表中 # 正常函数 def Lst(): li = [] for i i ...
- 教你如何有效防止DDos攻击?
DDos又称分布式拒绝服务,DDos是利用大量合理的请求造成资源过载,导致服务不可用.就比如一个餐馆总共有100个座位,突然有一天某个商家恶意竞争,雇佣了200个人来到这个餐馆坐着不吃不喝,门口还排着 ...
- H5在js中向指定的元素添加样式
今天在做一个按钮的功能控制,点击之后,要根据判断条件,修改按钮的样式,然后就发现了一个巨好用的方法, <button type="button" id="btn_A ...
- 支付宝支付接口-运行支付宝demo
运行deme 提供了 支付 查询 退款 交易关闭几个简单的接口demo 下载 https://docs.open.alipay.com/270/106291/ 转为mave项目 1.创建一个空的ma ...
- wireshark 分析 TCP 请求(转)
转自:http://supben.iteye.com/blog/2329780 先看一段代码 程序片段是一个RPC调用 ,根据简历id获取简历实体.本地IP 10.252.156.132, 远程ip ...