数据库子查询经典面试题

数据库】SQL经典面试题 - 数据库查询 - 子查询应用二

发布于 1 年前  作者 tommy  575 次浏览  最后一次编辑是 10 个月前  来自 数据库

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

子查询概念:

一个SELECT语句嵌套在另一个SELECT语句中,子查询也叫做内部查询,而包含子查询的语句又称为外部查询或主查询,子查询自身可以包含一个或多个子查询,一个查询语句中可以嵌套任意数量的子查询

子查询可分类:

非相关子查询:独立于外部查询,子查询只执行一次,执行完将结果传递给外部查询
相关子查询:依赖于外部查询的数据,外部查询每执行一次,子查询就执行一次

面试题:

还是这道数据库面试题
柠檬班第30期学生要毕业了,他们的成绩存放在下表中,写出以下的SQL语句

1.创建表 create table table lemon_grade (id int(10) primary key auto_increment , name varchar(20), linux float(10), mysql float(10), java float(10), grade varchar(10));

2. 插入数据insert into lemon_grade (name,linux,mysql,java,grade) 

values ("刘一",80,60,70,"18期"),("陈二”,70,90,80,"18期").....;

3.修改数据 update lemon_grade set mysgl = 70 where name ="刘一";

4.删除数据delete from lemon_grade where name =‘郑十’;

题目一:查询最新的一条记录

select * from lemon_grade group by id desc limit1;

select * from lemon_grade where id= max(id);

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 lemon_grade where linux>(select avg(linux) from lemon_grade);

子查询方式:
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;

原文地址:https://www.cnblogs.com/wz123/p/9722942.html

时间: 2024-10-02 20:16:26

数据库子查询经典面试题的相关文章

SQL 数据库 子查询及示例

子查询,又叫做嵌套查询. 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询. 子查询有两种类型: 一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数: 另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的数据表. 示例: --创建一个数据库,建立一个部门表格和部门人员表格 Create database gongs --创建一个gongs的数据库 go use

SQL 数据库 子查询、主外键

子查询,又叫做嵌套查询. 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询. 子查询有两种类型: 一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数: 另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的数据表. 主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通

数据库子查询

子查询 需要特别指出的是,子查询的SELECT语句不能使用ORDER BY子句,ORDER BY子句只能对最终结果排序. 相关子查询

数据库 子查询和分页查询

在建立子查询时需要建立两个表 如何建立关联 关联需要在创建表结束之后关联, 右击需要关联的表,选择“设计”,出现设计界面(下方右图) 点击添加,然后点击表和列规范,出现“...”选项,点开进行选择 打开界面如下图,设置主键表为bumen 里的bcode 外键表为renyuan 里的bumen  进行查询,子查询,和分页查询 分页查询 根据已有信息确定需要分成几页 在建立关系后,如果添加主键之外的信息,会自动终止语句 1009不在bumen的bcode列,所以终止执行

数据库 子查询练习 三个表之间的查询

子查询练习 建立三个表进行三个表之间的子查询 --表一:学生表 student--学号:code int (主键)从1开始--姓名:name varchar(50)--班级:banji char(10)--语文教师编号:yujiao int --数学教师编号:yujiao int --英语教师编号:yujiao int --表二:教师表 teacher--教师编号:code int (主键) 从1001开始--负责课程:lesson char(10)(语文.数学.英语)--年龄:age int-

oracle数据库子查询的结果需要使用多次解决办法

with c as (select a.trandt,sum(a.tranam) tranam from tran a group by a.trandt )--将子查询抽取出来,以后可以直接用.该方法只适用于oracle,mysql不支持 select c.trandt, sum(d.tranam) from c inner join c d on c.trandt >= d.trandt group by c.trandt select c.trandt, sum(d.tranam) fro

MySql 子查询经典案列

# 1. 查询工资最低的员工信息: last_name, salary #①查询最低的工资SELECT MIN(salary)FROM employees #②查询last_name,salary,要求salary=①SELECT last_name,salaryFROM employeesWHERE salary=( SELECT MIN(salary) FROM employees); # 2. 查询平均工资最低的部门信息 #方式一:#①各部门的平均工资SELECT AVG(salary),

走向面试之经典的数据库基础:二、SQL进阶之case、子查询、分页、join与视图

一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN value3 THEN returnvalue3  ELSE defaultreturnvalue END (2)具体使用示例: 假设我们有一个论坛网站,其中有一张User表{ UId,Name,Level },Level是一个int类型,代

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两