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

这篇具有很好参考价值的文章主要介绍了③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);

10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

select s.* 
from student s 
join (select s_id from score where c_id=1) sc1 on s.s_id=sc1.s_id
left join (select s_id from score where c_id=2) sc2 on s.s_id=sc2.s_id
where sc2.s_id is null;
  1. select s.*表示查询学生表(student)中所有列的数据。
    2. join (select s_id from score where c_id=1) sc1 on s.s_id=sc1.s_id表示将学生成绩表(score)中选了课程1的学生ID(s_id)与学生表中的ID(s_id)进行连接,生成一个名为sc1的虚拟表,包含选了课程1的学生ID。
  2. left join (select s_id from score where c_id=2) sc2 on s.s_id=sc2.s_id表示将学生成绩表中选了课程2的学生ID与学生表中的ID进行连接,生成一个名为sc2的虚拟表,包含选了课程2的学生ID。这里使用左连接(left join)是因为有些学生可能只选了课程1,没有选课程2,这样可以保留这些学生的信息。
  3. where sc2.s_id is null表示筛选出sc2表中学生ID为空的记录,即只选了课程1而没有选课程2的学生信息。

③MySQL刷题马拉松:坚持刷题,MySQL技能大提升!,Mysql刷题,mysql,数据库

11、查询没有学全所有课程的同学的信息

select s.* 
from student s
left join (
    select s_id
    from score
    group by s_id
    having count(c_id)=5
    ) tmp on s.s_id=tmp.s_id
where tmp.s_id is null;
  • select * from Student表示查询学生表(Student)中所有列的数据。

  • where Sid in (select distinct(Sid) from (select Sid from Score where Sid not in (select Sid from Score where Cid = 1 ) or Sid not in (select Sid from Score where Cid = 2 ) or Sid not in (select Sid from Score where Cid = 3)) as a)表示筛选出选修了除指定课程(Cid=1、2、3)之外的所有课程的学生信息。

  • select Sid from Score where Sid not in (select Sid from Score where Cid = 1 ) or Sid not in (select Sid from Score where Cid = 2 ) or Sid not in (select Sid from Score where Cid = 3)表示查询选修了除指定课程之外的所有课程的学生ID。

    • distinct(Sid)表示去重,只保留不同的学生ID。

    • as a表示将上述查询结果命名为“a”。

    • where Sid in (...)表示筛选出学生表中学生ID在上述查询结果中的学生信息。

③MySQL刷题马拉松:坚持刷题,MySQL技能大提升!,Mysql刷题,mysql,数据库

12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息

select s.s_id, s.s_name, s.s_birth, s.s_sex
from score sc1
join score sc2 on sc2.s_id=1 and sc2.c_id=sc1.c_id
left join student s on s.s_id=sc1.s_id
where sc1.s_id not in (1)
group by s.s_id, s.s_name, s.s_birth, s.s_sex;
  • select s.s_id, s.s_name, s.s_birth, s.s_sex表示查询学生表(student)中学生ID、姓名、出生日期和性别这四列数据。
  • from score sc1表示从成绩表(score)中选取数据,将其命名为sc1。
  • join score sc2 on sc2.s_id=1 and sc2.c_id=sc1.c_id表示将成绩表(score)中和学生1选了相同课程的成绩记录连接起来,将其命名为sc2。
  • left join student s on s.s_id=sc1.s_id表示将学生表(student)中和sc1中学生ID相同的学生信息连接起来,生成一个左连接的结果。
  • where sc1.s_id not in (1)表示筛选出学生ID不为1的成绩记录,即排除掉学生1自己的成绩记录。
  • group by s.s_id, s.s_name, s.s_birth, s.s_sex表示按照学生ID、姓名、出生日期和性别进行分组,确保查询结果中每个学生只出现一次。

③MySQL刷题马拉松:坚持刷题,MySQL技能大提升!,Mysql刷题,mysql,数据库

13、查询和"01"号的同学学习的课程完全相同的其他同学的信息

select s.s_id, s.s_name, s.s_birth, s.s_sex, count(sc1.c_id) as cnt
from score sc1
join score sc2 on sc2.s_id=1 and sc2.c_id=sc1.c_id
left join student s on s.s_id=sc1.s_id
where sc1.s_id not in (1)
group by s.s_id, s.s_name, s.s_birth, s.s_sex
having count(sc1.c_id) in (select count(c_id) from score where s_id=1);
  • select s.s_id, s.s_name, s.s_birth, s.s_sex, count(sc1.c_id) as cnt表示查询学生表(student)中学生ID、姓名、出生日期、性别和选修课程数量这五列数据。
  • from score sc1表示从成绩表(score)中选取数据,将其命名为sc1。
  • join score sc2 on sc2.s_id=1 and sc2.c_id=sc1.c_id表示将成绩表(score)中和学生1选了相同课程的成绩记录连接起来,将其命名为sc2。
  • left join student s on s.s_id=sc1.s_id表示将学生表(student)中和sc1中学生ID相同的学生信息连接起来,生成一个左连接的结果。
  • where sc1.s_id not in (1)表示筛选出学生ID不为1的成绩记录,即排除掉学生1自己的成绩记录。
    -group by s.s_id, s.s_name, s.s_birth,s.s_sex表示按照学生ID、姓名、出生日期和性别进行分组,确保查询结果中每个学生只出现一次。
  • having count(sc1.c_id) in (select count(c_id) from score where s_id=1)表示筛选出选修课程数量和学生1相同的学生信息,即只保留选修课程数量和学生1相同的学生信息。这里使用having子句进行筛选,因为需要对分组后的结果进行筛选,而where子句只能对原始数据进行筛选。

③MySQL刷题马拉松:坚持刷题,MySQL技能大提升!,Mysql刷题,mysql,数据库

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

select s.s_id, s.s_name 
from student s
left join score sc on s.s_id=sc.s_id
left join course c on sc.c_id=c.c_id
left join teacher t on t.t_id=c.t_id and t.t_name='张三'
group by s.s_id, s.s_name
having count(t.t_id)=0;
  • select s.s_id, s.s_name表示查询学生表(student)中学生ID和姓名这两列数据。

  • from student s表示从学生表(student)中选取数据,将其命名为s。

  • left join score sc on s.s_id=sc.s_id表示将成绩表(score)中和学生表(student)中学生ID相同的成绩记录连接起来,生成一个左连接的结果,将其命名为sc。

  • left join course c on sc.c_id=c.c_id:表示将课程表(course)中和sc中课程ID相同的课程信息连接起来,生成一个左连接的结果,将其命名为c。

  • left join teacher t on t.t_id=c.t_id and t.t_name='张三':表示将教师表(teacher)中和c中教师ID相同且教师姓名为“张三”的教师信息连接起来,生成一个左连接的结果,将其命名为t。

  • group by s.s_id, s.s_name表示按照学生ID和姓名进行分组,确保查询结果中每个学生只出现一次。

  • having count(t.t_id)=0表示筛选出没有选修过张三老师所教授的课程的学生信息,即排除掉选修过张三老师所教授的课程的学生信息。这里使用having子句进行筛选,因为需要对分组后的结果进行筛选,而where子句只能对原始数据进行筛选。

③MySQL刷题马拉松:坚持刷题,MySQL技能大提升!,Mysql刷题,mysql,数据库

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

select s.*, tmp.avg_score 
from student s 
join (
    select s_id, count(c_id) as c_cnt, avg(s_score) as avg_score 
    from score 
    where s_score < 60 
    group by s_id 
    having c_cnt >= 2
) tmp on tmp.s_id=s.s_id;
  • select s.*, tmp.avg_score表示查询学生表(student)中所有列数据以及平均成绩这一列数据。
  • from student s表示从学生表(student)中选取数据,将其命名为s。
  • join (select s_id, count(c_id) as c_cnt, avg(s_score) as avg_score from score where s_score < 60 group by s_id having c_cnt >= 2) tmp on tmp.s_id=s.s_id表示将成绩表(score)中选修了至少两门不及格课程的学生信息连接起来,生成一个内连接的结果,将其命名为tmp。这里使用了一个子查询,首先筛选出不及格课程数量大于等于2门的学生,并计算他们的平均成绩,然后将结果和学生表(student)连接起来,得到最终的查询结果。

③MySQL刷题马拉松:坚持刷题,MySQL技能大提升!,Mysql刷题,mysql,数据库文章来源地址https://www.toymoban.com/news/detail-641192.html

到了这里,关于③MySQL刷题马拉松:坚持刷题,MySQL技能大提升!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微软CTO谈AI:逃不掉马拉松就准备好跑鞋!30秒自动化妆机;ChatGPT刷爆票圈;剪纸风格的AI绘画 | ShowMeAI资讯日报

    👀 日报合辑 | 🎡 AI应用与工具大全 | 🔔 公众号资料下载 | 🍩 @韩信子 https://blogs.microsoft.com/ai/a-conversation-with-kevin-scott-whats-next-in-ai/ 斯科特预计,AI系统的复杂性与规模将继续增长,带来生产力和创造力的显著提升,并为当前世界面临的复杂挑战提供解决方案。(本文仅呈

    2024年02月04日
    浏览(41)
  • 陆奇最新演讲高清PPT下载;AI 绘画20+工具体验汇总;我愿称MOSS为全球开源界最强;思否AIGC黑客马拉松北京站 | ShowMeAI日报

    👀 日报周刊合集 | 🎡 生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! ShowMeAI知识星球资料编号:R054 奇绩创坛创始人兼CEO 陆奇 是中国AI布道人,也是中国针对大模型最有发言权的人之一。他曾在全球巨头身居要职,先后任职于IBM、雅虎、微软、百度,曾是华人在美

    2024年02月09日
    浏览(42)
  • MySQL技能树学习

    体系结构  存储引擎  数据类型 数值类型 DECIMAL类型 在MySQL内部是以字符串的形式进行存储的,它的精度比浮点数更加精确,适合存储表示金额等需要高精度的数据 Mysql中两个整数相除,默认得到的类型是decimal类型,因为两个整数相除可能产生小数,而decimal类型,可以精确

    2024年03月12日
    浏览(37)
  • MySQL刷题

    DDL(Data Definition Language)用来定义数据库对象; DML(Data Manipulation Language)用来对数据库中的表进行增删改操作; DQL(Data Query Language)用来查询数据库中表的记录; DCL(Data Control Language)用来定义数据库的访问控制权限和安全级别; 位于用户和操作系统之间的一层数据管理软件指的是

    2023年04月15日
    浏览(25)
  • mysql并行效率提升

    下面是一个并行读取mysql数据库表的测试程序,测试结果发现,读取10个表,1个个读取,和并行读取10个,效率一样,甚至并行读取还慢很多,这是为什么? 检查一下mysql后端: 原来啊,这个outgoing network traffic一直上不去,从数据库读取出来的数据,发不出去,也就返回不了

    2024年02月11日
    浏览(55)
  • Mysql提升篇

    关联查询 内连接 :A∩B select  字段列表  from  A inner  join  B  on   A.关联字段  = B.关联字段; 外连接 :A / B select  字段列表  from  A  left  join B  on  A.关联字段 = B.关联字段;     select  字段列表  from  A  right  join B  on  A.关联字段 = B.关联字段; A U B select  字段列表

    2024年02月02日
    浏览(25)
  • 【实战】nodejs 必会技能 —— 封装 mysql 数据库连接

    [mysql - mysql中文文档翻译 - Breword 文档集合]:(https://www.breword.com/mysqljs-mysql) 安装依赖包: [mysql - npm]:(https://www.npmjs.com/package/mysql) 运行中若遇到如下报错,请检查输入信息是否正确(host、port、user、password 等),jdbc配置中拿到的相关信息尤其是密码很可能是加密后的 node -

    2024年02月10日
    浏览(50)
  • Mysql系列 - 第3天:管理员必备技能(必须掌握)

    这是mysql系列第3篇文章。 环境:mysql5.7.25,cmd命令中进行演示。 在玩mysql的过程中,经常遇到有很多朋友在云上面玩mysql的时候,说我创建了一个用户为什么不能登录?为什么没有权限?等等各种问题,本文看完之后,这些都不是问题了。 介绍Mysql权限工作原理 查看所有用户

    2024年02月11日
    浏览(35)
  • MySQL索引优化:提升查询速度的实战解析

    当涉及到大型数据库和复杂查询时,索引在MySQL中是一个重要的性能优化工具。通过使用索引,可以加速查询速度,减少查询的执行时间。下面是一个详细的MySQL添加索引的教程,使用Markdown格式进行说明。 步骤1:选择合适的列 首先,需要选择哪些列需要添加索引。通常情况

    2024年02月12日
    浏览(67)
  • Mysql 提升索引效率优化的八种方法

    目录 1. 选择唯一性索引 2. 为经常需要排序、分组和联合操作的字段建立索引 3. 为常作为查询条件的字段建立索引 4. 限制索引的数目 5. 尽量使用数据量少的索引 6. 数据量小的表最好不要使用索引 7. 尽量使用前缀来索引 8. 删除不再使用或者很少使用的索引 总结 索引的设计可

    2024年04月26日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包