声明:这是数据库编程,不要和我讲效率低什么的
单表查询select语句的执行原理:
1、先将你sql中写的字段、连表给预先 理解(如 下面的例子各种连表)
2、在执行where后面的;如果有子查询,先执行括号里的 如 select * from a where id in (select pid from b where = 66) //查出b表的id,和a表中的id做匹配,只取a表匹配到的
3、最后输出字段(这时已经计算好了)
多表查询select语句的执行原理:
1、先执行on 后执行where
ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据,在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。
总结:
派生表的作用很多:可以计算、可以做同时输出
字段中也可以写sql,用小括号括起来即可,sql先计算()内的,将结果给字段做运算
例子1、同一个字段,俩种状态,要同时在同一行输出,不能用or怎么搞
效果图:
sql:
例子2、一个字段,2个标识位,代表3种状态;这里查的是纯优惠的
该字段逻辑有点特殊,特附图:
-- 142行的having要放在最下面,原因1:having是对查出来的结果在筛选,而where是查之前进行筛选;
-- 原因2:having支持通过字段别名(mini_contract就是别名),进行筛选,where只支持原来的字段名
例子3、直接在字段上做计算:减法(书:mysql必知必会,10.3执行算数计算)
例子4、函数写在判断外面
例子5、算四季,春夏秋冬
if(
DATE_FORMAT(d3.create_time, '%m') = 04, -- 第1个参数
case
when
FIND_IN_SET(DATE_FORMAT(d3.create_time, '%m'),'3,4,5') <> 0 -- 不等于0是,月份在'3,4,5'中
then '春'
when
FIND_IN_SET(DATE_FORMAT(d3.create_time, '%m'),'6,7,8') <> 0
then '夏'
when
FIND_IN_SET(DATE_FORMAT(d3.create_time, '%m'),'9,10,11') <> 0
then '秋'
when
FIND_IN_SET(DATE_FORMAT(d3.create_time, '%m'),'12,1,2') <> 0
then '冬'
end,
d3.create_time -- 第3个参数
)
as 回访季度
例子6、定义变量
-- 自定义变量,计算行号
SELECT
@row := @row + 1 as 行号, -- 迭代器+1
fenxiao.*
FROM fenxiao, (SELECT @row := 0) t -- 虚个表,将变量置位0
WHERE @row < 8 -- 输出行号<8的数据
例子7:where上做计算,及其优化
需求:统计 实付 > 原价70% 的人数
例子8:on是个连表条件,不止能用=
=是个表达式,大于 小于 也是个表达式,既然 这样,那子查询 也没问题咯
例子9:on后面多个条件,用()
例子10:在case中 没有 select ... from ... where 的可以直接使用and
想明白了,不奇葩,就是一个or的关系,如第6行 4个条件,其中一个为真 就输出 班主任
如果case中有表达式:相当于 输出结果后,在where一遍(case中的like 大于 小于啊)
如果case中没有表达式:相当于是个if else的功能
例子11:函数里面写关键词