第七章 SQL查询(三)
第七章 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查询(三)相关推荐
- 第九章 SQL查询数据库(一)
文章目录 第九章 SQL查询数据库 查询类型 使用SELECT语句 SELECT子句的执行顺序 选择字段 JOIN操作 选择大量字段的查询 定义和执行命名查询 创建查询和调用 类查询 第九章 SQL查 ...
- 第七章 SQL聚合函数 LIST
文章目录 第七章 SQL聚合函数 LIST 大纲 参数 描述 包含逗号的数据值 LIST 和 %SelectMode LIST 和 ORDER BY 最大列表大小 相关的聚合函数 示例 第七章 SQL ...
- 第九章 SQL查询数据库(二)
文章目录 第九章 SQL查询数据库(二) 调用用户定义函数的查询 查询串行对象属性 查询集合 使用说明和限制 调用文本搜索的查询 伪字段 查询元数据 快速查询 查询和企业缓存协议Enterprise ...
- 源码-Oracle数据库管理-第九章-SQL查询-Part 2(基本查询)
查询是一个基本需求,但具体需求是千变万化的,所以查询同时又是复杂的. 曾经历过一个项目,几十号人,辛苦加班搞了两三个月,只是为了实现一个主要功能:保单查询. 不过,因为是新人新客户,还有环境搭建(开发 ...
- 小白的MySQL,从零到精通(十五章)之第七章--Select查询
因为select知识比较多,我们单独列出一章来了解. select [distinct] *| {column1,column2,...} from tbl_name; 创建一张学生表来测试: cre ...
- 第四章 SQL查询 之连接{自然连接,内连接,外连接(左外连接,右外连接,完全连接)}
4.4 连接 自然连接 自然连接实际指定了搜寻条件.这里包括两部分的内容:首先,自然连接列必须同名,另外,所有同名列都将作为搜索条件. 自然连接所使用的关键字为natural join .其连接原则为 ...
- 第四章 SQL查询之联合语句
4.3联合语句 联合语句是指对于多个查询所获得的结果集进行集合操作.这些集合操作包括union.union all.intersect和minus.这些集合运算都是二元运算,运算结果仍然是一个记录集合 ...
- 第七十一章 SQL命令 SELECT(三)
文章目录 第七十一章 SQL命令 SELECT(三) 列别名 字段列别名 Non-Field列别名 FROM子句 表的别名 Sharding Transparent to SELECT Queries ...
- Kali Linux 网络扫描秘籍 第七章 Web 应用扫描(三)
第七章 Web 应用扫描(三) 作者:Justin Hutchens 译者:飞龙 协议:CC BY-NC-SA 4.0 7.13 使用 BurpSuite Sequencer(序列器) Web 应用会 ...
最新文章
- Visual Studio 2013 在使用 razor无智能提示的解决办法
- 【有奖征文】如何提高IDC机房服务器的安全性
- linux 核间通讯rpmsg架构分析
- Nginx安装,Nginx静态缓存,Nginx Gzip压缩,Nginx负载均衡,Nginx方向代理,Nginx+Tomcat+Redis做session共享
- 牛客网 【每日一题】4月10日 二分图染色(弱化版)
- abstract的一些用法
- Django账号绑定邮箱时发送链接
- 国际旅游管理专业跨专业考计算机,第二年跨校跨专业考旅游管理公费成功,一点经验给大家...
- centos7(linux)使用心得
- 原声php 读取excel乱码_如何解决php读取excel乱码问题
- 乳酸的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- IT行业道德伦理 介绍
- 程序员辉辉想裸辞,但又不太敢
- 注册CSE服务中心失败排查步骤
- 三级等保测评都有哪些环节?
- 人工智能正在学习如何创造自己
- “单词不用背,看完自然会”,4天背过2万单词,原来学英语真的有捷径!
- Idea安装完成后打不开的问题
- 数据清洗是清洗什么?
- python --获取内网IP地址
热门文章
- 不同行业数据分析思路5
- java html文本编辑器,基于Java WebHTML在线文本编辑器解决方案.doc
- 【优化调度】基于matlab电力系统热电联产机组优化调度问题【含Matlab源码 2206期】
- web课程设计网页规划与设计:HTML+CSS班级设计题材——我的校园班级
- Android所有权限说明
- C++程序员的职业寿命比Java长?Java程序员同意吗?
- c++多线程重点难点(六)CriticalSection
- wordpress 阿里百秀XIU主题 v7.7最新版本下载和使用教程
- fieldset——一个不常用的HTML标签
- mybatis同一个搜索框对多个字段进行模糊查询