第七章 SQL查询(三)

一,什么是子查询

子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询
子查询在WHERE语句中的一般用法:

SELECT … FROM 表1 WHERE 字段1  比较运算符(子查询)
#编写SQL语句,查看年龄比“李三”小的学生,要求显示这些学生的信息 ?
#1.查出李三的出生日期
SELECT borndate FROM    student where studentname='李三';
#2.查出比李三出生日期大的学生
SELECT*FROM student where borndate>'2010-05-24 08:54:41';
#3. 把第二步中的 日期  替换为sql语句
SELECT*FROM student where borndate>(SELECT borndate FROM student where studentname='李三');
# 比学生1的科目1 成绩低的学生信息(除了自己)
#1.学生1的2022-03-01 08:58:39 成绩
SELECT studentResult FROM result where studentNo=1 and examDate='2022-03-01 08:58:39';
#2.成绩高的学生信息(除了自己)
SELECT*FROM result where studentNo!=1 and studentResult<80;
# 综合
SELECT*FROM result where studentNo!=1 and studentResult<(SELECT studentResult FROM result where studentNo=1 and examDate='2022-03-01 08:58:39');

​ 将子查询和比较运算符联合使用,必须保证子查返回的值不能多于一个

首先,执行小括号中的子查询,返回的结果是所有来自子查询的结果
其次,才开始执行外围的父查询,返回查询的最终结果

-- 查找和王月同班的学生的学号和姓名
#1.王月的班级
SELECT gradeId from student where studentname='王三';
#2.班级为 .. 的 学生的学号和姓名
SELECT studentNo,studentname from student where gradeId=1;
# 合并
SELECT studentNo,studentname from student where gradeId=(SELECT gradeId from student where studentname='王三');

使用多张表的子查询

# 查询参加最近一次“html”考试成绩最高分和最低分
# 1.html的id
SELECT SubjectId from subject where SubjectName='html';
#2.html的最近一次的考试时间
SELECT max(examDate) FROM   result where subjectNo=1;
# 3.最高分,最低分
SELECT MAX(studentResult),min(studentResult) from result where
subjectNo=1 and examDate='2021-07-01 08:58:39';
# 整合
SELECT MAX(studentResult),min(studentResult) from result where
subjectNo=(SELECT SubjectId from subject where SubjectName='html')
and examDate=(SELECT max(examDate) FROM    result
where subjectNo=(SELECT SubjectId from subject where SubjectName='html'));

IN子查询

IN后面的子查询可以返回多条记录
常用IN替换等于(=)的子查询

#查询“Java Logic”课程考试成绩为60分的学生名单
#1.java的id
SELECT SubjectId FROM   `subject` where SubjectName='java';
#2.根据java的id和分值查询学生的id
SELECT studentNo FROM   result WHERE subjectNo=2 and studentResult=60;
#3.根据学生id获取姓名
SELECT studentname FROM student where studentNo=4;
# 整合
SELECT studentname FROM student where studentNo=(
SELECT studentNo FROM   result WHERE subjectNo=
(SELECT SubjectId FROM  `subject` where SubjectName='java')and studentResult=60
);
-- 子查询返回不止1个值时,使用比较运算符会出错
SELECT studentname from student WHERE studentNo in(2,4);
SELECT studentname FROM student where studentNo=(
SELECT studentNo FROM   result WHERE subjectNo in
(SELECT SubjectId FROM  `subject` where SubjectName='java')and studentResult=60
);

多表联查

#查询“Java Logic”课程考试成绩为60分的学生名单
#1.java的id
SELECT SubjectId FROM   `subject` where SubjectName='java';
#2.根据java的id和分值查询学生的id
SELECT studentNo FROM   result WHERE subjectNo=2 and studentResult=60;
#3.根据学生id获取姓名
SELECT studentname FROM student where studentNo=4;
# 整合
SELECT studentname FROM student where studentNo=(
SELECT studentNo FROM   result WHERE subjectNo=
(SELECT SubjectId FROM  `subject` where SubjectName='java')and studentResult=60
);
-- 子查询返回不止1个值时,使用比较运算符会出错
SELECT studentname from student WHERE studentNo in(2,4);
SELECT studentname FROM student where studentNo=(
SELECT studentNo FROM   result WHERE subjectNo in
(SELECT SubjectId FROM  `subject` where SubjectName='java')and studentResult=60
);# 查询有c++成绩的学生的学号和姓名
# 使用多表联查  student s 给表起别名
SELECT s.studentNo,s.studentname,r.studentResult fromstudent s,result r where s.studentNo=r.studentNo;
# 三张表
SELECT s.studentNo,s.studentname,r.studentResult ,sj.SubjectName fromstudent s,result r,`subject` sj where s.studentNo=r.studentNo and sj.SubjectId=r.subjectNoand sj.SubjectName='java'; #查询 所有学生的考试成绩(姓名,成绩)SELECT s.studentname,r.studentResult FROM student s,result r WHERE s.studentNo=r.studentNo; -- 两张表,一个外键# 查询所有的html的成绩和学生姓名,和成绩SELECT s.studentname,sj.SubjectName,r.studentResult FROM student s,`subject` sj,result r -- 三张表where s.studentNo=r.studentNo and r.subjectNo=sj.SubjectId -- 两个外键关系and sj.SubjectName='html';-- 一个筛选条件#显示所有的菜品信息,(序号,名称,菜品类型,价格)SELECT m.id,m.`name`,t.`name`,m.price    FROM menus m,types t where m.typeid=t.id;

ANY、SOME或ALL时

-- 查询比张四所有成绩都高的学生
-- all 和任何一个数字相比都要满足条件
SELECT*from result where studentResult > all(SELECT studentResult FROM result where studentNo=2);
-- any  比其中任意一个高
SELECT*from result where studentResult > any(SELECT studentResult FROM result where studentNo=2);
-- 请查询 学号是(1,2,5)的同学信息
SELECT * FROM student WHERE studentNo in(1,2,5);

EXISTS子查询

如果子查询的结果非空,即记录条数1条以上,则EXISTS (子查询)将返回真(true),否则返回假(false)
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False

# 查询参加了java考试的学生姓名
-- 1.查出参加java考试的学生的学号
SELECT r.studentNo from result r,`subject` s
where r.subjectNo=s.SubjectId and s.SubjectName='java';
-- 使用exists EXISTS返回值是布尔类型
# true 会查询所有,false 返回空值
SELECT studentname FROM student where EXISTS(
SELECT r.studentNo from result r,`subject` s
where r.subjectNo=s.SubjectId and s.SubjectName='java'
);

UNION和UNION All

UNION联合查询的语法

SELECT 字段1,字段2 FROM tableA    UNION  [ALL]
SELECT 字段1,字段2 FROM tableB 

UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型
同时,每条 SELECT 语句中的列的顺序必须相同
当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行

CREATE TABLE `stu`.`user`  (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) NULL,`phone` varchar(255) NULL,`sex` varchar(255) NULL,`age` int NULL,PRIMARY KEY (`id`)
);
CREATE TABLE `stu`.`phonelist`  (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) NULL,`phone` varchar(255) NULL,PRIMARY KEY (`id`)
);
--
INSERT INTO `stu`.`user` (`name`, `phone`, `sex`, `age`) VALUES ('张四1', '123', '男', 12),
('张五', '1234', '男', 12),
('张六', '1235', '男', 12),
('张七', '1236', '男', 12);
INSERT INTO `stu`.`phonelist` (`name`, `phone`) VALUES ('张三', '123'),('张四1', '123'),
('张五', '1234'),
('张六1', '1235'),
('张七2', '1236');
-- 查询学生表和通讯录中的所有学生姓名和联系方式
-- UNION 合并数据并去除重复
SELECT name,phone from user UNION
SELECT name,phone FROM phonelist;
-- UNION all合并数据,但不会并去除重复
SELECT name,phone from user UNION all
SELECT name,phone FROM phonelist;

第七章 SQL查询(三)相关推荐

  1. 第九章 SQL查询数据库(一)

    文章目录 第九章 SQL查询数据库 查询类型 使用SELECT语句 SELECT子句的执行顺序 选择字段 JOIN操作 选择大量字段的查询 定义和执行命名查询 创建查询和调用 类查询 第九章 SQL查 ...

  2. 第七章 SQL聚合函数 LIST

    文章目录 第七章 SQL聚合函数 LIST 大纲 参数 描述 包含逗号的数据值 LIST 和 %SelectMode LIST 和 ORDER BY 最大列表大小 相关的聚合函数 示例 第七章 SQL ...

  3. 第九章 SQL查询数据库(二)

    文章目录 第九章 SQL查询数据库(二) 调用用户定义函数的查询 查询串行对象属性 查询集合 使用说明和限制 调用文本搜索的查询 伪字段 查询元数据 快速查询 查询和企业缓存协议Enterprise ...

  4. 源码-Oracle数据库管理-第九章-SQL查询-Part 2(基本查询)

    查询是一个基本需求,但具体需求是千变万化的,所以查询同时又是复杂的. 曾经历过一个项目,几十号人,辛苦加班搞了两三个月,只是为了实现一个主要功能:保单查询. 不过,因为是新人新客户,还有环境搭建(开发 ...

  5. 小白的MySQL,从零到精通(十五章)之第七章--Select查询

    因为select知识比较多,我们单独列出一章来了解. select [distinct] *| {column1,column2,...} from tbl_name; 创建一张学生表来测试: cre ...

  6. 第四章 SQL查询 之连接{自然连接,内连接,外连接(左外连接,右外连接,完全连接)}

    4.4 连接 自然连接 自然连接实际指定了搜寻条件.这里包括两部分的内容:首先,自然连接列必须同名,另外,所有同名列都将作为搜索条件. 自然连接所使用的关键字为natural join .其连接原则为 ...

  7. 第四章 SQL查询之联合语句

    4.3联合语句 联合语句是指对于多个查询所获得的结果集进行集合操作.这些集合操作包括union.union all.intersect和minus.这些集合运算都是二元运算,运算结果仍然是一个记录集合 ...

  8. 第七十一章 SQL命令 SELECT(三)

    文章目录 第七十一章 SQL命令 SELECT(三) 列别名 字段列别名 Non-Field列别名 FROM子句 表的别名 Sharding Transparent to SELECT Queries ...

  9. Kali Linux 网络扫描秘籍 第七章 Web 应用扫描(三)

    第七章 Web 应用扫描(三) 作者:Justin Hutchens 译者:飞龙 协议:CC BY-NC-SA 4.0 7.13 使用 BurpSuite Sequencer(序列器) Web 应用会 ...

最新文章

  1. Visual Studio 2013 在使用 razor无智能提示的解决办法
  2. 【有奖征文】如何提高IDC机房服务器的安全性
  3. linux 核间通讯rpmsg架构分析
  4. Nginx安装,Nginx静态缓存,Nginx Gzip压缩,Nginx负载均衡,Nginx方向代理,Nginx+Tomcat+Redis做session共享
  5. 牛客网 【每日一题】4月10日 二分图染色(弱化版)
  6. abstract的一些用法
  7. Django账号绑定邮箱时发送链接
  8. 国际旅游管理专业跨专业考计算机,第二年跨校跨专业考旅游管理公费成功,一点经验给大家...
  9. centos7(linux)使用心得
  10. 原声php 读取excel乱码_如何解决php读取excel乱码问题
  11. 乳酸的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  12. IT行业道德伦理 介绍
  13. 程序员辉辉想裸辞,但又不太敢
  14. 注册CSE服务中心失败排查步骤
  15. 三级等保测评都有哪些环节?
  16. 人工智能正在学习如何创造自己
  17. “单词不用背,看完自然会”,4天背过2万单词,原来学英语真的有捷径!
  18. Idea安装完成后打不开的问题
  19. 数据清洗是清洗什么?
  20. python --获取内网IP地址

热门文章

  1. 不同行业数据分析思路5
  2. java html文本编辑器,基于Java WebHTML在线文本编辑器解决方案.doc
  3. 【优化调度】基于matlab电力系统热电联产机组优化调度问题【含Matlab源码 2206期】
  4. web课程设计网页规划与设计:HTML+CSS班级设计题材——我的校园班级
  5. Android所有权限说明
  6. C++程序员的职业寿命比Java长?Java程序员同意吗?
  7. c++多线程重点难点(六)CriticalSection
  8. wordpress 阿里百秀XIU主题 v7.7最新版本下载和使用教程
  9. fieldset——一个不常用的HTML标签
  10. mybatis同一个搜索框对多个字段进行模糊查询