今天工作中碰到一个sql问题,关于left join的,后面虽然解决了,但是通过此问题了解了一下sql的执行顺序
为避免安全纠纷,把场景模拟。
有一个学生表-S,一个成绩表G
CREATE TABLE `test_student` (
`id` bigint(20) NOT NULL COMMENT '学号',
`sex` TINYINT DEFAULT '0' COMMENT '性别 0-男 1-女',
`name` varchar(255) DEFAULT NULL COMMENT '姓名'
) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='学生表';
CREATE TABLE `test_score` (
`id` bigint(20) NOT NULL COMMENT '学号',
`score` int NOT NULL COMMENT '分数',
`level` TINYINT COMMENT '成绩 0-不及格 1-及格 2-优良 3-优秀'
) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='成绩表';
-- 初始化学生
INSERT INTO test_student VALUES(1, 0, '张三'), (2, 0, '李四'), (3, 1, '王X芳');
-- 初始化成绩
INSERT INTO test_score VALUES(1, 10, 0), (2, 20, 0), (3, 100, 3);
现在有一个需求,查出学生的考试成绩,可能的sql
SELECT ts.name AS '名字', tc.score AS '分数'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id;
突然,刚考完试,就转来一个学生
INSERT INTO test_student VALUES(4, 0, '新来的');
他没成绩,还是刚才的sql查
1.用inner join
SELECT ts.name AS '名字', tc.score AS '分数'
FROM test_student ts
INNER JOIN test_score tc
ON ts.id = tc.s_id;
2.加条件过滤
SELECT ts.name AS '名字', tc.score AS '分数'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id
AND tc.score is NOT NULL
;
SELECT ts.name AS '名字', tc.score AS '分数'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id
WHERE tc.score is NOT NULL
;
这就涉及到sql的执行顺序了
从上面的例子推断
join操作:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
这里推荐一个写的通俗易懂的关于joinSQL的各种连接Join详解
从上面看到,在sql中,on是写在了where条件之前,那么数据库引擎分析执行sql时,是否on也是在where前面呢?
一般sql的写法顺序
那么sql在执行时,顺序是怎样的呢?
标准的sql解析顺序为:
那么sql的执行顺序呢?
到了这里,应该发现,要写好sql不容易。但是了解了sql的执行顺序,能在开发的同理,更好的帮助写出好的程序。
比如join表不能太多(先过滤条件然后再根据表连接 同时在表中建立相关查询字段的索引这样在大数据多表联合查询的情况下速度相当快),这种sql优化问题,下次再学习整理下。
实践之!