【数据库】SQL经典面试题 - 数据库查询 - 子查询应用二
上节课我们通过子查询,完成了查询的最高分学生的需求,今天我们来学习子查询的分类,以及通过子查询来完成工作中经常遇到一些个性化需求。
子查询概念:
一个SELECT语句嵌套在另一个SELECT语句中,子查询也叫做内部查询,而包含子查询的语句又称为外部查询或主查询,子查询自身可以包含一个或多个子查询,一个查询语句中可以嵌套任意数量的子查询
子查询可分类:
非相关子查询:独立于外部查询,子查询只执行一次,执行完将结果传递给外部查询相关子查询:依赖于外部查询的数据,外部查询每执行一次,子查询就执行一次
面试题:
还是这道数据库面试题柠檬班第30期学生要毕业了,他们的成绩存放在下表中,写出以下的SQL语句
题目一:查询最新的一条记录
Order by 方式:
降序排列然后得到我们最新的一条记录,这是我们常写的一种方式
SELECT * FROM tb_lemon_grade ORDER BY id DESC LIMIT 1;
子查询方式:
但查询最新一条记录,也可以这么去思考:查看id值最大(id是自动增长的,最新表示id值最大)的记录,所以可以这么去写查询
SELECT * FROM tb_lemon_grade WHERE id = ( SELECT max(id) FROM tb_lemon_grade);
其中子查询SELECT max(id) FROM tb_lemon_grade查询的是记录表中最大的一个id,在整个查询中,只会查询一遍,这种就是非相关子查询,执行完毕后,会将值传递给外部查询。
题目二:查询Linux成绩高于平均分的所有同学
子查询方式:
SELECT * FROM tb_lemon_grade WHERE Linux > ( SELECT avg(Linux) FROM tb_lemon_grade );
上面子查询SELECT avg(Linux) FROM tb_lemon_grade也是非相关子查询,语句只会执行一遍
关联查询方式:
这个题目我们可以使用两个表的关联查询得到结果
SELECT t1.* FROM tb_lemon_grade t1,(SELECT avg(Linux) avgLinux FROM tb_lemon_grade) t2
where t1.Linux>t2.avgLinux;
题目三:查询每个班级Linux成绩高于本班Linux平均分的所有同学:
子查询方式
SELECT * FROM tb_lemon_grade t1
WHERE t1.Linux >(
SELECT avg(t2.Linux) FROM tb_lemon_grade t2
WHERE t1.class_name = t2.class_name
);
我们来分析下这个题目,查询每个班级Linux成绩高于本班Linux平均分的所有同学,而每个班的Linux平均分不同,所以我们采用相关子查询,语句中的这个子查询依赖于外部的查询( 子查询中的t1.class_name = t2.class_name就是外部的表),外部查询每执行一次,子查询就执行一次。
分组的方式写子查询:
SELECT * FROM tb_lemon_grade t1
WHERE t1.Linux > (
SELECT avg(t2.Linux) FROM tb_lemon_grade t2
GROUP BY t2.class_name
HAVING t1.class_name = t2.class_name );
关联查询方式:
通过分组查询出每个班的最高分,再与原表进行等值连接查询,得到最后结果。
SELECT * FROM tb_lemon_grade t1, (
SELECT avg(Linux) avgLinux, class_name
FROM tb_lemon_grade
GROUP BY class_name
) t2
WHERE t1.class_name = t2.class_name
AND t1.Linux>t2.avgLinux;
【数据库】SQL经典面试题 - 数据库查询 - 子查询应用二的更多相关文章
- 数据库MySQL经典面试题之SQL语句
数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...
- 数据库常用SQL语句(三):子查询
一.为什么会使用子查询 虽然可以通过连接查询来实现多表查询数据记录,但不建议使用,因为连接查询的性能很差,为什么呢?我们来进行分析,例如 我们要查询部门表t_dept 和雇员表t_employee中的 ...
- 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询
简书作者:seay 文章出处: 关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询 回顾:[知识库]-数据库_MySQL常用SQL语句语法大全示例 Learn [已经过测试校验] 一.简单查询 ...
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...
- oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by
select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...
- SQL Server中INNER JOIN与子查询IN的性能测试
这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...
- 为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录
为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录???原因很简单: SELECT * FROM dbo.TableA AS a WHERE a.id NOT IN ( ...
- ylb: SQL表的高级查询-子查询
ylbtech-SQL Server: SQL Server- SQL表的高级查询-子查询 SQL Server 表的高级查询-子查询. 1,ylb:表的高级查询-子查询返回顶部 --======== ...
- 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)
原文:在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. sql循环取差值,该怎 ...
随机推荐
- linux ls文件颜色和底色设置
转帖 :linux ls文件颜色和底色设置 白色:表示普通文件蓝色:表示目录绿色:表示可执行文件红色:表示压缩文件浅蓝色:链接文件红色闪烁:表示链接的文件有问题黄色:表示设备文件灰色:表示其他文件 这 ...
- 关于 WinScp 的一点使用经验
在嵌入式平台下 是,使用SSH登陆,可以使用WinScp提供的图形界面,支持拖拽,鼠标直接打开,甚是好用. 使用WinScp 登陆的方式有,Scp和sftp两种,之前一只用scp,但后来出现了如下错误 ...
- SpringBoot(五)_表单验证
SpringBoot(五)_表单验证 参数校验在我们日常开发中非常常见,最基本的校验有判断属性是否为空.长度是否符合要求等,在传统的开发模式中需要写一堆的 if else 来处理这些逻辑,很繁琐,效率 ...
- 数据库优化之SQL语句优化-记录
1. 操作符优化 (a) IN 操作符 从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查 ...
- python selenium wait方法
遇到一个网站运行很慢,所以要等待某个元素显示出来之后再进行操作,自己手上的书上没有例子可以直接用 发现一篇文章:http://www.cnblogs.com/yoyoketang/p/6517477. ...
- 【2018ICPC青岛】
B 题意:给n个问题,每个问题有一个固定的答案ai(<=10^5).现在有m个约束关系,每个约束关系是一个二元组(ui,vi),表示你回答ui.vi问题的答案必须一样. 现在让你输出分别修复一个 ...
- 【THUSC2017】巧克力
题目描述 “人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.” 明明收到了一大块巧克力,里面有若干小块,排成n行m列.每一小块都有自己特别的图案ci,j,它们有的是海星,有的是贝壳,有的 ...
- 数据库之MySQL的介绍与使用20180703
/*******************************************************************************************/ 一.mysq ...
- Python 爬虫入门(一)
毕设是做爬虫相关的,本来想的是用java写,也写了几个爬虫,其中一个是爬网易云音乐的用户信息,爬了大概100多万,效果不是太满意.之前听说Python这方面比较强,就想用Python试试,之前也没用过 ...
- Codeforces Round #302 (Div. 2) C 简单dp
C. Writing Code time limit per test 3 seconds memory limit per test 256 megabytes input standard inp ...