MySQL练习50题记录之【01-05】

表名和字段
-1学生表
Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别
-2课程表
Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号
-3教师表
Teacher(t_id,t_name) –教师编号,教师姓名
-4成绩表
Score(s_id,c_id,s_score) –学生编号,课程编号,分数

建表语句

#–1.学生表 
#Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别
CREATE TABLE `Student` (
    `s_id` VARCHAR(20),
    s_name VARCHAR(20) NOT NULL DEFAULT '',
    s_brith VARCHAR(20) NOT NULL DEFAULT '',
    s_sex VARCHAR(10) NOT NULL DEFAULT '',
    PRIMARY KEY(s_id)
);

#–2.课程表 
#Course(c_id,c_name,t_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)
);

/*
–3.教师表 
Teacher(t_id,t_name) –教师编号,教师姓名 
*/
CREATE TABLE Teacher(
    t_id VARCHAR(20),
    t_name VARCHAR(20) NOT NULL DEFAULT '',
    PRIMARY KEY(t_id)
);

/*
–4.成绩表 
Score(s_id,c_id,s_score) –学生编号,课程编号,分数
*/
Create table Score(
    s_id VARCHAR(20),
    c_id VARCHAR(20) not null default '',
    s_score INT(3),
    primary key(`s_id`,`c_id`)
);

插入测试数据

#--插入学生表测试数据
#('01' , '赵雷' , '1990-01-01' , '男')
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);

练习题和SQL语句

-- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

#1.自连接
SELECT
c.*,
a.s_score s01,
b.s_score s02
FROM
score a,score b,student c
WHERE
a.c_id = '01'
AND 
b.c_id = '02'
AND
a.s_id = b.s_id
AND
c.s_id = a.s_id
AND
a.s_score > b.s_score;

#2. 行转列 (使用max函数前必须先分组)
SELECT
s.*,
t.s01,
t.s02
FROM
(SELECT
a.s_id,
MAX(CASE WHEN a.c_id='01' THEN a.s_score END) s01,
MAX(CASE WHEN a.c_id='02' THEN a.s_score END) s02
FROM
score a
GROUP BY
a.s_id) t,student s
WHERE
t.s01 > t.s02
AND
s.s_id = t.s_id;

-- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

充数的题吧.....

第一题>变<就完事了

-- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

#1. 子查询 (使用avg函数求平均成绩,分组之后的过滤数据使用having)
SELECT
a.s_id,
(SELECT s.s_name FROM student s WHERE a.s_id = s.s_id) sname,
AVG(a.s_score) avg_s
FROM
score a
GROUP BY
a.s_id
HAVING
avg_s >= 60;

#2. 两表连接 隐式内连接
SELECT
a.s_id,
s.s_name,
AVG(a.s_score) avg_s
FROM
score a,student s
WHERE
a.s_id = s.s_id
GROUP BY
a.s_id
HAVING
avg_s >= 60;
​

-- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

#这个不是凑数题,还要考虑无成绩的8号,所以要把第三题的内连接改外连接
SELECT
s.s_id,
s.s_name,
IFNULL(AVG(a.s_score),0) avg
FROM
score a
RIGHT JOIN
student s
ON
a.s_id = s.s_id
GROUP BY
s.s_id
HAVING
IFNULL(AVG(a.s_score),0) < 60;

-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

#外连接 (右连接,以student表为主)
SELECT
s.s_id,
s.s_name,
COUNT(a.c_id) coursenum,
IFNULL(SUM(a.s_score),0) gradesum
FROM
score a
RIGHT JOIN
student s
ON
a.s_id = s.s_id
GROUP BY
s.s_id;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值