SQL语句执行顺序

SQL语句执行顺序学习记录

数据表: student

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `grade` double(11, 2) DEFAULT NULL COMMENT '成绩',
  `class` int(5) DEFAULT NULL COMMENT '班级',
  `subject` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '学科',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张三', 15, 60.00, 2, '语文');
INSERT INTO `student` VALUES (2, '张三', 15, 56.00, 2, '数学');
INSERT INTO `student` VALUES (3, '张三', 15, 80.00, 2, '英语');
INSERT INTO `student` VALUES (4, '李四', 16, 20.00, 2, '语文');
INSERT INTO `student` VALUES (5, '李四', 16, 88.00, 2, '数学');
INSERT INTO `student` VALUES (6, '李四', 16, 65.00, 2, '英语');
INSERT INTO `student` VALUES (7, '王五', 14, 55.00, 3, '语文');
INSERT INTO `student` VALUES (8, '王五', 14, 54.00, 3, '数学');
INSERT INTO `student` VALUES (9, '王五', 14, 56.00, 3, '英语');
INSERT INTO `student` VALUES (10, '菜菜', 15, 23.00, 4, '语文');
INSERT INTO `student` VALUES (11, '菜菜', 15, 23.00, 4, '数学');
INSERT INTO `student` VALUES (12, '菜菜', 15, 23.00, 4, '英语');

SET FOREIGN_KEY_CHECKS = 1;

一、基础查询

1、查询表中不及格科目数量超过一科的前两名

SELECT name,count(grade) num FROM student WHERE grade < 60 GROUP BY `name` HAVING num >= 1 ORDER BY num DESC LIMIT 0,2;
最终结果

在这里插入图片描述
该条sql执行流程如下:

① FROM

查询的sql语句最先执行的是FROM, 负责将FROM 后面的数据表的表文件加载到内存中

② WHERE

WHERE从内存中获取符合条件的数据,并生成一张临时表, 对FROM加载到内存中的原生数据进行过滤;
在这里插入图片描述

③ GROUP BY

根据分组将临时表划分为多张临时表, 如果没有特殊指定,SELECT会取每张临时表的第一条数据生成一张新的临时表
临时表一
在这里插入图片描述
临时表二
在这里插入图片描述
临时表三
在这里插入图片描述

④ HAVING

从临时表中筛选出符合条件的数据; HAVING后跟着的条件字段必须是SELECT查找出的字段;
在这里插入图片描述

⑤ SELECT

选择需要列

⑥ ORDER BY

根据以上步骤查询出的临时表数据进行排序
在这里插入图片描述

⑦ LIMIT

对排序后的临时表数据进行截取;
在这里插入图片描述

⑧ 个人理解

sql查询的执行顺序大致相同,
FROM: 将目标数据表的数据生成一张临时表
WHERE: 根据条件从临时表中筛选数据
SELECT: 根据目标列从临时表中获取数据

二、JOIN 查询

添加班级数据表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '班级id',
  `className` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '班级名称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES (1, '一班');
INSERT INTO `classes` VALUES (2, '二班');
INSERT INTO `classes` VALUES (3, '三班');

SET FOREIGN_KEY_CHECKS = 1;


1、FROM

SELECT s.*,c.* FROM student s LEFT JOIN classes c ON 1 = 1;

使用笛卡尔积,将左右两边的表生成一张虚拟表(virtual table) vt1, vt1表数量为 m * n;
在这里插入图片描述

2、ON

SELECT s.*,c.* FROM student s LEFT JOIN classes c ON s.class = c.id

根据ON的条件从vt1表中过滤符合条件的数据,生成vt2
在这里插入图片描述

3、JOIN

添加外部行的过程, 并生成vt3

① LEFT JOIN

将左表中的不符合条件的数据插入到vt2中, 其余字段置为null

② INNER JOIN

不会添加外部行,生成的vt3与vt2数据一致

③ RIGHT JOIN

与LEFT JOIN 类似, 会将右表中不符合条件的数据插入到vt2中, 其余字段置为null

4、WHERE

SELECT s.*,c.* FROM student s LEFT JOIN classes c ON s.class = c.id WHERE s.grade < 60;

根据条件对vt3进行数据筛选, 生成vt4
在这里插入图片描述

5、SELECT

SELECT s.name,s.grade,c.className FROM student s LEFT JOIN classes c ON s.class = c.id WHERE s.grade < 60;

从vt4中获取所需数据,生成最终结果表vt5
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值