MYSQL经典练习题

(本练习题可让你熟悉DQL,快速的上手DQL)

首先,先在数据库中建立基本数据库以及表项:

  1. DROP DATABASE IF EXISTS `test`;
  2. CREATE DATABASE `test`;
  3. USE `test`
  4. -- 表一:student学生use)
  5. CREATE TABLE student(
  6. sno VARCHAR(20) PRIMARY KEY NOT NULL COMMENT'学号(主码)',
  7. sname VARCHAR(20) NOT NULL COMMENT'学生姓名',
  8. ssex VARCHAR(20) NOT NULL COMMENT'学生性别',
  9. sbirthday DATETIME COMMENT'学生出生年月',
  10. class VARCHAR(20) COMMENT'学生所在班级'
  11. );
  12. -- 表(二)Course(课程表)
  13. CREATE TABLE course(
  14. cno VARCHAR(20) PRIMARY KEY NOT NULL COMMENT'课程号(主码)',
  15. cname VARCHAR(20) NOT NULL COMMENT'课程名称',
  16. tno VARCHAR(20) NOT NULL COMMENT'教工编号'
  17. );
  18. -- 表(三)Score(成绩表)
  19. CREATE TABLE score(
  20. id INT PRIMARY KEY AUTO_INCREMENT COMMENT'主键自增',
  21. sno VARCHAR(20) NOT NULL COMMENT'学号',
  22. cno VARCHAR(20) NOT NULL COMMENT'课程号',
  23. degree DECIMAL(4,1) COMMENT'成绩'
  24. );
  25. -- 表四 teacher(教师表)
  26. CREATE TABLE teacher(
  27. tno VARCHAR(20) PRIMARY KEY NOT NULL COMMENT'教工编号(主码)',
  28. tname VARCHAR(20) NOT NULL COMMENT'教工姓名',
  29. tsex VARCHAR(20) NOT NULL COMMENT'教工性别',
  30. tbirthday DATETIME COMMENT'教工出生年月',
  31. prof VARCHAR(20) COMMENT'职称',
  32. depart VARCHAR(20) NOT NULL COMMENT'教工所在部门'
  33. );

然后在表中插入会用到的数据

  1. -- 学生表数据的插入:
  2. INSERT INTO student VALUES
  3. ('108','曾华','男','1977-09-01','95033'),
  4. ('105','匡明','男','1977-09-01','95031'),
  5. ('107','王丽','女','1977-09-01','95033'),
  6. ('101','李军','男','1977-09-01','95033'),
  7. ('109','王芳','女','1977-09-01','95031'),
  8. ('103','陆君','男','1977-09-01','95031');
  9. -- 课程表数据的插入:
  10. INSERT INTO course VALUES
  11. ('3-105','计算机导论','825'),
  12. ('3-245','操作系统','804'),
  13. ('6-166','数字电路','856'),
  14. ('9-888','高等数学','831');
  15. -- 成绩表数据的插入:
  16. INSERT INTO score(sno,cno,degree) VALUES
  17. ('103','3-245','86'),
  18. ('105','3-245','75'),
  19. ('109','3-245','68'),
  20. ('103','3-105','92'),
  21. ('105','3-105','88'),
  22. ('109','3-105','76'),
  23. ('101','3-105','64'),
  24. ('107','3-105','91'),
  25. ('108','3-105','78'),
  26. ('101','6-166','85'),
  27. ('107','6-166','79'),
  28. ('108','6-166','81');
  29. -- 教师表数据的插入:
  30. INSERT INTO teacher VALUES
  31. ('804','李诚','男','1958-12-02','副教授','计算机系'),
  32. ('856','张旭','男','1969-03-12','讲师','电子工程系'),
  33. ('825','王萍','女','1972-05-05','助教','计算机系'),
  34. ('831','刘冰','女','1977-08-14','助教','电子工程系');

下面是30道经典习题

  1. -- ===============题目==================
  2. -- 1. 查询student表中的所有记录snamessexclass
  3. SELECT `sname`,`ssex`,`class` FROM student;
  4. -- 2. 查询所有教师单位不重复的depart
  5. -- 第一种方式
  6. SELECT DISTINCT `depart` FROM teacher;
  7. -- 第二种方式
  8. SELECT `depart` FROM teacher GROUP BY `depart`;
  9. -- 3.查询student中所有记录
  10. SELECT * FROM student;
  11. -- 4. 查询score中成绩在60(包含)~80(不包含)的列
  12. -- 第一种方式
  13. SELECT * FROM score WHERE `degree` BETWEEN 60 AND 80;
  14. -- 第二种方式
  15. SELECT * FROM score WHERE `degree`>=60 AND `degree`<80;
  16. -- 5.查询成绩为85 86 或者88 记录
  17. -- 第一种方式
  18. SELECT * FROM score WHERE `degree`=85 OR `degree`=86 OR `degree`=88;
  19. -- 第二种方式
  20. SELECT * FROM score WHERE `degree` IN(85,86,88);
  21. -- 6.查询student表中“95031”班或性别为“女”的同学记录。
  22. SELECT * FROM student WHERE class='95031' OR ssex='女';
  23. -- 7. class降序查询student表的所有记录。
  24. SELECT * FROM student ORDER BY `class` DESC;
  25. -- 8.cno升序、degree降序查询Score表的所有记录。
  26. SELECT * FROM score ORDER BY `cno` ASC , `degree` DESC;
  27. -- 9.查询“95031”班的学生人数。
  28. SELECT COUNT(sno) FROM student WHERE class="95031";
  29. -- 10. 查询Score表中的最高分的snocno。(子查询或者排序)
  30. -- 子查询方式
  31. SELECT `sno`,`cno` FROM score
  32. WHERE degree =(
  33. SELECT MAX(`degree`) FROM score
  34. );
  35. -- 排序
  36. SELECT `sno`,`cno` FROM score
  37. ORDER BY degree DESC
  38. LIMIT 0,1;
  39. -- 11.查询每门课的cno、总人数、平均成绩。
  40. SELECT `cno`,COUNT(1) AS '总人数',AVG(`degree`) AS '平均分' FROM score GROUP BY `cno`;
  41. -- 12.查询Score表中至少有5名学生选修的并以3开头的课程号的cno、总人数、平均分。
  42. SELECT s.`cno`,COUNT(*) AS '总人数',AVG(`degree`) AS '平均分' FROM score AS s
  43. INNER JOIN course AS c
  44. ON c.`cno` = s.`cno`
  45. WHERE c.`cno` LIKE '3%'
  46. GROUP BY c.`cno`
  47. HAVING COUNT(*)>5;
  48. -- 13.查询分数大于70,小于90snodegree
  49. SELECT `sno`,`degree` FROM score WHERE `degree`>70 AND `degree`<90;
  50. -- 14.查询所有学生的snamecnodegree列。(多表查询)
  51. -- 第一种方式
  52. SELECT `sname`,`cno`,`degree` FROM student,score
  53. WHERE student.`sno`= score.`sno`;
  54. -- 第二种方式:联合查询
  55. SELECT `sname`,`cno`,`degree` FROM student AS s
  56. INNER JOIN score sc
  57. ON s.`sno`=sc.`sno`;
  58. -- 15.查询所有学生的snocnamedegree列(如果学生没有cname degree 也需要查询出来)。
  59. SELECT sc.`sno`,`cname`,`degree` FROM score AS sc
  60. LEFT JOIN course AS c
  61. ON sc.`cno`=c.`cno`;
  62. -- 16.查询“95033”班学生的cno,平均分(子查询和多表查询)。
  63. -- 多表查询方式一
  64. SELECT `cno`,AVG(`degree`) AS '平均分' FROM student s
  65. INNER JOIN score sc
  66. ON s.`sno`=sc.`sno`
  67. WHERE `class`='95033';
  68. -- 多表查询方式二
  69. SELECT cno,AVG(`degree`) AS '平均分' FROM score,student
  70. WHERE score.`sno`=student.`sno` AND student.`class`='95033';
  71. -- 子查询
  72. SELECT cno,AVG(`degree`) AS '平均分' FROM score
  73. WHERE sno IN(
  74. SELECT `sno` FROM student WHERE `class`='95033'
  75. );
  76. -- 17.查询课程号为“3-105”课程且学号为“109”号同学成绩的记录(子查询和多边查询)。
  77. -- 子查询
  78. SELECT * FROM student
  79. WHERE sno IN(
  80. SELECT `sno` FROM score WHERE `cno`='3-105' AND `sno`=109
  81. );
  82. -- 多表查询
  83. -- 方式一
  84. SELECT s.* FROM student AS s
  85. INNER JOIN score AS sc
  86. ON s.`sno`=sc.`sno`
  87. WHERE `cno`='3-105' AND sc.`sno`=109;
  88. -- 方式二
  89. SELECT s.* FROM student AS s,score AS sc WHERE s.`sno`=sc.`sno` AND `cno`='3-105' AND sc.`sno`=109;
  90. -- 18.查询score中选学2门课程的同学的sno、总成绩(且按照总成绩降序排序)。
  91. SELECT `sno`,SUM(`degree`) AS '总成绩' FROM score
  92. GROUP BY `sno`
  93. HAVING COUNT(`sno`)=2
  94. ORDER BY SUM(`degree`) DESC
  95. -- 19.查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
  96. -- 子查询
  97. SELECT * FROM score WHERE `degree`>(
  98. SELECT `degree` FROM score WHERE `sno`='109' AND `cno`='3-105'
  99. );
  100. -- 20.查询和学号为108的同学同年出生的所有学生的snosnamesbirthday列。
  101. SELECT * FROM student WHERE `sbirthday` IN(
  102. SELECT `sbirthday` FROM student WHERE sno = '108'
  103. );
  104. -- 21. 获取“张旭"教师所交课程课程号以及课程名
  105. SELECT `cno`,`cname` FROM course AS c
  106. INNER JOIN teacher AS t
  107. ON t.`tno`=c.`tno`
  108. WHERE t.`tname`="张旭";
  109. -- 21.查询“张旭“教师任课的学生成绩(姓名)。
  110. -- 方式一
  111. SELECT `sname`,`degree` FROM student
  112. LEFT JOIN score
  113. ON student.`sno`=score.`sno`
  114. WHERE score.sno IN(
  115. SELECT s.`sno` FROM course AS c
  116. INNER JOIN teacher AS t
  117. ON c.`tno`=t.`tno`
  118. INNER JOIN score AS sc
  119. ON sc.`cno`=c.`cno`
  120. LEFT JOIN student AS s
  121. ON s.`sno`=sc.`sno`
  122. WHERE t.`tname`="张旭"
  123. );
  124. -- 方式二
  125. SELECT `sname`,`degree` FROM student
  126. LEFT JOIN score
  127. ON student.`sno`=score.`sno`
  128. WHERE score.sno IN(
  129. SELECT s.sno FROM student AS s,score AS sc
  130. WHERE sc.`sno`=s.`sno` AND cno IN(SELECT cno FROM course AS c,teacher AS t WHERE c.`tno`=t.`tno` AND t.`tname`="张旭")
  131. );
  132. -- 22 查询考计算机导论的学生成绩(子查询)
  133. SELECT `degree` FROM score WHERE `cno` IN(
  134. SELECT `cno` FROM course WHERE cname="计算机导论"
  135. );
  136. -- 23.教高等数学的老师是叫什么,哪个系的(子查询)
  137. SELECT `tname`,`depart` FROM teacher WHERE `tno` IN(
  138. SELECT `tno` FROM course WHERE `cname`="高等数学"
  139. );
  140. -- 24.查询所有教师和同学的name、sex和birthday.(联合查询)
  141. SELECT t.`tname` AS 'name',t.`tsex` AS 'sex',t.`tbirthday` AS 'birthday' FROM teacher AS t
  142. UNION
  143. SELECT s.`sname`,s.`ssex`,s.`sbirthday` FROM student AS s;
  144. -- 25.查询选修某课程的同学人数多于5人的教师姓名(子查询)。
  145. SELECT `tname` FROM teacher WHERE tno IN(
  146. SELECT `tno` FROM course WHERE `cno` IN(
  147. SELECT `cno` FROM score GROUP BY `cno` HAVING COUNT(`sno`)>=5
  148. )
  149. );
  150. -- 26查询最高分同学的Sno、Cno和Degree列(子查询)。
  151. SELECT `sno`,`cno`,`degree` FROM score WHERE `degree`=(
  152. SELECT MAX(`degree`) FROM score
  153. );
  154. -- 27.查询Student表中不姓“王”的同学记录。
  155. SELECT * FROM student WHERE sno NOT IN(
  156. SELECT sno FROM student WHERE `sname` LIKE '王%'
  157. );
  158. -- 28.查询Student表中每个学生的姓名和年龄。
  159. SELECT `sname`, FLOOR(DATEDIFF(CURDATE(),`sbirthday`)/365.2422) AS '年龄' FROM student;
  160. -- 29.查询所有任课教师的Tname和Depart.
  161. SELECT `tname`,`depart` FROM teacher;
  162. -- 30.查询所有成绩比3-105课程平均成绩低的同学的成绩表。
  163. SELECT * FROM score WHERE `degree`<(
  164. SELECT AVG(`degree`) FROM score WHERE cno="3-105"
  165. );

MYSQL经典练习题,熟悉DQL的更多相关文章

  1. MySQL经典练习题

    表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...

  2. MySQL经典练习题及答案,常用SQL语句练习50题

    表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...

  3. mysql 经典练习题上

    MY SQL 三张表 emp 表, 字段empno, ename, job, mgr, hiredate, sal, comm, deptno dept表 , 字段 deptno, dname, lo ...

  4. 【不断更新】mysql经典50道题自我练习

    mysql经典50道题自我练习 测试数据和练习题均转载自CSDN博主@启明星的指引的文章sql语句练习50题(Mysql版),用于mysql的每日自我练习 表名和字段 –1.学生表 Student(s ...

  5. 10 个 MySQL 经典错误【转】

    Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 mysql> show variables like '%max_connec ...

  6. 【Python全栈-后端开发】MySQL数据库-练习题

    MySQL数据库-练习题 一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 3.查询平均成绩大于60分的同学的学号 ...

  7. 数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

  8. Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...

  9. 【视频+图文】Java基础经典练习题(一)输出2-100之间的素数,及素数个数

    目录 第一题:判断2-100之间有多少个素数,并输出所有素数. 1.视频讲解: 2.思路分析: 代码讲解:以i=4为例 4.为大家准备了彩蛋: 能解决题目的代码并不是一次就可以写好的 我们需要根据我们 ...

随机推荐

  1. Flutter中的绘图(Canvas&CustomPaint)API

    本文是Flutter中Canvas和CustomPaint API的使用实例. 首先看一下我们要实现的效果: 结合动图演示,列出最终目标如下: 在程序运行后,显示一个小球: 每次程序启动后,小球的样式 ...

  2. 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset

    LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...

  3. P3565 由简单的树形dp 引入 长链刨分

    这道题感觉不太行 因为自己没想出来. 先说一下暴力吧,取三个点 让两两之间的距离相等怎么做呢,看起来是很复杂的样子的,但是仔细观察发现 答案出自一个点的儿子之间 或者儿子和父亲之间. 暴力枚举三个点然 ...

  4. 数据量大了一定要分表,分库分表组件Sharding-JDBC入门与项目实战

    最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题.因此想借助一些分库分表的中间件,实现自动化分库分表实现.调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分 ...

  5. 好用的连接池-druid

    druid连接池是阿里巴巴的数据库连接池项目.它的一个亮点强大的监控功能以及防SQL注入,同时不影响性能.这里是它的GitHub地址.感觉druid扩展的功能还是很实用的. 实用的功能 详细的监控 E ...

  6. maven个人配置

    settings.xml 文件修改一下内容 本地 <localRepository>D:\maven\repository</localRepository> 远程:修改成国内 ...

  7. Maven 配置编译版本

    pom.xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</gro ...

  8. Kaggle-pandas(4)

    Grouping-and-sorting 教程 映射使我们可以一次将整个列中的数据转换为DataFrame或Series中的一个值. 但是,通常我们希望对数据进行分组,然后对数据所在的组进行特定的操作 ...

  9. ExtremeNet

  10. C#LeetCode刷题-树状数组

    树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题   32.7% 困难 307 区域和检索 - 数组可修改   42.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 ...