SQL语句集锦(一)

在实际开发中,手写以及查到的sql语句有很多,随着时间的流逝,很容易忘掉sql的语义,在这里特别汇总一下!( ̄ˇ ̄)

需求一:

    功能:添加课程,选择开始、结束时间,拉取教室,教师信息。拉取的信息包含教师是否有课,教室是否占用以及占用的时间段。

===============================MYSQL===============================

SELECT 

           IF( `u`.`realname` != '' , `u`.`realname`, `u`.`nickname` ) AS `name`, 

           FROM_UNIXTIME( `c`.`starttime`, '%Y-%m-%d %T' ) AS `starttime`, 

           FROM_UNIXTIME( `c`.`endtime`, '%T' ) AS `endtime`, 

           IF( ( `c`.`starttime` >= 1553042040 AND `c`.`starttime` <= 1553049360 ) OR ( `c`.`starttime`

           `cl`.`roomname` 

FROM `users` AS `u`  

LEFT JOIN `course` AS `c`  

ON `u`.`uid` = `c`.`uid` AND ( ( `c`.`starttime` >= 1553042040 AND `c`.`starttime` <= 1553049360 ) OR ( `c`.`starttime`

LEFT JOIN `classroom` AS `cl` 

ON `c`.`classroomid` = `cl`.`id`

WHERE `u`.`oid` = 1 AND `u`.`roles` < 4

所用sql函数:

        IF( 【条件】,【为真时执行】,【不符合条件时执行】 )

        FROM_UNIXTIME( 【时间戳】,【转化后的时间格式】 ) 

        常用时间格式: %Y 年, 数字, 4 位  %m 月, 数字(01……12)  %d 月份中的天数, 数字(00……31)  %T 时间,24 小时(hh:mm:ss)  (更多时间格式,请点链接:https://www.cnblogs.com/xieqian111/p/5735952.html

需求二:通过sql语句拉取树状结构数据。(只拉取三级)

    听到这个需求时,第一反应时WTF??? 还有这种操作??? 咳咳咳 ~~~  在通过百度时,发现有很多的案例,不过大多是用到sql自定函数解决,但是,老大给出的结论是不通过sql自定义函数也可以解决。最后,找到了两条可以解决的答案。(虽然有一条是我自认为可以在当前项目中用到的。。。)

    先说第一条(自以为的⊙ω⊙,AND 也是查询速度最快的)。需求中,只要求拉取3级树状数据,而且应用的uses表中层级很明确,所以就是用多次连接同一张表查询。

===============================MYSQL===============================

SELECT `u`.`uid`, `u`.`nickname`, `u`.`refereesid`, `u1`.`uid` AS `aid`, `u1`.`nickname` AS `anickname`, `u1`.`refereesid` AS `are`, `u2`.`uid` AS `buid`, `u2`.`nickname` AS `bnickname`

FROM `users` AS `u`

LEFT JOIN `users` AS `u1`

ON `u.`refereesid` = `u1`.`uid`

LEFT JOIN `users` AS `u2`

ON `u1`.`refereesid` = `u2`.`uid`

WHERE `u`.`uid` = 1

    然而这样获取的数据只有一行,以及需要大量的重民名。如果是要拉取整条树的数据呢?

    第二条,通过设置sql全局变量来达到目的

===============================MYSQL===============================
SELECT `t`.`level` + 1 AS level, `u`.*

FROM (

    SELECT @uid as `_uid`, ( 

        SELECT @uid := `refereesid` FROM `uzp_users` WHERE `uid` = @uid order by `refereesid` desc ) _refereesid, @l := @l-1 as `level` FROM `uzp_users` , ( select @uid := 23, @l := 3 ) b where @uid >0 AND @l > 0

) `t`, `uzp_users` as `u`

where `t`.`_uid` = `u`.`uid`

知识点:  

        1、sql子句的别名可以省去`as`关键字

        2、SELECT语句中,子查询总是由内向外处理的。所以在处理读sql语句时,先看内部子查询。

        3、sql全局变量,`@变量名` 来声明, 通过 @id := 0 赋值

猜你喜欢

转载自blog.csdn.net/ricardo_rie/article/details/88817805