mysql 常用函數範例詳解

菜鳥教程:

http://www.runoob.com/mysql/mysql-functions.html

 

IN  、NOT IN  、  EXISTS   、 NOT  EXISTS   

子關聯查詢數據

實際應用:過濾出在指定範圍內的數據

mysql 子關聯查詢之 EXISTS 和 NOT EXISTS(一)

mysql 子關聯查詢之 EXISTS 和 NOT EXISTS(二) 

 

CAST (expression AS data_type)

轉換數據類型

實際應用:需要排序的字段爲varchar,需要轉換數據類型

                 時間轉化,範圍搜索,也可用DATE_FORMAT(d,f)函數處理

CAST函數用於將某種數據類型的表達式顯式轉換爲另一種數據類型。CAST()函數的參數是一個表達式,它包括用AS關鍵字分隔的源值和目標數據類型。

expression:任何有效的SQServer表達式。
AS:用於分隔兩個參數,在AS之前的是要處理的數據,在AS之後是要轉換的數據類型。
data_type:目標系統所提供的數據類型,包括bigint和sql_variant,不能使用用戶定義的數據類型。

可以轉換的類型是有限制的。這個類型可以是以下值其中的一個:

  • 二進制,同帶binary前綴的效果 : BINARY    
  • 字符型,可帶參數 : CHAR()     
  • 日期 : DATE     
  • 時間: TIME     
  • 日期時間型 : DATETIME     
  • 浮點數 : DECIMAL      
  • 整數 : SIGNED
  • 無符號整數 : UNSIGNED 

cast 與convert的區別

 

範例:


#獲取當前日期

SELECT  CAST(NOW() AS DATE);

->2019-02-23

 

#將值轉換爲DATETIME類型

select CAST('2019-03-06 13:23:29' AS DATETIME);

->2019-03-06 13:23:29

 

#將值轉換爲TIME類型

SELECT CAST('08:30:30' AS TIME);

->08:30:30

 

#varchar 轉 SIGNED

SELECT CAST('6.66' AS SIGNED );
-> 6

 

#varchar 轉 DECIMAL

SELECT CAST('9.12345' AS DECIMAL );

->9

 

#varchar 轉 DECIMAL 

# 精度與小數位數分別爲5與2;精度是總的數字位數,包括小數點左邊和右邊位數的總和。而小數位數是小數點右邊的位數

SELECT CAST('9.12345' AS DECIMAL(5,2) );
->9.12 

 

 

 

 CAST  與  DATE_FORMAT 時間處理上的區別

 CAST比較方便一些,(可用   DATETIME  OR  DATE)

 CAST  :

SELECT
	login_code,
	last_login_date
FROM
	user
WHERE
	last_login_date <=  CAST('2019-02-01 14:38:39' AS DATETIME);

DATE_FORMAT  :

SELECT
	login_code,
	last_login_date
FROM
	user
WHERE
	last_login_date <=  DATE_FORMAT('2019-02-01 04:38:39','%y-%m-%d %H:%i:%S');

結果相同 :

login_code last_login_date
YT_admin 2019-01-31 14:38:39
lampoy02 2019-01-31 11:42:47

 

 

BETWEEN value1  AND  value2

SQL BETWEEN Condition將返回表達式value1value2(包括)範圍內的記錄

實際應用:數值區間、日期區間範圍搜索

對於SQL Server,PostgreSQL和SQLite:

SELECT *
FROM orders
WHERE order_date BETWEEN '2016/04/19' AND '2016/05/01';

對於Oracle(使用TO_DATE函數):

SELECT *
FROM orders
WHERE order_date BETWEEN TO_DATE ('2016/04/19', 'yyyy/mm/dd')
AND TO_DATE ('2016/05/01', 'yyyy/mm/dd');

對於MySQL和MariaDB(使用CAST函數):

SELECT *
FROM orders
WHERE order_date BETWEEN CAST('2016/04/19' AS DATE) AND CAST('2016/05/01' AS DATE);

 

 

IF(expr,v1,v2)

如果表達式 expr 成立,返回結果 v1;否則,返回結果 v2。

實際應用:樹的子節點判斷,true  or  false

SELECT IF(1 > 0,'正確','錯誤')    
->正確

 

IFNULL(v1,v2)

如果 v1 的值爲 NULL,則返回 v2,否則返回 v1。

SELECT IFNULL(null,'Hello Word')
->Hello Word

SELECT IFNULL(1,'Hello Word')
->1

SELECT IFNULL(1/0,'Hello Word')
->Hello Word

 

ISNULL(expression)

判斷表達式是否爲 NULL

實際應用:可與  IF(expr,v1,v2)  函數結合使用

SELECT ISNULL(NULL);
->1

SELECT ISNULL(' ');
->0

 

 

CASE

 CASE 表示函數開始,END 表示函數結束。如果 condition1 成立,則返回 result1, 如果 condition2 成立,則返回 result2,當全部不成立則返回 result,而當有一個成立之後,後面的就不執行了。

MySQL 的CASE WHEN 語句使用說明

Mysql查詢時case when語句的使用

  1. 第一種用法:case後面跟列名,when後面跟對應值

    CASE case_value
     WHEN when_value THEN statement_list
     [WHEN when_value THEN statement_list] ...
     [ELSE statement_list]
    END

    這種用法正好解決我們剛剛提出的問題,當sex值爲0時當前列顯示“男”,否則顯示“女”,sql寫法如下:

    SELECT
    	(
    	    CASE sex
    	    WHEN 0 THEN
    		    '男'
    	    ELSE
    		    '女'
    	    END
    	) AS 性別,
    	avg(score) AS 平均分
    FROM
    	grade
    GROUP BY
    	sex;
    +--------+-----------+
    | 性別   | 平均分    |
    +--------+-----------+
    | 男     |   67.2500 |
    | 女     |   89.5000 |
    +--------+-----------+
    2 rows in set (0.00 sec)
  2. 第二種用法:case後面空白,when後面跟着判斷條件

    CASE
     WHEN search_condition THEN statement_list
     [WHEN search_condition THEN statement_list] ...
     [ELSE statement_list]
    END

    針對於這種寫法,我們考慮這樣一種需求,學生成績是有評分的,大於等於90分的學生是A,小於90分大於等於60分的學生是B, 其餘的學生是C,現在要查詢評分爲A、B、C的學生成績的平均分分別是多少,因爲成績評分並不是單獨的一列,所以不能簡單的 使用 group by 來分組實現了,但是可以利用 case when 語句實現,寫起來也很簡單,看看下面的sql語句就知道了!

    SELECT
    	(
    		CASE
    		WHEN score >= 90 THEN
    			'A'
    		WHEN score < 60 THEN
    			'C'
    		ELSE
    			'B'
    		END
    	) AS 等級,
    	avg(score) AS 平均分
    FROM
    	grade
    GROUP BY
    	等級;
    +--------+-----------+
    | 等級   | 平均分    |
    +--------+-----------+
    | A      |   95.0000 |
    | B      |   74.8000 |
    | C      |   47.3333 |
    +--------+-----------+
    3 rows in set (0.00 sec)

 

 

CONCAT(s1,s2...sn)

字符串 s1,s2 等多個字符串合併爲一個字符

實際應用:SQL中地址的拼接(省,市,鄉)

SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedString;

 

 

 REPLACE(s,s1,s2)

將字符串 s2 替代字符串 s 中的字符串 s1

將字符串 abc 中的字符 a 替換爲字符 x:

SELECT REPLACE('abc','a','x') --xbc

 

 

GROUP_CONCAT([DISTINCT] 要連接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

能將相同的行組合起來

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

SELECT student_name,
         GROUP_CONCAT(test_score)
       FROM student
       GROUP BY student_name;

SELECT student_name,
         GROUP_CONCAT(DISTINCT test_score
                      ORDER BY test_score DESC SEPARATOR ' ')
       FROM student
       GROUP BY student_name;

在MySQL中,您可以獲得表達式組合的連接值。要消除重複值,請使用該 DISTINCT子句。要對結果中的值進行排序,請使用該ORDER BY子句。要按相反順序排序,請將DESC (descending)關鍵字添加到要在ORDER BY子句中排序的列的名稱中。默認爲升序; 這可以使用ASC關鍵字明確指定。組中值之間的默認分隔符是逗號(,)。要明確指定分隔符,請使用SEPARATOR後跟應在組值之間插入的字符串文字值。要完全消除分隔符,請指定 SEPARATOR ''

group_concat函數詳解

GROUP_CONCAT(expr)

 

DATEDIFF(d1,d2)

計算日期 d1->d2 之間相隔的天數

實際應用:計算日期差值

SELECT DATEDIFF('2019-02-24','2019-02-20')
-> 4

 

DATE_FORMAT(d,f)

按表達式 f的要求顯示日期 d

實際用途:時間格式化     OR     時間區間搜索

SELECT DATE_FORMAT('2019-02-26 22:30:45','%Y-%m-%d');
->2019-02-26

SELECT DATE_FORMAT('2019-02-26 22:30:45','%Y-%m-%d %H:%i:%S');
->2019-02-26 22:30:45

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章