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

07-11 1638阅读

select employee_id, last_name, case department_id when (

select department_id

from departments

where location_id = 1800

) then ‘Canada’ else ‘USA’ end “location”

from employees;

  • 问题:查询员工的employee_id,last_name,要求按照员工的department_name排序

    select employee_id, last_name

    from employees e1

    order by (

    select department_name

    from departments d1

    where e1.department_id = d1.department_id

    )

    SQL 优化:能使用 EXISTS 就不要使用 IN

    • 问题:查询公司管理者的employee_id,last_name,job_id,department_id信息

      select employee_id, last_name, job_id, department_id

      from employees

      where employee_id in (

      select manager_id

      from employees

      )

      select employee_id, last_name, job_id, department_id

      from employees e1

      where exists (

      select ‘x’

      from employees e2

      where e1.employee_id = e2.manager_id

      )

      • 问题:查询departments表中,不存在于employees表中的部门的department_id和department_name

        select department_id, department_name

        from departments d1

        where not exists (

        select ‘x’

        from employees e1

        where e1.department_id = d1.department_id

        )

        • 更改 108 员工的信息: 使其工资变为所在部门中的最高工资, job 变为公司中平均工资最低的 job

          update employees e1

          set salary = (

          select max(salary)

          from employees e2

          where e1.department_id = e2.department_id

          ), job_id = (

          select job_id

          from employees

          group by job_id

          having avg(salary) = (

          select min(avg(salary))

          from employees

          group by job_id

          )

          )

          where employee_id = 108;

          • 删除 108 号员工所在部门中工资最低的那个员工.

            delete from employees e1

            where salary = (

            select min(salary)

            from employees

            where department_id = (

            select department_id

            from employees

            where employee_id = 108

            )

            )

            select * from employees where employee_id = 108;

            select * from employees where department_id = 100

            order by salary;

            rollback;

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


            已知有如下4张表:

            • 学生表:student(学号,学生姓名,出生年月,性别)

            • 成绩表:score(学号,课程号,成绩)

            • 课程表:course(课程号,课程名称,教师号)

            • 教师表:teacher(教师号,教师姓名)

              根据以上信息按照下面要求写出对应的SQL语句。(搜索公众号Java知音,回复“2021”,送你一份Java面试题宝典)

              ps:这些题考察SQL的编写能力,对于这类型的题目,需要你先把4张表之间的关联关系搞清楚了,最好的办法是自己在草稿纸上画出关联图,然后再编写对应的SQL语句就比较容易了。下图是我画的这4张表的关系图,可以看出它们之间是通过哪些外键关联起来的:

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

              一、创建数据库和表

              为了演示题目的运行过程,我们先按下面语句在客户端navicat中创建数据库和表。

              如何你还不懂什么是数据库,什么是客户端navicat,可以先学习这个:

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

              1.创建表
              1)创建学生表(student)

              按下图在客户端navicat里创建学生表。推荐:250期面试题汇总

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

              学生表的“学号”列设置为主键约束,下图是每一列设置的数据类型和约束

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

              创建完表,点击“保存”

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

              2)创建成绩表(score)

              同样的步骤,创建"成绩表“。“课程表的“学号”和“课程号”一起设置为主键约束(联合主键),“成绩”这一列设置为数值类型(float,浮点数值)

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

              3)创建课程表(course)

              课程表的“课程号”设置为主键约束

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

              4)教师表(teacher)

              教师表的“教师号”列设置为主键约束,教师姓名这一列设置约束为“null”(红框的地方不勾选),表示这一列允许包含空值(null)。推荐:250期面试题汇总

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

              向表中添加数据

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

              1)向学生表里添加数据

              添加数据的sql

              insert into student(学号,姓名,出生日期,性别)

              values(‘0001’ , ‘猴子’ , ‘1989-01-01’ , ‘男’);

              insert into student(学号,姓名,出生日期,性别)

              values(‘0002’ , ‘猴子’ , ‘1990-12-21’ , ‘女’);

              insert into student(学号,姓名,出生日期,性别)

              values(‘0003’ , ‘马云’ , ‘1991-12-21’ , ‘男’);

              insert into student(学号,姓名,出生日期,性别)

              values(‘0004’ , ‘王思聪’ , ‘1990-05-20’ , ‘男’);

              在客户端navicat里的操作

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

              2)成绩表(score)

              添加数据的sql

              insert into score(学号,课程号,成绩)

              values(‘0001’ , ‘0001’ , 80);

              insert into score(学号,课程号,成绩)

              values(‘0001’ , ‘0002’ , 90);

              insert into score(学号,课程号,成绩)

              values(‘0001’ , ‘0003’ , 99);

              insert into score(学号,课程号,成绩)

              values(‘0002’ , ‘0002’ , 60);

              insert into score(学号,课程号,成绩)

              values(‘0002’ , ‘0003’ , 80);

              insert into score(学号,课程号,成绩)

              values(‘0003’ , ‘0001’ , 80);

              insert into score(学号,课程号,成绩)

              values(‘0003’ , ‘0002’ , 80);

              insert into score(学号,课程号,成绩)

              values(‘0003’ , ‘0003’ , 80);

              客户端navicat里的操作

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

              3)课程表

              添加数据的sql

              insert into course(课程号,课程名称,教师号)

              values(‘0001’ , ‘语文’ , ‘0002’);

              insert into course(课程号,课程名称,教师号)

              values(‘0002’ , ‘数学’ , ‘0001’);

              insert into course(课程号,课程名称,教师号)

              values(‘0003’ , ‘英语’ , ‘0003’);

              客户端navicat里的操作

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

              4)教师表里添加数据

              添加数据的sql

              – 教师表:添加数据

              insert into teacher(教师号,教师姓名)

              values(‘0001’ , ‘孟扎扎’);

              insert into teacher(教师号,教师姓名)

              values(‘0002’ , ‘马化腾’);

              – 这里的教师姓名是空值(null)

              insert into teacher(教师号,教师姓名)

              values(‘0003’ , null);

              – 这里的教师姓名是空字符串(‘’)

              insert into teacher(教师号,教师姓名)

              values(‘0004’ , ‘’);

              客户端navicat里操作

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

              添加结果

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

              三、50道面试题


              为了方便学习,我将50道面试题进行了分类

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

              查询姓“猴”的学生名单

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

              查询姓“孟”老师的个数

              select count(教师号)

              from teacher

              where 教师姓名 like ‘孟%’;

              2.汇总统计分组分析

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

              面试题:查询课程编号为“0002”的总成绩

              –分析思路

              –select 查询结果 [总成绩:汇总函数sum]

              –from 从哪张表中查找数据[成绩表score]

              –where 查询条件 [课程号是0002]

              select sum(成绩)

              from score

              where 课程号 = ‘0002’;

              查询选了课程的学生人数

              –这个题目翻译成大白话就是:查询有多少人选了课程

              –select 学号,成绩表里学号有重复值需要去掉

              –from 从课程表查找score;

              select count(distinct 学号) as 学生人数

              from score;

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

              查询各科成绩最高和最低的分, 以如下的形式显示:课程号,最高分,最低分

              /*

              分析思路

              select 查询结果 [课程ID:是课程号的别名,最高分:max(成绩) ,最低分:min(成绩)]

              from 从哪张表中查找数据 [成绩表score]

              where 查询条件 [没有]

              group by 分组 [各科成绩:也就是每门课程的成绩,需要按课程号分组];

              */

              select 课程号,max(成绩) as 最高分,min(成绩) as 最低分

              from score

              group by 课程号;

              查询每门课程被选修的学生数

              /*

              分析思路

              select 查询结果 [课程号,选修该课程的学生数:汇总函数count]

              from 从哪张表中查找数据 [成绩表score]

              where 查询条件 [没有]

              group by 分组 [每门课程:按课程号分组];

              */

              select 课程号, count(学号)

              from score

              group by 课程号;

              查询男生、女生人数

              /*

              分析思路

              select 查询结果 [性别,对应性别的人数:汇总函数count]

              from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表student]

              where 查询条件 [没有]

              group by 分组 [男生、女生人数:按性别分组]

              having 对分组结果指定条件 [没有]

              order by 对查询结果排序[没有];

              */

              select 性别,count(*)

              from student

              group by 性别;

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

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

              /*

              题目翻译成大白话:

              平均成绩:展开来说就是计算每个学生的平均成绩

              这里涉及到“每个”就是要分组了

              平均成绩大于60分,就是对分组结果指定条件

              分析思路

              select 查询结果 [学号,平均成绩:汇总函数avg(成绩)]

              from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表score]

              where 查询条件 [没有]

              group by 分组 [平均成绩:先按学号分组,再计算平均成绩]

              having 对分组结果指定条件 [平均成绩大于60分]

              */

              select 学号, avg(成绩)

              from score

              group by 学号

              having avg(成绩)>60;

              查询至少选修两门课程的学生学号

              /*

              翻译成大白话:

              第1步,需要先计算出每个学生选修的课程数据,需要按学号分组

              第2步,至少选修两门课程:也就是每个学生选修课程数目>=2,对分组结果指定条件

              分析思路

              select 查询结果 [学号,每个学生选修课程数目:汇总函数count]

              from 从哪张表中查找数据 [课程的学生学号:课程表score]

              where 查询条件 [至少选修两门课程:需要先计算出每个学生选修了多少门课,需要用分组,所以这里没有where子句]

              group by 分组 [每个学生选修课程数目:按课程号分组,然后用汇总函数count计算出选修了多少门课]

              having 对分组结果指定条件 [至少选修两门课程:每个学生选修课程数目>=2]

              */

              select 学号, count(课程号) as 选修课程数目

              from score

              group by 学号

              having count(课程号)>=2;

              查询同名同性学生名单并统计同名人数

              /*

              翻译成大白话,问题解析:

              1)查找出姓名相同的学生有谁,每个姓名相同学生的人数

              查询结果:姓名,人数

              条件:怎么算姓名相同?按姓名分组后人数大于等于2,因为同名的人数大于等于2

              分析思路

              select 查询结果 [姓名,人数:汇总函数count(*)]

              from 从哪张表中查找数据 [学生表student]

              where 查询条件 [没有]

              group by 分组 [姓名相同:按姓名分组]

              having 对分组结果指定条件 [姓名相同:count(*)>=2]

              order by 对查询结果排序[没有];

              */

              select 姓名,count(*) as 人数

              from student

              group by 姓名

              having count(*)>=2;

              查询不及格的课程并按课程号从大到小排列

              /*

              分析思路

              select 查询结果 [课程号]

              from 从哪张表中查找数据 [成绩表score]

              where 查询条件 [不及格:成绩 2

              /*

              第1步:得到每个学生的平均成绩,显示学号,平均成绩

              select 查询结果 [学号,平均成绩:汇总函数avg(成绩)]

              from 从哪张表中查找数据 [涉及到成绩:成绩表score]

              where 查询条件 [没有]

              group by 分组 [每个学生的平均:按学号分组]

              having 对分组结果指定条件 [没有]

              order by 对查询结果排序[没有];

              */

              select 学号, avg(成绩) as 平均成绩

              from score

              group by 学号;

              /*

              第2步:再加上限制条件:

              1)不及格课程

              2)两门以上[不及格课程]

              select 查询结果 [学号,平均成绩:汇总函数avg(成绩)]

              from 从哪张表中查找数据 [涉及到成绩:成绩表score]

              where 查询条件 [限制条件:不及格课程,平均成绩2,汇总函数count(课程号)>2]

              order by 对查询结果排序[没有];

              */

              select 学号, avg(成绩) as 平均成绩

              from score

              where 成绩 =2;

              如果上面题目不会做,可以复习这部分涉及到的sql知识:

              3.复杂查询

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

              【知识点】子查询

              1.翻译成大白话

              1)查询结果:学生学号,姓名 2)查询条件:所有课程成绩

              第1步,写子查询(所有课程成绩

              • select 查询结果[学号]

              • from 从哪张表中查找数据[成绩表:score]

              • where 查询条件[成绩

              • group by 分组[没有]

              • having 对分组结果指定条件[没有]

              • order by 对查询结果排序[没有]

              • limit 从查询结果中取出指定行[没有];

                select 学号

                from score

                where 成绩 

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]