Sql面试50题 详解 持续更新

article/2025/10/3 14:02:09

Sql面试50题

前言:此文章是根据【数据分析】- SQL面试50题 - 跟我一起打怪升级 一起成为数据科学家

学习整理而来,仅供复习参考。

在这里插入图片描述

建表与插入数据

--建立学生表
CREATE TABLE `Student`(
`s_id` VARCHAR(20),
`s_name` VARCHAR(20) NOT NULL DEFAULT '',
`s_birth` VARCHAR(20) NOT NULL DEFAULT '',
`s_sex` VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY(`s_id`)
);--建立课程表
CREATE TABLE `Course`(
`c_id` VARCHAR(20),
`c_name` VARCHAR(20) NOT NULL DEFAULT '',
`t_id` VARCHAR(20) NOT NULL,
PRIMARY KEY(`c_id`)
);--建立教师表CREATE TABLE `Teacher`(
`t_id` VARCHAR(20),
`t_name` VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(`t_id`)
);--建立成绩表CREATE TABLE `Score`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMARY KEY(`s_id`,`c_id`)
);
--插入学生表测试数据
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');
--课程表测试数据
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');--教师表测试数据
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');--成绩表测试数据
insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);--查询学生表所有数据
SELECT *
FROM student

1、查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号(重点)

  • 涉及的表:score,子查询
  • 使用的关键字:SELECT,FROM,INNER JOIN,ON,AS

解题思路:

构建如图的表格,使用简单查询即可得到结果。

在这里插入图片描述

为构建图中表格,首先需要单独查询到选修课程01的学生id与成绩,然后得到02课程的学生id与成绩。使用两个子查询;

然后**以s_id为连接条件,通过内连接求交集即可得到图下的表。**之后在查询01课程成绩大于02课程的学生id即可,如需要查询学生具体信息,则需要再与学生表进行内连接,以s_id为连接条件即可。

在这里插入图片描述

SQL语句

SELECT a.s_id,a.s_score "01",b.s_score "02"
FROM (SELECT * FROM score WHERE c_id='01') AS a
INNER JOIN(SELECT * FROM score WHERE c_id='02') AS b ON a.s_id=b.s_id
WHERE a.s_score>b.s_score

查询结果
在这里插入图片描述

2、查询平均成绩大于60分的学生的学号和平均成绩(简单,第二道重点)

  • 涉及的表:score
  • 使用的关键字:SELECT,FROM,INNER JOIN,ON,AS

解题思路:

此题目考察的是对 GROUP BY 语句的使用与理解,首先需要对成绩表按照学生id进行分组,然后使用函数avg统计出平均成绩,再进行条件判断即可。

注意:

SELECT 中查询的字段最好是GROUP BY中使用到的字段或者是统计函数,不然的话可能没有意义。

SQL语句

--2、查询平均成绩大于60分的学生的学号和平均成绩(简单,第二道重点)
SELECT s_id,AVG(s_score)
FROM score
GROUP BY s_id
HAVING AVG(s_score)>60

查询结果

在这里插入图片描述


5/28更新

3、查询所有学生的学号、姓名、选课数、总成绩(不重要)

  • 涉及的表:score,student
  • 使用的关键字:SELECT,FROM,INNER JOIN,ON,AS

解题思路:

  1. 先把学生表和成绩表进行左连接,这里需要使用左连接,这样不会丢失学生表中的数据;

  2. 利用GROUP BY 和 COUNT,SUM 获取学生所选的选课数,总成绩。

  3. 需要对总成绩为null的情况进行单独处理,让其显示0,这里可以有两种处理方式,一种是IFNULL ,另一个是 case when

    这里可以使用 IFNULL 来进行判断,如果第一个表达式值为空则返回后面的值,即0,如果不为空,则返回第一个表达式的值

SELECT a.s_id,a.s_name,COUNT(c_id),IFNULL(SUM(s_score),0)
FROM  student AS a  LEFT JOIN score AS b 
ON a.s_id=b.s_id
GROUP BY s_id

​ 也可也使用 case when 来进行判断

SELECT a.s_id,a.s_name,COUNT(c_id),
SUM(CASE WHEN s_score IS NULL THEN 0 ELSE s_score END) AS "总成绩"
FROM  student AS a  LEFT JOIN score AS b 
ON a.s_id=b.s_id
GROUP BY s_id

查询结果

在这里插入图片描述

4、查询姓“张”的老师的个数(不重要)

  • 涉及的表:teacher
  • 主要的关键字:LIKE

解题思路:

使用 LIKE 关键字进行查询匹配即可。

  • %张 表示结尾带张的字符串
  • %张% 表示查询中间带张的姓名
  • 张% 表示以张开头的字符串
SELECT COUNT(t_id)
FROM teacher
WHERE t_name LIKE'张%'--查询不重名的姓张老师的个数
SELECT COUNT(DISTINCT t_name)
FROM teacher
WHERE t_name LIKE'张%'

查询结果: 结果为 1

5、查询没学过“张三”老师课的学生的学号、姓名(重点⭐)

  • 涉及的表:course,teacher,student,score
  • 主要的关键字:LIKE

解题思路:

一个老师可能会教多门课程,本题目的背景是成绩表中有成绩表示学生选择了这门课程。

  1. 首先需要在课程表中查询到张三老师教的所有课程, 获取这些课程的课程号;
  2. 然后可以在成绩表中进行查询,获取选修过张三老师课程的学生的学号;
  3. 在学生表中进行查询,使用 not in ,查询学号不在第二步选修了张三老师课程学号的学号,即可得到结果。

注意:使用子查询效率会低一点,使用临时表会比较多一点。

​ 尝试直接查询没有选修的学号,后来发现因为一个学生会选择多门课程,不好排除,因此先查询选修过的同学,在查询没有选修的同学。

SQL语句

多增加了一门课程 和成绩,方便测试。

 INSERT INTO Course VALUES('04','JAVA','01');INSERT INTO Score VALUES('01' , '04' , 100);

获取张三老师教的所有课程号。

SELECT c_id
FROM course AS a 
INNER JOIN (SELECT t_id  FROM teacher  WHERE t_name='张三') AS b
ON a.t_id=b.t_id

获取学过了张三老师任意一门课程的学生学号,使用 DISTINCT 对学号去重,因为一个学生可能会选择多门课程。

SELECT DISTINCT s_id
FROM score
WHERE c_id IN(
SELECT c_id
FROM course AS a 
INNER JOIN (SELECT t_id  FROM teacher  WHERE t_name='张三') AS b
ON a.t_id=b.t_id
)

查询不在选修了的学号里的其他人,即没有学过张三老师课程的同学。

SELECT s_id,s_name FROM student
WHERE s_id NOT IN(
SELECT DISTINCT s_id
FROM score
WHERE c_id IN(
SELECT c_id
FROM course AS a 
INNER JOIN (SELECT t_id  FROM teacher  WHERE t_name='张三') AS b
ON a.t_id=b.t_id)
)

查询结果

在这里插入图片描述

6、查询学过“张三”老师所教的所有课的同学的学号、姓名(重点)

  • 涉及的表:course,teacher,student,score
  • 主要的关键字:LIKE

解题思路:

这题第一感觉可能是对第五题题目进行取反,仔细看题发现要求的是学过张三老师教的所有课程

一个老师可能会教多门课程,本题目的背景是成绩表中有成绩表示学生选择了这门课程。

  1. 先把所有的表进行内关联,得到一张大表;
  2. 查询老师姓名等于张三的信息,行;
  3. 统计出张三老师一共教了多少门课程 例题中为2;
  4. 按照学生id统计出学生的行数 即 学生所选修张三老师课程的数目;
  5. 查询选修课数等于张三老师教的所有课程数目的学生信息。

注意:

​ 个人感觉视频中的写法是错误的,题目要求的是学过张三教的所有课,视频的写法只考虑了张三只教一门课的方法,如下图,当张三教了两门课程的时候,按照题目意思应该只查出01号学生雷

SELECT *
FROM student AS s 
INNER JOIN score AS a ON s.s_id=a.s_id
INNER JOIN course AS b ON a.c_id=b.c_id
INNER JOIN teacher AS c ON b.t_id=c.t_id
WHERE t_name='张三'
ORDER BY s.s_id

在这里插入图片描述

SQL语句

SELECT s.s_id,COUNT(s.s_id),s.s_name
FROM student AS s 
INNER JOIN score AS a ON s.s_id=a.s_id
INNER JOIN course AS b ON a.c_id=b.c_id
INNER JOIN teacher AS c ON b.t_id=c.t_id
WHERE t_name='张三'
GROUP BY s.s_id
HAVING COUNT(s.s_id)=(
SELECT COUNT(*) FROM course 
WHERE t_id=(SELECT t_id FROM teacher WHERE t_name='张三')
)

查询结果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/hYYid4jG.shtml

相关文章

大厂SQL面试题,连续时间问题

今天分享一个非常常考,同时也不太容易的sql题目类型,求连续时间问题。 这类题的核心是:分组排序,用时间减去排序,如果连续的话他们的差会是相同值 记住下面的表,按照提供的三步思路理清楚里面的数据逻辑&a…

经典Hive-SQL面试题及答案

目录 第一题 求分区累加值 第二题 UV和每个店铺访问量top3信息 Hive sql解答 第一题 求分区累加值 我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/…

吊打面试官之SQL面试题30问及答案

经典SQL30问一: 编写查询,查找表中的行总数。编写查询,消除表结果中的重复记录。编写查询,获取t_employee表中designation字段前3个字符。查询t_employee表,合并输出Designation和Department两个字段的内容。如果使用union和union all合并4条SQL子查询,union会有多少次被用来去…

pl sql面试题_PL SQL面试问答

pl sql面试题 If you have worked on Oracle database and going for an interview, you should go through PL SQL interview questions and answers. 如果您曾经在Oracle数据库上工作过并且要进行面试,则应该阅读PL SQL面试问题和答案。 PLSQL stands for Procedural Langu…

常见的sql面试题

本章是SQL面试题的汇总,之后还会不断更新,文章的思维导图如下: 1.SQL初级查询 单表查询 -- 查询学生表中有几名学生的信息.显示学号 select distinct 学号 from student;查询条件 -- 查询学生表中性别为女的学生所有信息 SELECT * FROM student WHERE 性别女;结果排序 -- …

美团/得物sql面试题

解题思路: 1.找出uid不同的但是买过pro_id相同的商品的用户 [自连接] selecta.uid,b.pro_id fromtb_order ajoin tb_order bon a.pro_id b.pro_id where a.uid <> b.uid -- 找出uid不同的但是pro_id相同的商品2.对uid和pro_id进行分组 selecta.uid,a.pro_id fromtb…

Spark SQL面试题

1.RDD DataFrame DataSet的区别 &#xff08;1&#xff09; 三者之间的关系 DataFrame是特殊的RDD(它相当于RDDschema&#xff0c;即RDD表信息)&#xff0c;可以将他看成数据库中的一张数据表&#xff0c;但是只知道这个"表"中的各个字段&#xff0c;不知道各个字段…

SQL常见面试题

SQL常见面试题关系型数据库&#xff08;SQL&#xff09;非关系型数据库&#xff08;NoSQL&#xff09;数据库三大范式主键与外键CHAR与VRCHAR数据类型临时表数据库函数、触发过程与存储器 SQL语句SQL语言分类DROP、TRUNCATE、DELETE的区别sum、count(\*)、count(1)、count(colu…

常见的SQL面试题:经典50例

SQL基础知识整理 select 查询结果&#xff0c;如: [学号,平均成绩&#xff1a;组函数avg(成绩)] from 从哪张表中查找数据&#xff0c;如:[涉及到成绩&#xff1a;成绩表score] where 查询条件&#xff0c;如:[b.课程号0003 and b.成绩>80] group by 分组&#xff0c;如:…

5个必考的大厂SQL面试题

学Python的同学&#xff0c;SQL也一定要学习&#xff0c;SQL几乎是每个数据岗的必备题目&#xff0c;下面分享几个常见的大厂SQL习题。 &#xff08;1&#xff09;找出连续7天登陆&#xff0c;连续30天登陆的用户&#xff08;小红书笔试&#xff0c;电信云面试&#xff09;&am…

7 大开源数据库利弊全对比

1、CUBRID CUBRID 是一个很好的免费开源选择&#xff0c;专门针对 Web 应用程序进行优化&#xff0c;当复杂的 Web 服务需要处理大量数据并生成巨大的并发请求时&#xff0c;CUBRID 非常有用。这个解决方案是用 C 写的。 优点&#xff1a; 多粒度锁定 在线备份 用于开发语言…

还在用Navicat?这款开源的数据库管理工具界面更炫酷!

数据库管理工具&#xff0c;是后端程序员使用频率非常高的的工具。Navicat、DataGrip虽然很好用&#xff0c;但都是收费的。最近在逛Github的时候&#xff0c;无意间发现了一款开源的数据库管理工具Beekeeper Studio&#xff0c;界面非常炫酷推荐给大家&#xff01; Beekeeper…

开源数据库管理系统现在比商业产品更受欢迎

原文链接&#xff1a;https://db-engines.com/en/blog_post/86 2021年1月13日 作者&#xff1a;马蒂亚斯盖尔曼&#xff08;Matthias Gelbmann&#xff09; Matthias Gelbmann是奥地利维也纳Solid IT联合创始人&#xff0c;董事总经理兼顾问。 Matthias Gelbmann在维也纳学习了…

你了解世界上功能最强大的开源数据库吗?

如果不是领导强制要求&#xff0c;可能根本不会留意到这款号称世界上功能最强大的开源数据库——PostgreSQL。如果你不读这篇文章&#xff0c;或许也会错过一个跃跃欲试想挤进前三的优秀数据库。 为了能够熟练运用&#xff0c;特意买书研究&#xff0c;发现这款数据库还真有点…

开源数据库列表

转载于&#xff1a;http://database.csdn.net/subject/databaseopen.htm 编辑导语 开源数据库最初的诞生和发展大都依靠自由软件开发者&#xff0c;但是&#xff0c;现在越来越多的IT公司开始把触角伸向了开源数据库。而早期投身于其中的IT厂商早已获利&#xff0c;比如Sleepy…

TuGraph 开源数据库体验

TuGraph 开源数据库体验 文章目录 TuGraph 开源数据库体验1. 简单介绍2. 可视化界面体验&#xff1a;查询界面&#xff1a;数据建模&#xff1a;数据导入&#xff1a; 3. 体验心得&#xff1a; 1. 简单介绍 TuGraph 是蚂蚁集团自主研发的大规模图计算系统&#xff0c;提供图数…

数据库与开源的未来

大家好&#xff0c;社区的小伙伴可能已经发现CnosDB已经全面拥抱Rust。我们一直高度关注行业趋势的发展&#xff0c;拥抱新兴的语言和前沿的技术。本期Jesse就想跟大家聊聊数据库与开源的未来。 本文仅代表个人观点&#xff0c;如有偏颇之处&#xff0c;还请海涵&#xff5e; …

做了7年开源数据库开发,我学到了什么?

作者 | PHILIP OTOOLE&#xff0c;已获作者授权 译者 | 弯月 责编 | 欧阳姝黎 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2016年4月9日&#xff0c;第一版rqlite&#xff08;https://github.com/rqlite/rqlite/releases/tag/v1.0&#xff09;正式发布&a…

【数据库】什么是 PostgreSQL?开源数据库系统

文章目录 前言什么是 PostgreSQL&#xff1f;PostgreSQL 中的 SQL服务器管理接口 PostgreSQL 用途通用 OLTP&#xff1a;联合中心&#xff1a;地理空间&#xff1a;LAPP 堆栈&#xff1a; 使用 PostgreSQL 有什么好处&#xff1f;开源许可证&#xff1a;易于扩展&#xff1a;可…

这款免费开源的数据库工具,支持所有主流数据库!

Java技术栈 www.javastack.cn 关注阅读更多优质文章 DBeaver 是一个基于 Java 开发&#xff0c;免费开源的通用数据库管理和开发工具&#xff0c;使用非常友好的 ASL 协议。可以通过官方网站或者 Github 进行下载。 由于 DBeaver 基于 Java 开发&#xff0c;可以运行在各种操作…