mysql数据库编程(拿起sql当代码用) 的 一些 奇葩思路

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

表查询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:函数里面写关键词

猜你喜欢

转载自blog.csdn.net/qq_33862644/article/details/81085617
今日推荐