鱼C论坛

 找回密码
 立即注册
查看: 1672|回复: 2

MYSQL常见25题【适合入门】

[复制链接]
发表于 2020-6-6 02:13:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2020-6-6 02:16 编辑
  1. USE test50; #定位在该数据库下进行操作
  2. #创建表的结构
  3. DROP TABLE IF EXISTS student;
  4. CREATE TABLE student(
  5.         学号 VARCHAR(255) PRIMARY KEY,
  6.         姓名 VARCHAR(255) NOT NULL,
  7.         出生日期 DATE NOT NULL,
  8.         性别 VARCHAR(255) NOT NULL
  9. );
  10. DESC student;

  11. DROP TABLE IF EXISTS score;
  12. CREATE TABLE score(
  13.         学号 VARCHAR(255),
  14.         课程号 VARCHAR(255),
  15.         成绩 FLOAT(3) NOT NULL,
  16.         PRIMARY KEY(学号, 课程号)
  17. );
  18. DESC score;

  19. DROP TABLE IF EXISTS course;
  20. CREATE TABLE course(
  21.         课程号 VARCHAR(255) PRIMARY KEY,
  22.         课程名称 VARCHAR(255) NOT NULL,
  23.         教师号 VARCHAR(255) NOT NULL
  24. );
  25. DESC course;

  26. DROP TABLE IS EXISTS teacher;
  27. CREATE TABLE teacher(
  28.         教师号 VARCHAR(20) PRIMARY KEY;
  29.         教师姓名 VARCHAR(20),
  30. );
  31. DESC teacher;

  32. #向表中添加数据
  33. INSERT INTO student
  34. VALUES('0001' , '猴子' , '1989-01-01' , '男'),
  35. ('0002' , '猴子' , '1990-12-21' , '女'),
  36. ('0003' , '马云' , '1991-12-21' , '男'),
  37. ('0004' , '王思聪' , '1990-05-20' , '男');

  38. INSERT INTO score
  39. VALUES('0001' , '0001' , 87),
  40. ('0001' , '0002' , 45),
  41. ('0001' , '0003' , 45),
  42. ('0002' , '0002' , 99),
  43. ('0002' , '0003' , 98),
  44. ('0003' , '0001' , 88),
  45. ('0003' , '0002' , 80),
  46. ('0003' , '0003' , 80);
  47. ('0003' , '0003' , 23);


  48. INSERT INTO course
  49. VALUES('0001' , '语文' , '0002'),
  50. ('0002' , '数学' , '0001'),
  51. ('0003' , '英语' , '0003');


  52. INSERT INTO teacher
  53. VALUES('0001' , '孟扎扎'),
  54. ('0002' , '马化腾'),
  55. ('0003' , NULL),
  56. ('0004' , '');



  57. #1.查询姓“孟”老师的个数
  58. SELECT COUNT(*) AS 老师人数
  59. FROM teacher
  60. WHERE 教师姓名 LIKE "孟%";


  61. #2.查询课程编号为“0002”的总成绩
  62. SELECT SUM(成绩)
  63. FROM score
  64. WHERE 课程号 = '0002';

  65. #3.查询选了课程的学生人数
  66. SELECT COUNT(DISTINCT 学号)
  67. FROM score;

  68. #4.查询各科成绩最高和最低的分, 以如下的形式显示:课程号,最高分,最低分
  69. SELECT 课程号, MAX(成绩) AS 最高分, MIN(成绩) AS 最低分
  70. FROM score
  71. GROUP BY 课程号;

  72. #5.查询每门课程被选修的学生数
  73. SELECT 课程号, COUNT(DISTINCT 学号)AS 学生人数
  74. FROM score
  75. GROUP BY 课程号;

  76. #6.查询男生、女生人数
  77. SELECT 性别, COUNT(学号) AS 人数
  78. FROM student
  79. GROUP BY 性别;

  80. #7.查询平均成绩大于60分学生的学号和平均成绩
  81. SELECT 学号, ROUND(AVG(成绩), 1) AS 平均成绩
  82. FROM score
  83. GROUP BY 学号
  84. HAVING AVG(成绩) > 60;

  85. #8.查询至少选修两门课程的学生学号
  86. SELECT 学号
  87. FROM score
  88. GROUP BY 学号
  89. HAVING COUNT(DISTINCT 课程号) >= 2;

  90. #9.查询同名同性学生名单并统计同名人数
  91. SELECT 姓名, COUNT(*)
  92. FROM student
  93. GROUP BY 姓名
  94. HAVING COUNT(*) > 1;

  95. #10.查询不及格的课程并按课程号从大到小排列
  96. SELECT 课程号, 成绩
  97. FROM score
  98. WHERE 成绩 < 60
  99. ORDER BY 课程号 DESC;

  100. #11.查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
  101. SELECT 课程号, ROUND(AVG(成绩), 1) AS 平均成绩
  102. FROM score
  103. GROUP BY 课程号
  104. ORDER BY AVG(成绩) ASC, 课程号 DESC;

  105. #12.检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
  106. SELECT 学号, 成绩
  107. FROM score
  108. WHERE 课程号 = '0004' AND 成绩 < 60
  109. ORDER BY 成绩 DESC;


  110. #13.统计每门课程的学生选修人数(超过2人的课程才统计)要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
  111. SELECT 课程号, COUNT(学号) AS 选修人数
  112. FROM score
  113. GROUP BY 课程号
  114. HAVING COUNT(学号) > 2
  115. ORDER BY 选修人数 DESC, 课程号 ASC;

  116. #14.查询两门以上不及格课程的同学的学号及其平均成绩
  117. #(1)筛选出不及格超过2门的同学学号
  118. SELECT 学号
  119. FROM score
  120. WHERE 成绩 < 60
  121. GROUP BY 学号
  122. HAVING COUNT(课程号) > 2;
  123. #(2)得到最终结果
  124. SELECT 学号, ROUND(AVG(成绩), 1) AS 平均成绩
  125. FROM score
  126. WHERE 学号 IN(
  127.         SELECT 学号
  128.         FROM score
  129.         WHERE 成绩 < 60
  130.         GROUP BY 学号
  131.         HAVING COUNT(课程号) > 2
  132. )
  133. GROUP BY 学号;

  134. #15.查询所有课程成绩小于60分学生的学号、姓名
  135. #(1)查询所有成绩及格的学号
  136. SELECT DISTINCT 学号
  137. FROM score
  138. WHERE 成绩 >= 60;
  139. #(2)得到最终结果
  140. SELECT DISTINCT s1.学号, 姓名
  141. FROM student s1 RIGHT JOIN score s2
  142. ON s1.学号 = s2.学号
  143. WHERE s1.学号 NOT IN (
  144.         SELECT DISTINCT 学号
  145.         FROM score
  146.         WHERE 成绩 >= 60
  147. );

  148. #16.查询没有学全所有课的学生的学号、姓名
  149. #(1)查询所有课程数
  150. SELECT COUNT(*)
  151. FROM course;
  152. #(2)查询没有学满所有课程的学生学号、姓名
  153. SELECT s2.学号, 姓名
  154. FROM score s1 RIGHT JOIN student s2
  155. ON s1.学号 = s2.学号
  156. GROUP BY s2.学号
  157. HAVING COUNT(DISTINCT 课程号) < (SELECT COUNT(*)FROM course);

  158. #17.查询出只选修了两门课程的全部学生的学号和姓名
  159. SELECT s1.学号, 姓名
  160. FROM score s1 LEFT JOIN student s2
  161. ON s1.学号 = s2.学号
  162. GROUP BY s1.学号
  163. HAVING COUNT(课程号) = 2;


  164. #18.1990年出生的学生名单
  165. SELECT *
  166. FROM student
  167. WHERE YEAR(出生日期) = 1990;

  168. #19.查询各科成绩前两名的记录(同分都算为一个等级)*****
  169. #(1)查询各科成绩排名
  170. SELECT s1.课程号, s1.成绩,COUNT(DISTINCT s2.成绩) + 1 AS 排名
  171. FROM score s1 LEFT JOIN score s2
  172. ON s1.课程号 = s2.课程号 AND s1.成绩 < s2.成绩 AND s1.学号 != s2.学号
  173. GROUP BY s1.课程号, s1.成绩
  174. ORDER BY 课程号 ASC, 成绩 DESC;
  175. #(2)得到最终的结果
  176. SELECT *
  177. FROM score
  178. WHERE (课程号, 成绩) IN (
  179.         SELECT s1.课程号, s1.成绩
  180.         FROM score s1 LEFT JOIN score s2
  181.         ON s1.课程号 = s2.课程号 AND s1.成绩 < s2.成绩 AND s1.学号 != s2.学号
  182.         GROUP BY s1.课程号, s1.成绩
  183.         HAVING COUNT(DISTINCT s2.成绩) + 1 <= 2
  184.        
  185. )
  186. ORDER BY 课程号 ASC, 成绩 DESC;


  187. #20.查询所有学生的学号、姓名、选课数、总成绩
  188. SELECT student.学号, 姓名, COUNT(DISTINCT 课程号) AS 选课数, IF(ISNULL(SUM(成绩)), 0, SUM(成绩)) AS 总成绩
  189. FROM student LEFT JOIN score
  190. ON student.学号 = score.学号
  191. GROUP BY student.学号;

  192. #21.查询平均成绩大于85的所有学生的学号、姓名和平均成绩
  193. SELECT  score.学号, 姓名, AVG(成绩) AS 平均成绩
  194. FROM student RIGHT JOIN score
  195. ON student.学号 = score.学号
  196. GROUP BY score.学号
  197. HAVING AVG(成绩) > 85;


  198. #22.查询学生的选课情况:学号,姓名,课程号,课程名称
  199. SELECT score.学号, 姓名, score.课程号, 课程名称
  200. FROM score LEFT JOIN student
  201. ON student.学号 = score.学号
  202. LEFT JOIN course
  203. ON score.课程号 = course.课程号;

  204. #23.查询出每门课程的及格人数和不及格人数 *****
  205. SELECT score.课程号, 课程名称, SUM(IF(成绩 < 60, 1, 0)) AS 不及格人数
  206. FROM score RIGHT JOIN course
  207. ON score.课程号 = course.课程号
  208. GROUP BY score.课程号, 课程名称;

  209. #24.使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
  210. #(1)做分数段标记
  211. SELECT 课程号, 成绩, CASE WHEN 成绩 >= 85 THEN "[100-85]"
  212.             WHEN 成绩 >= 70 THEN "[85-70]"
  213.             WHEN 成绩 >= 60 THEN "[70-60]"
  214.             ELSE "[<60]"
  215.             END AS 成绩分段
  216. FROM score
  217. #(2)最终得到的结果
  218. SELECT score.课程号, 课程名称,
  219.         CASE WHEN 成绩 >= 85 THEN "[100-85]"
  220.         WHEN 成绩 >= 70 THEN "[85-70]"
  221.         WHEN 成绩 >= 60 THEN "[70-60]"
  222.         ELSE "[<60]"
  223.         END AS 成绩分段, COUNT(*) AS 分段人数
  224. FROM score LEFT JOIN course
  225. ON score.课程号 = course.课程号
  226. GROUP BY score.课程号, 课程名称, 成绩分段;
  227.                                
  228. #25.查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名
  229. SELECT score.学号, 姓名
  230. FROM student RIGHT JOIN score
  231. ON student.学号 = score.学号
  232. WHERE 课程号 = "0003" AND 成绩 > 80


复制代码



参考链接:https://zhuanlan.zhihu.com/p/38354000

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-6 02:14:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 09:14:49 | 显示全部楼层
很详细谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 20:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表