sql面试50题------(1-10)

简介: 这篇文章提供了SQL面试中的前10个问题及其解决方案,包括查询特定条件下的学生信息、教师信息和课程成绩等。

文章目录

  • 1、查询课程编号‘01’比课程编号‘02’成绩高的所有学生学号
  • 2、查询平均成绩大于60分得学生的学号和平均成绩
  • 3、查询所有学生的学号,姓名,选课数,总成绩
  • 4、查询姓“猴”的老师的个数
  • 5、查询没有学过张三老师课的学生的学号和姓名
  • 6、查询学过张三老师所教的所有课的同学的学号和姓名
  • 7、查询学过编号为01的课程并且也学过编号为02的课程的学生的学号和姓名
  • 8、查询课程编号为02的总成绩
  • 9、查询所有课程成绩小于60分的学生的学号、姓名
  • 10、查询没有学全所有课程的学生的学号、姓名

1、查询课程编号‘01’比课程编号‘02’成绩高的所有学生学号

select a.s_id 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

在这里插入图片描述

扩展、同时查询出该学生的姓名和得分

select a.s_id,c.s_name,a.s_score 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
) INNER JOIN student as c on c.s_id = b.s_id
where a.s_score > b.s_score

在这里插入图片描述

2、查询平均成绩大于60分得学生的学号和平均成绩

select s_id,avg(s_score) 
from score 
group by s_id 
having avg(s_score)>60

在这里插入图片描述

3、查询所有学生的学号,姓名,选课数,总成绩

select a.s_id,a.s_name,COUNT(b.c_id),sum(s_score)
from student as a
left JOIN score as b on a.s_id=b.s_id
group by a.s_id

在这里插入图片描述

改进null

select a.s_id,a.s_name,COUNT(b.c_id),
sum(case when b.s_score is null then 0 else b.s_score END)
from student as a
left JOIN score as b on a.s_id=b.s_id
group by a.s_id

在这里插入图片描述

4、查询姓“猴”的老师的个数

select count(t.t_id)
from teacher as t
where t.t_name like '猴%'

在这里插入图片描述
扩展 含有猴的老师的个数
\==%==表示多个字符串

select count(t.t_id)
from teacher as t
where t.t_name like '%猴%'

在这里插入图片描述

扩展二、几个以“张”开头的不重复姓名。需要去重

select count(distinct t.t_name)
from teacher as t
where t.t_name like '张%'

在这里插入图片描述

5、查询没有学过张三老师课的学生的学号和姓名

select s_id,s_name
from student
where s_id not in(

select s_id 
from score
where c_id =(

select c_id
from course
where t_id=(

select t_id 
from teacher 
where t_name ='张三'
)
)
)

在这里插入图片描述
使用连接

select s_id,s_name from student where s_id not in(

select score.s_id from teacher as t 
inner join course as c on t.t_id = c.t_id 
inner join score on c.c_id=score.c_id 
where t.t_name='张三'

)

在这里插入图片描述

6、查询学过张三老师所教的所有课的同学的学号和姓名

select s_id,s_name
from student
where s_id  in(

select s_id 
from score
where c_id =(

select c_id
from course
where t_id=(

select t_id 
from teacher 
where t_name ='张三'
)
)
)

在这里插入图片描述
扩展

select s_id,s_name from student where s_id  in(

select score.s_id from teacher as t 
inner join course as c on t.t_id = c.t_id 
inner join score on c.c_id=score.c_id 
where t.t_name='张三'

)

在这里插入图片描述

7、查询学过编号为01的课程并且也学过编号为02的课程的学生的学号和姓名

select s_id,s_name from student 
where s_id in(

select a.s_id 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

)

在这里插入图片描述

8、查询课程编号为02的总成绩

select sum(s_score) from score group by c_id having c_id='02'

在这里插入图片描述
扩展 avg sum count

每门课的选课人数、平均数、总分数

select c_id, sum(s_score),avg(s_score),count(s_score) from score group by c_id

在这里插入图片描述

9、查询所有课程成绩小于60分的学生的学号、姓名

select s_id,s_name from student
where s_id in
(
select a.s_id from

(
select s_id,count(c_id) as cnt
from score
where s_score < 60 
group by s_id 
) as a 
INNER JOIN
(
select s_id ,count(c_id) as cnt
from score
group by s_id
) as b on a.s_id=b.s_id

where a.cnt = b.cnt


)

在这里插入图片描述

10、查询没有学全所有课程的学生的学号、姓名

select a.s_id 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

在这里插入图片描述

补充知识
inner join(等值连接) 只返回两个表中联结字段相等的行

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

INNER JOIN 语法:

INNER JOIN 连接两个数据表的用法:

SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号

INNER JOIN 连接三个数据表的用法:


SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号
相关文章
|
2月前
|
SQL 数据库
SQL面试50题------(初始化工作、建立表格)
这篇文章提供了SQL面试中可能会遇到的50道题目的建表和初始化数据的SQL脚本,包括学生、教师、课程和成绩表的创建及数据插入示例。
SQL面试50题------(初始化工作、建立表格)
|
5月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
151 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
5月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
957 0
|
5月前
|
SQL 关系型数据库 MySQL
MYSQL-SQL语句性能优化策略以及面试题
MYSQL-SQL语句性能优化策略以及面试题
120 1
|
2月前
|
SQL
sql面试50题------(11-20)
这篇文章提供了SQL面试中的50道题目,其中详细解释了11至20题,包括查询与学号为“01”的学生所学课程相同的学生信息、不及格课程的学生信息、各科成绩统计以及学生的总成绩排名等问题的SQL查询语句。
|
2月前
|
SQL
sql面试50题------(21-30)
这篇文章是SQL面试题的21至30题,涵盖了查询不同老师所教课程的平均分、按分数段统计各科成绩人数、查询学生平均成绩及其名次等问题的SQL查询语句。
sql面试50题------(21-30)
|
4月前
|
SQL 大数据
常见大数据面试SQL-每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题: 问题1:每年每门学科排名第一的学生 问题2:每年总成绩都有所提升的学生
|
4月前
|
SQL 关系型数据库 MySQL
sql面试题库
sql面试题库
|
4月前
|
SQL Oracle 关系型数据库
SQL 面试系列(一)【留存率问题】
SQL 面试系列(一)【留存率问题】
|
4月前
|
SQL 算法 大数据
深入解析力扣177题:第N高的薪水(SQL子查询与LIMIT详解及模拟面试问答)
深入解析力扣177题:第N高的薪水(SQL子查询与LIMIT详解及模拟面试问答)