①MySQL刷题马拉松:坚持刷题,MySQL技能大提升!

🏘️🏘️个人简介:以山河作礼
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人
🎁🎁:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。


环境

MySQL版本: 8.0.28
数据库管理工具:MySQL Workbench 8.0 CE

MySQL Workbench 8.0 CE是一款开源的、跨平台的、图形化的MySQL数据库管理工具,由MySQL AB公司开发。它提供了一个集成的开发环境,包括数据库设计、SQL开发、数据库管理和数据库维护等功能

mysql经典50习题

数据库数据:

1.学生表

-- Student(SID,Sname,Sage,Ssex)
-- --SID 学生编号,Sname 学生姓名,Sage 年龄,Ssex 学生性别
-- CREATE TABLE Student(
-- Sid VARCHAR(20),
-- Sname VARCHAR(20) NOT NULL DEFAULT '',
-- Sage VARCHAR(20) NOT NULL DEFAULT '',
-- Ssex VARCHAR(10) NOT NULL DEFAULT '',
--  PRIMARY KEY(Sid)
--  );
-- 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' , ' 女 ');

2.课程表

-- create table Course(Cid int primary key auto_increment,Cname char(20),Tid int);
-- insert into Course(Cid,Cname,Tid) values(1,'语文',2),(2,'数学',1),(3,'英语',3);

3.教师表

-- Teacher(Tid,Tname)
-- Tid 教师编号,Tname 教师姓名
-- create table Teacher(Tid int primary key auto_increment,Tname char(20));
-- insert into Teacher(Tid,Tname) values(1,'张三'),(2,'李四'),(3,'王五');

4.成绩表

-- Score(Sid,Cid,score)
-- --Sid 学生编号,Cid 课程编号,score 分数
-- CREATE TABLE Score (
--   Sid INT NOT NULL,
--   Cid INT NOT NULL,
--   score INT,
--   PRIMARY KEY (Sid, Cid)
-- );
-- 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);

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

-- select s.*,s1.score as s_score1,s2.score as s_score2
-- from Student s
-- join Score s1 on s.Sid = s1.Sid and s1.Cid =1
-- left join Score s2 on s.Sid = s2.Sid and s2.Cid = 2
-- where s1.score>s2.score;

使用了多表连接和条件筛选,目的是查询学生的基本信息和他们在语文和数学两门课中的成绩,并且只返回语文成绩高于数学成绩的学生信息。

  • SELECT:选择需要返回的列,这里选择了学生表中的所有列,以及两个成绩表中的score列(分别用别名s_score1和s_score2表示)。
  • FROM:指定需要查询的表,这里是学生表和成绩表。
  • JOIN:连接两个表,这里是学生表和语文成绩表。
  • ON:指定连接条件,这里是学生表中的学生编号和成绩表中的学生编号相等,并且成绩表中的课程编号为1。
  • LEFT JOIN:连接学生表和数学成绩表,这里使用左连接,因为不是所有学生都有数学成绩。
  • WHERE:筛选符合条件的行,这里是只返回语文成绩高于数学成绩的学生信息,即s1.score>s2.score。

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

-- select s.*,s1.score as s_score1,s2.score as s_score2
-- from Student s
-- join Score s1 on s.Sid = s1.Sid and s1.Cid =1
-- left join Score s2 on s.Sid = s2.Sid and s2.Cid = 2
-- where s1.score<s2.score;
  • SELECT:选择需要返回的列,这里选择了学生表中的所有列,以及两个成绩表中的score列(分别用别名s_score1和s_score2表示)。
  • FROM:指定需要查询的表,这里是学生表和成绩表。
  • JOIN:连接两个表,这里是学生表和语文成绩表。
  • ON:指定连接条件,这里是学生表中的学生编号和成绩表中的学生编号相等,并且成绩表中的课程编号为1。
  • LEFT JOIN:连接学生表和数学成绩表,这里使用左连接,因为不是所有学生都有数学成绩。
  • WHERE:筛选符合条件的行,这里是只返回语文成绩低于数学成绩的学生信息,即s1.score<s2.score。

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

--  select  distinct(sc.Sid),st.Sname from Score sc join Student st on sc.Sid = st.Sid 
--  where sc.Sid in(select  Sid from Score group by Sid having avg(score)>60);
  • SELECT:选择需要返回的列,这里选择了成绩表中的学生编号和学生表中的学生姓名。
  • DISTINCT:去重,保证每个学生只出现一次。
  • FROM:指定需要查询的表,这里是成绩表和学生表。
  • JOIN:连接两个表,这里是成绩表和学生表。
  • ON:指定连接条件,这里是成绩表中的学生编号和学生表中的学生编号相等。
  • WHERE:筛选符合条件的行,这里是只返回平均成绩高于60分的学生的信息。
  • IN:子查询,用于查询平均成绩高于60分的学生的学号。
  • GROUP BY:将成绩表按学生编号分组,用于计算每个学生的平均成绩。
  • HAVING:筛选符合条件的分组,这里是只返回平均成绩高于60分的学生的学号。
  • AVG:计算平均成绩。

4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的)

--  select  sc.Sid,st.Sname from Score sc join Student st on sc.Sid = st.Sid 
--  where sc.Sid=(select  Sid from Score group by Sid having avg(score)<60);
  • SELECT:选择需要返回的列,这里选择了成绩表中的学生编号和学生表中的学生姓名。

  • FROM:指定需要查询的表,这里是成绩表和学生表。

  • JOIN:连接两个表,这里是成绩表和学生表。

  • ON:指定连接条件,这里是成绩表中的学生编号和学生表中的学生编号相等。

  • WHERE:筛选符合条件的行,这里是只返回平均成绩低于60分的学生的信息。

  • IN:子查询,用于查询平均成绩低于60分的学生的学号。

  • GROUP BY:将成绩表按学生编号分组,用于计算每个学生的平均成绩。

  • HAVING:筛选符合条件的分组,这里是只返回平均成绩低于60分的学生的学号。

  • AVG:计算平均成绩。

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

-- select st.Sid,st.Sname,count(sc.Cid),sum(sc.score) from Student st left join Score sc 
-- on sc.Sid = st.Sid group by Sid;
  • SELECT:选择需要返回的列,这里选择了学生表中的学生编号和姓名,以及成绩表中的课程编号和成绩。
  • LEFT JOIN:连接学生表和成绩表,这里使用左连接,因为不是所有学生都选修了课程。
  • ON:指定连接条件,这里是成绩表中的学生编号和学生表中的学生编号相等。
  • GROUP BY:将结果按学生编号分组,用于计算每个学生的选修课程数和总成绩。
  • COUNT:计算选修课程数。
  • SUM:计算总成绩
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以山河作礼。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值