zoukankan      html  css  js  c++  java
  • mysql练习1-10题

    Ref

    https://zhuanlan.zhihu.com/p/50662216

    https://www.cnblogs.com/yuanyuan2017/

    00 建表和添加数据

    -- 建表

    -- 学生表

    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);

    01课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号。

    很明显,需要查询的是分数score

    select s_id from score where c_id='01'

    select s_id from score where c_id='02'

    -- 既选了01 又选了02课的同学 我的写法

    select tb1.s_id sid from

    (select * from score where c_id='01') tb1,

    (select * from score where c_id='02') tb2

    where tb1.s_id = tb2.s_id and tb1.s_score > tb2.s_score;

    -- 看了参考答案后背着写

    将一张表当作两张表使用

    select a.s_id from score a join score b on a.s_id=b.s_id and a.s_score > b.s_score

    where a.c_id='01' and b.c_id='02' ;

    -- sql99标准的表连接查询,改造最初的写法

    select tb1.s_id from (select * from score where c_id='01') tb1

    join (select * from score where c_id='02') tb2

    on tb1.s_id=tb2.s_id

    where tb1.s_score > tb2.s_score;

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

    查询score表,单表查询

    select s_id, avg(s_score) avgScore from score GROUP BY s_id having avgScore > 60;

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

    两表联合查询,用student表左连接score表,可以查询出student表的所有信息。

    select stu.s_id, stu.s_name,count(score.s_id), sum(score.s_score)

    from student stu

    left join score

    on stu.s_id = score.s_id

    group by stu.s_id

    注意是左连接,否则会丢失数据——王菊同学一门课也没选,但是题目要求查询所有的同学。

    04 查询姓的老师的个数

    select  teacher.*, count(*) from teacher where t_name like '%'

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

    -- 最初的思路,下面的sql是查询张三老师的所有学生id

    select s.s_id from student s join score

    on s.s_id = score.s_id join course c

    on score.c_id = c.c_id join teacher t

    on c.t_id=t.t_id

    where t.t_name='张三'

    -- 我的做法,稍微罗嗦了点

    select s_id, s_name from student where s_id not in(

    select s.s_id from student s join score

    on s.s_id = score.s_id join course c

    on score.c_id = c.c_id join teacher t

    on c.t_id=t.t_id

    where t.t_name='张三'

    )

    -- 参考答案

    select s_id,s_name from student where s_id not in (

    select s_id from score join course c

    on score.c_id = c.c_id join teacher t

    on c.t_id=t.t_id

    where t.t_name='张三'

    )

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

    这道题是上道题的一个子集。注意灵活使用“in”关键词

    select s.s_id,s.s_name from student s join score

    on s.s_id = score.s_id join course c

    on score.c_id = c.c_id join teacher t

    on c.t_id=t.t_id

    where t.t_name='张三'

    参考答案

    select s_id, s_name

    from Student

    where s_id in

    (select s_id from Score join Course on Score.c_id = Course.c_id

    join Teacher on Course.t_id = Teacher.t_id

    where t_name = '张三');

    07 查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名

    查询course表、score表、student

    学过01课的sid

    select s_id from score where c_id='01'

    学过02课的sid

    select s_id from score where c_id='02'

    既学了课01有学了课02sid

    select t1.s_id from

    (select * from score where c_id='01') t1

    join

    (select * from score where c_id='02') t2

    on t1.s_id=t2.s_id

    完整sql

    select s_id, s_name from student where s_id in(

    select t1.s_id from

    (select * from score where c_id='01') t1

    join

    (select * from score where c_id='02') t2

    on t1.s_id=t2.s_id

    )

    另一种写法

    将一张表当两张表用

    select s_id, s_name from student where s_id in(

    select a.s_id from score a join score b

    on a.c_id='01' and b.c_id='02'

    where a.s_id=b.s_id

    )

    08 查询课程编号为“02”的总成绩

    select sum(s_score) from score where c_id='02'

    select sum(s_score) from (select s_score from score where c_id='02')b

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

    这条sql会缺失数据,因为没有成绩的学生被排除在外了,不知道怎么解决

    select * from student left join score

    on student.s_id=score.s_id

    group by student.s_id

    having s_score < 60;

    换一种思路

    select * from student where s_id not in(

    select s_id from score where s_score >=60

    )

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

    “没有学全课”意思是说总共有n门课,某同学学习的课程数小于n

    查询“学全”了课的同学,再取反

    select s_id from score

    group by s_id

    having count(c_id)=(select count(*) from course)

    需要注意,没选课的同学也要被包含进去

    select s_id, s_name from student where s_id not in (

    select s_id from score

    group by s_id

    having count(c_id)=(select count(*) from course)

    )

    写不动了=。=晚点再来。 

  • 相关阅读:
    MFC STATIC,Picture控件使用及无法添加变量的问题
    MFC listctrl NMCLICK消息 错误 无法从"NMHDR*"转换为"NMITEMACTIVATE"
    vs2008中将开始执行按钮(不调试按钮)添加至标准工具栏方法
    MFC 删除工具栏 默认对话框全屏 修改MFC标题栏的文字 删除菜单栏
    Visual Assist X设置
    MFC禁止窗口最大化按钮和禁止改变窗口大小
    MFC从头开始如何利用MFC分割窗口
    MFC CSplitterWnd窗口分割
    关于VS2008下提示microsoft incremental linker已停止工作的问题
    windows 下codeblocks查看容器值
  • 原文地址:https://www.cnblogs.com/leejunwei/p/mysql_exercises.html
Copyright © 2011-2022 走看看