鱼C论坛

 找回密码
 立即注册
查看: 1403|回复: 0

SQL查询面试题【中】

[复制链接]
发表于 2020-7-22 21:17:33 | 显示全部楼层 |阅读模式

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

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

x
参考链接:https://mp.weixin.qq.com/s?__biz ... =21#wechat_redirect


  1. #1.要求在剔除访问次数前20%的用户后,每类用户的平均访问次数。
  2. USE train;
  3. #建表
  4. DROP TABLE IF EXISTS 访问;
  5. CREATE TABLE 访问(
  6.         用户编号 INT,
  7.         用户类型 VARCHAR(255),
  8.         访问量 INT
  9. );
  10. INSERT INTO 访问
  11. VALUES(10, 'A', 352),
  12.         (6, 'C', 209),
  13.         (7, 'C', 110),
  14.         (4, 'E', 101),
  15.         (2, 'B', 53),
  16.         (20, 'A', 53),
  17.         (11, 'C', 33),
  18.         (1, 'A', 30),
  19.         (9, 'E', 29),
  20.         (8, 'B', 6);

  21. #剔除
  22. DROP TABLE IF EXISTS temp;
  23. CREATE TABLE temp AS
  24. SELECT *, ROW_NUMBER() OVER(ORDER BY 访问量 DESC) AS ranking
  25. FROM 访问;
  26. #查询
  27. SELECT 用户类型, AVG(访问量) AS 平均访问次数
  28. FROM temp
  29. WHERE ranking > (SELECT MAX(ranking) FROM temp) * 0.2
  30. GROUP BY 用户类型;


  31. #2.查询每门课程的前3高成绩
  32. #建表
  33. DROP TABLE IF EXISTS 原始表;
  34. CREATE TABLE 原始表(
  35.         课程号 INT,
  36.         学号 INT,
  37.         成绩 INT
  38. );
  39. INSERT INTO 原始表
  40. VALUES(0001, 0001, 80),
  41.         (0001, 0003, 80),
  42.         (0002, 0001, 90),
  43.         (0002, 0003, 80),
  44.         (0002, 0002, 60),
  45.         (0002, 0004, 55),
  46.         (0003, 0001, 99),
  47.         (0003, 0002, 80),
  48.         (0003, 0003, 80);


  49. SELECT 课程号,学号,成绩, 排名
  50. FROM (
  51.         SELECT *, DENSE_RANK() OVER(PARTITION BY 课程号 ORDER BY 成绩 DESC) AS 排名
  52.         FROM 原始表

  53. ) AS temp
  54. WHERE 排名 <= 3


  55. #3.查找出每门课程中成绩最好的学生的姓名和该学生的课程及成绩。
  56. DROP TABLE IF EXISTS 学生表;
  57. CREATE TABLE 学生表(
  58.         学号 VARCHAR(255) PRIMARY KEY,
  59.         姓名 VARCHAR(255) NOT NULL,
  60.         出生日期 DATE NOT NULL,
  61.         性别 VARCHAR(255) NOT NULL
  62. );
  63. DESC 学生表;

  64. DROP TABLE IF EXISTS 成绩表;
  65. CREATE TABLE 成绩表(
  66.         学号 VARCHAR(255),
  67.         课程号 VARCHAR(255),
  68.         成绩 FLOAT(3) NOT NULL,
  69.         PRIMARY KEY(学号, 课程号)
  70. );
  71. DESC 成绩表;

  72. DROP TABLE IF EXISTS 课程表;
  73. CREATE TABLE 课程表(
  74.         课程号 VARCHAR(255) PRIMARY KEY,
  75.         课程名称 VARCHAR(255) NOT NULL,
  76.         教师号 VARCHAR(255) NOT NULL
  77. );
  78. DESC 课程表;

  79. #向表中添加数据
  80. INSERT INTO 学生表
  81. VALUES('0001' , '猴子' , '1989-01-01' , '男'),
  82. ('0002' , '猴子' , '1990-12-21' , '女'),
  83. ('0003' , '马云' , '1991-12-21' , '男'),
  84. ('0004' , '王思聪' , '1990-05-20' , '男');

  85. INSERT INTO 成绩表
  86. VALUES('0001' , '0001' , 87),
  87. ('0001' , '0002' , 45),
  88. ('0001' , '0003' , 45),
  89. ('0002' , '0002' , 99),
  90. ('0002' , '0003' , 98),
  91. ('0003' , '0001' , 88),
  92. ('0003' , '0002' , 80),
  93. ('0003' , '0003' , 80);
  94. ('0003' , '0003' , 23);


  95. INSERT INTO 课程表
  96. VALUES('0001' , '语文' , '0002'),
  97. ('0002' , '数学' , '0001'),
  98. ('0003' , '英语' , '0003');
  99. #查询
  100. SELECT c.学号, c.姓名, b.课程名称, a.成绩
  101. FROM 成绩表 a
  102.         LEFT JOIN 课程表 b ON a.课程号 = b.课程号
  103.         LEFT JOIN 学生表 c ON a.学号 = c.学号
  104. WHERE (a.课程号, a.成绩) IN
  105. (SELECT 课程号,MAX(成绩) FROM 成绩表 GROUP BY 课程号);

  106. #4.生成一张临时表(表名:用户登录表),表中呈现四列数据分别为:姓名,最后登录时间,登录时间排名,登录天数排名
  107. #建表
  108. DROP TABLE IF EXISTS 用户登记时间表;
  109. CREATE TABLE 用户登记时间表(
  110.         id INT PRIMARY KEY,
  111.         姓名 VARCHAR(255),
  112.         邮箱地址 VARCHAR(255),
  113.         最后登录时间 DATETIME
  114. );
  115. INSERT INTO 用户登记时间表
  116. VALUES (100, 'test4', 'test4@yahoo.cn', '2007/11/25 16:31:00'),
  117.         (13, 'test1', 'test4@yahoo.cn', '2007/03/22 16:27:00'),
  118.         (19, 'test1', 'test4@yahoo.cn', '2007/10/25 14:13:00'),
  119.         (42, 'test1', 'test4@yahoo.cn', '2007/10/25 14:20:00'),
  120.         (45, 'test2', 'test4@yahoo.cn', '2007/04/25 14:17:00'),
  121.         (49, 'test2', 'test4@yahoo.cn', '2007/05/25 14:22:00');
  122. #查询
  123. SELECT 姓名,最后登录时间,
  124.        ROW_NUMBER() OVER (PARTITION BY 姓名
  125.                           ORDER BY 最后登录时间 ASC) AS 登录时间排名,
  126.        DENSE_RANK() OVER (PARTITION BY 姓名
  127.                           ORDER BY DATE_FORMAT( 最后登录时间,'%Y%m&d' ) ASC) AS 登录天数排名
  128. FROM  用户登记时间表 ;

  129. #5.找出每门课程中成绩最差的学生
  130. DROP TABLE IF EXISTS 成绩表;
  131. CREATE TABLE 成绩表(
  132.         学号 INT,
  133.         课程号 INT,
  134.         成绩 INT
  135. );

  136. INSERT INTO 成绩表
  137. VALUES('0001' , '0001' , 80),
  138.         ('0001' , '0002' , 90),
  139.         ('0001' , '0003' , 99),
  140.         ('0002' , '0002' , 60),
  141.         ('0002' , '0003' , 80),
  142.         ('0003' , '0001' , 80),
  143.         ('0003' , '0002' , 80),
  144.         ('0003' , '0003' , 80);

  145. #查询
  146. SELECT *
  147. FROM 成绩表
  148. WHERE (课程号, 成绩) IN (
  149.         SELECT 课程号, MIN(成绩) AS 成绩
  150.         FROM 成绩表
  151.         GROUP BY 课程号
  152. );

复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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