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。
相關文章
相關標籤/搜索