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'),'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 

例子14:每月的金额 汇总

 

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值