上节课我们通过子查询,完成了查询的最高分学生的需求,今天我们来学习子查询的分类,以及通过子查询来完成工作中经常遇到一些个性化需求。

子查询概念:

一个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经典面试题 - 数据库查询 - 子查询应用二的更多相关文章

  1. 数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

  2. 数据库常用SQL语句(三):子查询

    一.为什么会使用子查询 虽然可以通过连接查询来实现多表查询数据记录,但不建议使用,因为连接查询的性能很差,为什么呢?我们来进行分析,例如 我们要查询部门表t_dept 和雇员表t_employee中的 ...

  3. 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询

    简书作者:seay 文章出处: 关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询 回顾:[知识库]-数据库_MySQL常用SQL语句语法大全示例 Learn [已经过测试校验] 一.简单查询 ...

  4. 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询

    前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...

  5. oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by

    select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...

  6. SQL Server中INNER JOIN与子查询IN的性能测试

    这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...

  7. 为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录

    为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录???原因很简单: SELECT * FROM dbo.TableA AS a WHERE a.id NOT IN ( ...

  8. ylb: SQL表的高级查询-子查询

    ylbtech-SQL Server: SQL Server- SQL表的高级查询-子查询 SQL Server 表的高级查询-子查询. 1,ylb:表的高级查询-子查询返回顶部 --======== ...

  9. 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)

    原文:在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. sql循环取差值,该怎 ...

随机推荐

  1. log4j2分析总结(一)

    现在公司用log4j2 进行日志记录,我也看了相关的资料,现在进行记录学习总结下 整体结构 Appenders里设置日志的输出方式.级别和格式 Loggers里设置全局的级别和绑定appenders里 ...

  2. js本地储存userData实例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  3. BZOJ5286 HNOI/AHOI2018转盘(分块/线段树)

    显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也 ...

  4. BZOJ5254 FJWC2018红绿灯(线段树)

    注意到一旦在某个路口被红灯逼停,剩下要走的时间是固定的.容易想到预处理出在每个路口被逼停后到达终点的最短时间,这样对于每个询问求出其最早在哪个路口停下就可以了.对于预处理,从下一个要停的路口倒推即可. ...

  5. 【bzoj2154】 Crash的数字表格

    http://www.lydsy.com/JudgeOnline/problem.php?id=2154 (题目链接) 题意 给出${n,m}$,求$${\sum_{i=1}^n\sum_{j=1}^ ...

  6. 部署puppet master/agent模型

    自己画的一个简单的架构图 agent端每隔30分钟到master端请求与自己相关的catalog. 各节点时间要同步. 依赖DNS,各节点能通过主机名能解析. 1.同步时间 # yum install ...

  7. myeclipse2015修改web项目部署名

    在旧版本的myeclipse中修改web项目部署名很方便,直接右键在properties中查找web就能进行修改. 但是myeclipse2015中发现不能直接修改了. 我们可以点击config,或者 ...

  8. 实现运行在独立线程池的调度功能,基于Spring和Annotation

    使用Spring的注解(@Scheduled)声明多个调度的时候,由于其默认实现机制,将导致多个调度方法之间相互干扰(简单理解就是调度不按配置的时间点执行). 为了解决该问题尝试了修改线程池大小,但是 ...

  9. bzoj4427【Nwerc2015】Cleaning Pipes清理管道

    题目描述 Linköping有一个相当复杂的水资源运输系统.在Linköping周围的出水点有一些水井.这些水通过管道输送到其它地点.每条管道是从某一个水井到城市的某个位置的直线管道. 所有管道在地下 ...

  10. 线性回归,感知机,逻辑回归(GD,SGD)

    线性回归 线性回归是一个回归问题,即用一条线去拟合训练数据 线性回归的模型: 通过训练数据学习一个特征的线性组合,以此作为预测函数. 训练目标:根据训练数据学习参数(w1,w2, ... , wn,b ...