sql查询笔记

普通操做

不要使用 !=

select * from test where id !=1
尽可能用 <> 替换 !=
mybatis的mapper中就使用 &lt;&gt; 
或者使用转义:  <![CDATA[ <> ]]>

DISTINCT去重

SELECT DISTINCT(id) FROM table

CASE WHEN条件判断

两种书写格式
SELECT (CASE sex  WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其余' END) FROM TABLE ;
SELECT (CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其余' END  ) FROM TABLE ;

查询结果自动添加排序编号

SELECT @id := @id + 1 AS id,   a.* from (SELECT @id := 0) r,(SELECT * FROM s_bid )a

经理写的sql

SELECT t.date as timeDate, COALESCE(t2.allCount,0) as allCount, COALESCE(t2.finishCount,0) as finishCount, COALESCE(t2.zaituCount,0) as   zaituCount, COALESCE(t2.overTimeCount,0) as overTimeCount  
FROM (SELECT @cdate:= date_add(@cdate,interval - 1 day) as date , 0 as num FROM 
      (SELECT @cdate:=date_add(CURDATE(),interval + 1 day) from `service_type`  ) t1
      WHERE  @cdate > '2019-05-01'
     ) t
LEFT JOIN 
 (SELECT DATE_FORMAT(o.submit_time, '%Y-%m-%d') as timeDate,COUNT(o.`id`) as allCount,COUNT(o.`status` = '4' or null) as finishCount,COUNT(o.  `status` !='4' or null) as zaituCount,COUNT(o.deal_overtime = 1 or null)     
  as overTimeCount
  FROM work_order o 
  left join service_type t on t.id = o.servicetype_id 
  WHERE o.is_deleted = '0' and t.code='S001' and t.is_deleted='0' AND YEAR(o.submit_time) = 2019 AND MONTH(o.submit_time) = 5 GROUP BY timeDate   
 ) t2 
 on t.date=t2.timeDate ORDER BY t.date

字符串操做

日期操做

日期函数列表

NOW()	        返回当前的日期和时间
CURDATE() 	返回当前的日期 CURRENT_DATE()
CURTIME()	返回当前的时间
DATE()	        提取日期或日期/时间表达式的日期部分
EXTRACT()	返回日期/时间按的单独部分
DATE_ADD()	给日期添加指定的时间间隔
DATE_SUB()	从日期减去指定的时间间隔
DATEDIFF()	返回两个日期之间的天数
DATE_FORMAT()	用不一样的格式显示日期/时间

%Y-%m-%d %H-%i-%s 分别表示 年-月-日 时-分-秒(mysql中)
做为区分如下是java中的日期格式 
yyyy-MM-dd HH:mm:ss:SSS 分别表示:年-月-日 时-分-秒-毫秒

1.将字符串格式(char和vachar)转换为日期格式:str_to_date 
2.将日期格式转换为字符串格式:date_format

date_add(CURRENT_DATE(), interval -1 day) <![CDATA[ <= ]]> create_time	
DATE_ADD() 函数向日期添加指定的时间间隔。
DATE_ADD(date,INTERVAL expr type)  date 参数是合法的日期表达式。expr 参数是您但愿添加的时间间隔。
<![CDATA[ <= ]]>  : <=  sql 防止转义

查询本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) =DATE_FORMAT( CURDATE( ) , '%Y%m' ); 
或者
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) =DATE_FORMAT(  CURRENT_DATE(), '%Y%m' );
CURDATE( )和CURRENT_DATE()没有任何区别。

查询今日

SELECT COUNT(id) FROM s_job_description WHERE TO_DAYS(create_time) = TO_DAYS(NOW())

其余:java

今天

select * from 表名 where to_days(时间字段名) = to_days(now());

昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1

7天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)

近30天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )

上一月

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1

转换函数

CAST()类型转换

SELECT CAST(123.123 AS INT),运行结果会报错。
SELECT CAST(123.123 AS DECIMAL(8,2)),运行结果为 123.12。
select id,CAST(type AS CHAR)as type from table,将int类型字段type转换为char类型。

COALESCE()返回非空

SELECT COALESCE(null,1,2);  返回第一个非空值,运行结果为 1。
相关文章
相关标签/搜索