MySQl 专栏继续更新 不说晦涩难懂的东西 尽量输出容易了解 和 运用的SQL技巧 和 初中级开发不是很常用的但很有用的知识

欢迎查看SQL 专栏 查漏补缺 指导一二

SQL 思维训练四

本文正在参与「技能专题19期 闲谈数据库技能」活动

前语

通过思路解析 剖析SQL书写 拆分逻辑 简略易懂 跟着学习 等系列更新完 SQL编写能力 和 SQL思维都会有提高 欢迎重视专栏 假如有更简略的接替办法 能够发在评论区会弥补完善

创立表

假如已经创立过表的请越过

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `c_id` int(11) NOT NULL AUTO_INCREMENT,
  `c_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `t_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`c_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, '语文', 2);
INSERT INTO `course` VALUES (2, '数学', 1);
INSERT INTO `course` VALUES (3, '英语', 3);
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score`  (
  `s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `c_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
  `s_score` int(3) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '1', 80);
INSERT INTO `score` VALUES ('1', '2', 90);
INSERT INTO `score` VALUES ('1', '3', 99);
INSERT INTO `score` VALUES ('2', '1', 70);
INSERT INTO `score` VALUES ('2', '3', 60);
INSERT INTO `score` VALUES ('2', '4', 80);
INSERT INTO `score` VALUES ('3', '1', 80);
INSERT INTO `score` VALUES ('3', '1', 80);
INSERT INTO `score` VALUES ('3', '3', 80);
INSERT INTO `score` VALUES ('4', '1', 50);
INSERT INTO `score` VALUES ('4', '2', 30);
INSERT INTO `score` VALUES ('4', '3', 20);
INSERT INTO `score` VALUES ('5', '1', 76);
INSERT INTO `score` VALUES ('5', '2', 87);
INSERT INTO `score` VALUES ('6', '1', 31);
INSERT INTO `score` VALUES ('6', '3', 34);
INSERT INTO `score` VALUES ('7', '2', 89);
INSERT INTO `score` VALUES ('7', '3', 98);
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `s_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `s_code` int(100) NULL DEFAULT NULL,
  `s_sex` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `s_birth` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `一般索引`(`s_sex`) USING BTREE,
  INDEX `联合索引`(`s_name`, `s_code`, `s_birth`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '学生1', 1, '男', '2022-11-20');
INSERT INTO `student` VALUES (2, '学生2', 2, '男', '2022-11-20');
INSERT INTO `student` VALUES (3, '变成派大星', 3, '男', '2022-11-20');
INSERT INTO `student` VALUES (4, '学生4', 4, '男', '2022-11-20');
INSERT INTO `student` VALUES (5, '学生5', 5, '女', '2022-11-20');
INSERT INTO `student` VALUES (6, '学生6', 6, '女', '2022-11-20');
INSERT INTO `student` VALUES (7, '学生7', 7, '女', '2022-11-20');
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `t_id` int(11) NOT NULL AUTO_INCREMENT,
  `t_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`t_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, '泡芙老师');
INSERT INTO `teacher` VALUES (2, '蟹老板');
INSERT INTO `teacher` VALUES (3, '章鱼哥');
SET FOREIGN_KEY_CHECKS = 1;

表对应联系:

SQL 思维训练四

中等

难度:

SQL 思维训练四
SQL 思维训练四

问题

查询均匀成果大于等于60分的同学的学生编号和学生姓名和均匀成果

示例

SQL 思维训练四

友情提示: 能够不看剖析练习一下 看一下能不能写出效果

剖析

这个首要来说比较简略 检索几个比较有用次

  • 均匀成果 ===》avg
  • 大于等于60 ===》>= 60
  • 学生(student) 成果(score)
  • 求学生的均匀成果肯定要数据隔离 且 一致 也便是分组 ===》 group up
  • 筛选出大于等于60的学生 不知道记不记得 having 这个和 group up 连用的东西 相当于 group by 的 where

拼接SQL

select s.id,s.s_name,avg(sco.s_score) AS 均匀成果 from student s inner join score sco
on s.id = sco.s_id GROUP BY sco.s_id HAVING avg(sco.s_score) >= 60

SQL 思维训练四

知识点

  • 内连接
  • 分组 group by
  • 筛选 having
  • 均匀值 avg
  • 还有一个能够对结果的数字小数点 进行保留位数 ROUND

SQL 思维训练四

中等

难度:

SQL 思维训练四
SQL 思维训练四

问题

查询一切同学的学生编号、学生姓名、选课总数、一切课程的总成果

示例

SQL 思维训练四

剖析

这两个题基本都是 分组计算 所以上一个题 做出来或许 有一定根底的人会感觉比较简略

  • 课程的数量和总和 别离对应 count 和 sum
  • 同一个学生 group by
  • 连个表进行连接 student 为主表 left join

SQL 句子:

select st.id,st.s_name,count(sc.c_id) AS 课程数,sum(sc.s_score) 成果总计
from student st left join score sc on sc.s_id =  st.id GROUP BY st.id

SQL 思维训练四

知识点

  • 左连接

  • 分组 group by

  • 计数 count 求和 sum

总结

在解决这种计算数据的时分 能够选择去运用group by 进行输一局分组 可是 MySQL 中有宽松形式 和 严厉形式

宽松形式下 select 能够查询 group by 中没有的字段

严厉形式下 select 不能够查询除啦 group by 中的字段

例如 : 宽松形式下 select name,age from student group by name 不会出现错误

严厉形式下 select name,age from student group by name 会出现报错 select name,age from student group by name,age 必须要这样写

这里还有一个细节便是在进行表连接的时分咱们通过left join 进行数据连接 因为咱们不想丢失 student 表中的数据 哪怕这个学生没有选择课程和没有成果 咱们也要查询出来这个学生 在运用连接的时分要根据实际的数据状况去进行判别运用哪一个

末尾

周日愉快 文章结束

继续更新SQL相联系列 最近主要是找一些比较有意思的SQL练习题 可追更

SQL 思维训练四

引荐阅览相关文章:小白也能看到索引的运用和规则

本文正在参与「技能专题19期 闲谈数据库技能」活动