声明:这是数据库编程,不要和我讲效率低什么的

单表查询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'),'03,04,05') <> 0 --
不等于0是,月份在'3,4,5'中 then '春' when FIND_IN_SET(DATE_FORMAT(d3.create_time,
'%m'),'06,07,08') <> 0 then '夏' when FIND_IN_SET(DATE_FORMAT(d3.create_time,
'%m'),'09,10,11') <> 0 then '秋' when FIND_IN_SET(DATE_FORMAT(d3.create_time,
'%m'),'12,01,02') <> 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:函数里面写关键词



例子11:在字段上进行子查询

注意:这里用了完全限定表名,子查询中的where其实是个连表



例子12:连表中,同时满足多个条件


//对应的伪代码,就是这个意思 if(年级 && 班型 && 产品体系){ echo slpp.per_price as 课酬; }else{ echo
""; }
例子13:某一个日期 在 某个时间段之内


select bodla.bodla_create_time, bdslm.bdslm_begin_date as 校区法人有效期_开始时间,
bdslm.bdslm_end_date as 校区法人有效期_结束时间 from boss_ods_delay_learning_application
as bodla left join boss_dw_school_legal_manage as bdslm on
bodla.bodla_blcampus_id=bdslm.bdslm_orgID -- 查 DATE(bodla.bodla_create_time) 在
开始时间和结束时间之间的 where DATE(bodla.bodla_create_time) BETWEEN bdslm.bdslm_begin_date
AND bdslm.bdslm_end_date limit 10
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信