MySQL经典50道练习题及全网最详细解析

MySQL练习

文章目录


50道经典SQL练习题全网最详细解析

数据表介绍
  • 1.学表 Student(SId,Sname,Sage,Ssex)

    • SId 学编号

    • Sname 学姓名

    • Sage 出年

    • Ssex 学性别

  • 2.课程表 Course(CId,Cname,TId)

    • CId 课程编号

    • Cname 课程名称

    • TId 教师编号

  • 3.教师表 Teacher(TId,Tname)

    • TId 教师编号

    • Tname 教师姓名

  • 4.成绩表 SC(SId,CId,score)

    • SId 学编号

    • CId 课程编号

    • score 分数


建表语句
  • 学表 Student

    create table Student(
        SId varchar(10),
        Sname varchar(10),
        Sage datetime,
        Ssex varchar(10)
    ); 
    
  • 课程表 Course

    create table Course(
        CId varchar(10),
        Cname nvarchar(10),
        TId varchar(10)
    );
    
  • 教师表 Teacher

    create table Teacher(
        TId varchar(10),
        Tname varchar(10)
    );
    
  • 成绩表 SC

    create table SC(
        SId varchar(10),
        CId varchar(10),
        score decimal(18,1)
    );
    

插入数据

注意这里插入数据的时候,里面可能含有隐藏字符,出现显示不出的数据手动重新打一下再插入即可

  • 学表 Student

    -- 学生表 Student
    -- 学生表 Student
    insert into Student values('01' , '赵雷' , '1990-01-01' , '男'); 
    insert into Student values('02' , '钱电' , '1990-12-21' , '男'); 
    insert into Student values('03' , '孙风' , '1990-12-20' , '男'); 
    insert into Student values('04' , '李云' , '1990-12-06' , '男'); 
    insert into Student values('05' , '周梅' , '1991-12-01' , '女'); 
    insert into Student values('06' , '吴兰' , '1992-01-01' , '女'); 
    insert into Student values('07' , '郑竹' , '1989-01-01' , '女'); 
    insert into Student values('09' , '张三' , '2017-12-20' , '女'); 
    insert into Student values('10' , '李四' , '2017-12-25' , '女'); 
    insert into Student values('11' , '李四' , '2012-06-06' , '女'); 
    insert into Student values('12' , '赵六' , '2013-06-13' , '女'); 
    insert into Student values('13' , '孙七' , '2014-06-01' , '女'); 
    
  • 课程表 Course

    -- 科?表 Course 
    insert into Course values('01' , '语文' , '02'); 
    insert into Course values('02' , '数学' , '01'); 
    insert into Course values('03' , '英语' , '03');
    
  • 教师表 Teacher

    -- 教师表 Teacher 
    insert into Teacher values('01' , '张三'); 
    insert into Teacher values('02' , '李四'); 
    insert into Teacher values('03' , '王五'); 
    
  • 成绩表 SC

    -- 成绩表 SC 
    insert into SC values('01' , '01' , 80); 
    insert into SC values('01' , '02' , 90); 
    insert into SC values('01' , '03' , 99); 
    insert into SC values('02' , '01' , 70); 
    insert into SC values('02' , '02' , 60); 
    insert into SC values('02' , '03' , 80); 
    insert into SC values('03' , '01' , 80); 
    insert into SC values('03' , '02' , 80); 
    insert into SC values('03' , '03' , 80); 
    insert into SC values('04' , '01' , 50); 
    insert into SC values('04' , '02' , 30); 
    insert into SC values('04' , '03' , 20); 
    insert into SC values('05' , '01' , 76); 
    insert into SC values('05' , '02' , 87); 
    insert into SC values('06' , '01' , 31); 
    insert into SC values('06' , '03' , 34); 
    insert into SC values('07' , '02' , 89); 
    insert into SC values('07' , '03' , 98);
    

练习题目
1.查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数

分析:
1、找出有01成绩的学生成绩信息
2、找出有02成绩的学生成绩信息
3、通过SId将两表取别名t1、t2进行左连接
4、加上满足01‘语文’ > 02’数学’的条件

  • 找出有01成绩的学生成绩信息

    SELECT * FROM SC WHERE CId=‘01’;

  • 找出有02成绩的学生成绩信息

    SELECT * FROM SC WHERE CId=‘02’;

  • 通过SId将两表取别名t1、t2进行左连接

    SELECT t1.SId,
    t1.CId,
    t1.score as ‘语文’,
    t2.score as ‘数学’
    FROM (
    SELECT
    SId,
    CId,
    score
    FROM SC
    WHERE CId=‘01’
    ) t1
    LEFT JOIN
    (SELECT
    SId,
    CId,
    score
    FROM SC
    WHERE CId=‘02’
    ) t2
    ON t1.SId=t2.SId;

  • 加上满足01‘语文’ > 02’数学’的条件

    SELECT t1.SId,
    t1.CId,
    t1.score as ‘语文’,
    t2.score as ‘数学’
    FROM (
    SELECT
    SId,
    CId,
    score
    FROM SC
    WHERE CId=‘01’
    ) t1
    LEFT JOIN(
    SELECT
    SId,
    CId,
    score
    FROM SC
    WHERE CId=‘02’
    ) t2
    ON t1.SId=t2.SId
    WHERE t1.score > t2.score;

  • 最后将上面的表作为一个子表tt1将我们想要查询的表关联起来,取出想要查询的字段

    SELECT tt1.SId
    ,tt2.Sname
    ,tt3.CId
    ,tt3.score
    FROM (
    SELECT t1.SId
    FROM(
    SELECT SId
    ,CId
    ,score
    FROM SC
    where CId = ‘01’
    ) t1
    LEFT JOIN(
    SELECT SId
    ,CId
    ,score
    FROM SC
    WHERE CId = ‘02’
    ) t2
    ON t1.SId = t2.SId
    WHERE t1.Score > t2.Score
    ) tt1
    JOIN Student tt2 ON tt1.SId = tt2.SId
    JOIN SC tt3 ON tt1.SId = tt3.SId;


2.查询同时存在" 01 “课程和” 02 "课程的情况
分析:
     满足条件的SC表中:
       1、筛选出课程号为01的全部信息 AS命名为 t1
       2、筛选出课程号为02的全部信息 AS命名为 t2
       3、使用join连接取出同时存在01课程和02课程的SId
  • 筛选出课程号为01的全部信息

    SELECT SId FROM SC WHERE CId = ‘01’;

  • 筛选出课程号为02的全部信息

    SELECT SId FROM SC WHERE CId = ‘02’;

  • 使用join连接取出同时存在01课程和02课程的SId

    SELECT t1.SId
    FROM(
    SELECT SId
    FROM SC
    WHERE CId=‘01’
    )AS t1 JOIN (
    SELECT SId
    FROM SC
    WHERE CId=‘01’
    )AS t2
    ON t1.SId = t2.SId;


3.查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
分析:
     满足条件的SC表中:
       1、筛选出课程号为01的全部信息 AS命名为 t1
       2、筛选出课程号为02的全部信息 AS命名为 t2
       3、左连接
  • 筛选出课程号为01的全部信息

    SELECT SId,CId,score FROM SC WHERE CId = ‘01’;

  • 筛选出课程号为02的全部信息

    SELECT SId,CId,score FROM SC WHERE CId = ‘02’;

  • 左连接

    SELECT t1.SId
    ,t1.CId
    ,t1.score
    ,t2.CId AS t2CId
    ,t2.score AS t2Score
    FROM(
    SELECT SId
    ,CId
    ,score
    FROM SC
    WHERE CId = ‘01’
    ) t1 LEFT JOIN(
    SELECT SId
    ,CId
    ,score
    FROM SC
    WHERE CId = ‘02’
    ) t2
    ON t1.SId = t2.SId;


4.查询不存在" 01 “课程但存在” 02 "课程的情况
分析:
     满足条件的SC表中:
       1、筛选出课程号为01的全部信息 AS命名为 t1
       2、筛选出课程号为02的全部信息 AS命名为 t2
       3、右连接
  • 筛选出课程号为01的全部信息

    SELECT SId,CId,score FROM SC WHERE CId = ‘01’;

  • 筛选出课程号为02的全部信息

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值