MySQL[常见的面试题]

发布时间:2024年01月08日

前言:MySQL是一种流行的开源关系型数据库管理系统(RDBMS),最初由瑞典公司MySQL AB开发。它是一种轻量级、快速且易于使用的数据库系统,适用于各种规模的应用程序。

历史:

  • MySQL最初于1994年由Michael Widenius和David Axmark开发,并在1995年首次发布。
  • 在之后的发展中,MySQL获得了广泛的用户群和社区支持,成为最受欢迎的开源数据库之一。
  • 2008年,Sun Microsystems收购了MySQL AB。随后,Sun被Oracle收购,使得MySQL成为Oracle Corporation旗下的产品。
  • MySQL在发展历程中经历了多个版本迭代,不断增强功能并改善性能。

MySQL以其易用性、可靠性和可扩展性成为许多Web应用、企业应用和小型应用的首选数据库系统。它被广泛应用于Web开发、数据分析、电子商务和许多其他领域。MySQL的持续发展和社区支持使其成为数据库管理系统领域的重要参与者之一。?

?01)查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数? ?

涉及表:t_mysql_student , t_mysql_score

连接方式:内连接?

行转列:流程控制函数? ??

SELECT
    s.*,
    ( CASE WHEN t1.cid = '01' THEN t1.score END ) 语文,
    ( CASE WHEN t2.cid = '02' THEN t2.score END ) 数学 
FROM
    t_mysql_student s,
    ( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1,
    ( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2 
WHERE
    s.sid = t1.sid 
    AND t1.sid = t2.sid 
    AND t1.score > t2.score

?02)查询同时存在" 01 "课程和" 02 "课程的情况

涉及表:t_mysql_student , t_mysql_score

连接方式:内连接?

行转列:流程控制函数? ??

SELECT
    s.*,
    ( CASE WHEN t1.cid = '01' THEN t1.score END ) 语文,
    ( CASE WHEN t2.cid = '02' THEN t2.score END ) 数学 
FROM
    t_mysql_student s,
    ( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1,
    ( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2 
WHERE
    s.sid = t1.sid 
    AND t1.sid = t2.sid

03)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

涉及表:t_mysql_student , t_mysql_score

连接方式:内连接,外连接

行转列:流程控制函数? ??

SELECT
    s.*,
    ( CASE WHEN t1.cid = '01' THEN t1.score END ) 语文,
    ( CASE WHEN t2.cid = '02' THEN t2.score END ) 数学 
FROM
    t_mysql_student s
    INNER JOIN ( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1 ON s.sid = t1.sid
    LEFT JOIN ( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2 ON t1.sid = t2.sid

04)查询不存在" 01 "课程但存在" 02 "课程的情况

涉及表:t_mysql_student , t_mysql_score

查询方式:子查询

行转列:流程控制函数? ??

SELECT
    s.*,
    ( CASE WHEN sc.cid = '01' THEN sc.score END ) 语文,
    ( CASE WHEN sc.cid = '02' THEN sc.score END ) 数学 
FROM
    t_mysql_student s,
    t_mysql_score sc 
WHERE
    s.sid = sc.sid 
    AND s.sid NOT IN ( SELECT sid FROM t_mysql_score WHERE cid = '01' ) 
    AND sc.cid = '02'

?05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

涉及表:t_mysql_student , t_mysql_score

查询方式:外连接

聚合函数:四舍五入(?round()?),平均值(?avg()?

有聚合函数意味着分组( GROUP BY )

SELECT
    s.sid,
    s.sname,
    round( avg( sc.score ), 2 ) 平均数 
FROM
    t_mysql_student s
    LEFT JOIN t_mysql_score sc ON s.sid = sc.sid 
GROUP BY
    s.sid,
    s.sname 
HAVING
    平均数 >= 60

06)查询在t_mysql_score表存在成绩的学生信息

涉及表:t_mysql_student , t_mysql_score

查询方式:内连接

最后建议进行一次分组,不然数据过多

SELECT
    s.sid,
    s.sname 
FROM
    t_mysql_student s
    LEFT JOIN t_mysql_score sc ON s.sid = sc.sid 
GROUP BY
    s.sid,
    s.sname

?07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

?涉及表:t_mysql_student , t_mysql_score
查询方式:外连接
聚合函数:计数( count() ),求和( sum() )
有聚合函数意味着分组( GROUP BY )

SELECT
    s.sid,
    s.sname,
    count( sc.score ) 选课总数,
    sum( sc.score ) 总成绩 
FROM
    t_mysql_student s
    LEFT JOIN t_mysql_score sc ON s.sid = sc.sid 
GROUP BY
    s.sid,
    s.sname

?08)查询「李」姓老师的数量

考核:聚合函数》总数。like的使用

select count(*) from t_mysql_teacher where tname like '李%'

?09)查询学过「张三」老师授课的同学的信息

SELECT
 
s.*,c.cname,t.tname
 
FROM
 
t_mysql_teacher t,t_mysql_student s,t_mysql_course c,t_mysql_score sc
 
WHERE
 
t.tid=c.tid and c.cid=sc.cid and sc.sid=s.sid and tname = '张三'

10)查询没有学全所有课程的同学的信息

SELECT
 
s.sid,s.sname,count(sc.score) n
 
FROM
 
t_mysql_score sc,t_mysql_student s
 
WHERE
 
sc.sid=s.sid
 
GROUP BY
 
s.sid,s.sname
 
HAVING
 
n<(select count(c.cid) from t_mysql_course c )

?11)查询没学过"张三"老师讲授的任一门课程的学生姓名

select s.* from t_mysql_student s where s.sid not in(
 
SELECT
 
sc.sid
 
FROM
 
t_mysql_teacher t,t_mysql_course c,t_mysql_score sc
 
WHERE
 
t.tid=c.tid and c.cid=sc.cid and t.tname='张三'
 
GROUP BY
 
sc.sid)

12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT
 
s.sid,s.sname,ROUND(AVG(sc.score)) 平均成绩,COUNT(sc.cid) n
 
FROM
 
t_mysql_student s,t_mysql_score sc
 
WHERE
 
s.sid=sc.sid and sc.score<60
 
GROUP BY
 
s.sid,s.sname
 
HAVING
 
n>=2

13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息

SELECT
 
s.*
 
FROM
 
t_mysql_score sc,t_mysql_student s
 
WHERE
 
sc.sid=s.sid and sc.score<60 and cid='01'
 
ORDER BY sc.score DESC

?14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT
s.sid,s.sname,round(AVG(sc.score),2) avgNum ,
max(case when sc.cid='01' then sc.score end)语文,
max(case when sc.cid='02' then sc.score end)数学,
max(case when sc.cid='03' then sc.score end)英语
FROM
t_mysql_score sc,t_mysql_student s,t_mysql_course c
WHERE
 sc.sid=s.sid and sc.cid=c.cid
GROUP BY
s.sid,s.sname
ORDER BY avgNum desc
 
 
SELECT
s.sid,s.sname,round(AVG(sc.score),2) avgNum ,
max(if(sc.cid='01',sc.score,0))语文,
max(if(sc.cid='02',sc.score,0))数学,
max(if(sc.cid='03',sc.score,0))英语
FROM
t_mysql_score sc,t_mysql_student s,t_mysql_course c
WHERE
 sc.sid=s.sid and sc.cid=c.cid
GROUP BY
s.sid,s.sname
ORDER BY avgNum desc

?15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

SELECT
 
c.cid,c.cname,max(sc.score)最高分,
 
min(sc.score)最低分,
 
ROUND(AVG(sc.score))平均分,
 
count(sc.score)选修人数,
 
CONCAT(ROUND(sum(if(sc.score>=60,1,0))/count(sc.score)*100),'%')及格率,
 
CONCAT(ROUND(sum(if(sc.score>=70 and sc.score<80,1,0))/count(sc.score)*100),'%')中等率,
 
CONCAT(ROUND(sum(if(sc.score>=80 and sc.score<90,1,0))/count(sc.score)*100),'%')优良率,
 
CONCAT(ROUND(sum(if(sc.score>=90,1,0))/count(sc.score)*100),'%')优秀率
 
FROM
 
t_mysql_score sc,t_mysql_course c,t_mysql_student s
 
WHERE
 
sc.sid=s.sid and sc.cid=c.cid
 
GROUP BY
 
c.cid,c.cname
 
ORDER BY
 
选修人数 desc,

????????????????????????????????????????好啦今天就分享到这里了!!!希望能帮到你哦!!!

文章来源:https://blog.csdn.net/m0_74915426/article/details/135465888
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。