程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL的一些小技巧(持續更新)

MySQL的一些小技巧(持續更新)

編輯:MySQL綜合教程

1.巧用RAND()提取隨機行

在MySQL中,產生隨機數的方法是RAND()函數,可以利用這個函數與ORDER BY子句一起完成隨機抽取某些行的功能。它的原理其實就是ORDER BY RAND()能夠把數據隨機排序。

2.利用GROUP BY的WITH ROLLUP子句做統計

在SQL語句中,使用GROUP BY的WITH ROLLUP子句可以檢索出更多的分組聚合信息。它不僅能像一般的GROUP BY語句那樣檢索出各組的聚合信息,還能檢索出本組類整體聚合信息。當使用ROLLUP時,不能同時使用ORDER BY子句進行結果排序,因為它們兩者是互相排斥的。 WITH ROLLUP反映的是一個OLAP思想,也就是說這一個GROUP BY語句執行完成後可以滿足用戶想要得到的任何一個分組以及分組組合的聚合信息值。

3.MySQL中的一些函數

CONCAT(str1,str2,...) 返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。
mysql> SELECT CONCAT('My', 'S', 'QL');
        -> 'MySQL'

mysql> SELECT CONCAT('My', NULL, 'QL');
        -> NULL

mysql> SELECT CONCAT(14.3);
        -> '14.3'

group_concat函數,將取得的值用逗號連接。
select group_concat(id) from table_name;
得到的結果是(1,2,3,4,5)
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END 在第一個方案的返回結果中, value=compare-value。而第二個方案的返回結果是第一種情況的真實結果。如果沒有匹配的結果值,則返回結果為ELSE後的結果,如果沒有ELSE 部分,則返回值為 NULL。
IF(expr1,expr2,expr3)函數如果expr1為True,則返回expr2,否則返回expr3。 expr1 作為一個整數值進行計算,就是說,假如你正在驗證浮點值或字符串值, 那麼應該使用比較運算進行檢驗。
mysql> SELECT IF(1>2,2,3);
        -> 3

mysql> SELECT IF(1<2,'yes ','no');
        -> 'yes'

mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
        -> 'no'

IFNULL(expr1,expr2) 假如expr1 不為 NULL,則 IFNULL() 的返回值為 expr1; 否則其返回值為 expr2。IFNULL()的返回值是數字或是字符串,具體情況取決於其所使用的語境。
mysql> SELECT IFNULL(1,0);
        -> 1

mysql> SELECT IFNULL(NULL,10);
        -> 10

mysql> SELECT IFNULL(1/0,10);
        -> 10

mysql> SELECT IFNULL(1/0,'yes');
        -> 'yes'

NULLIF(expr1,expr2) 如果expr1 = expr2 成立,那麼返回值為NULL,否則返回值為 expr1。這和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。
mysql> SELECT NULLIF(1,1);
        -> NULL

mysql> SELECT NULLIF(1,2);
        -> 1

coalesce函數,返回參數中第一個不為空的值
select coalesce(a,b,c) from table_name;
如果a不為null,則選擇a;如果a為null ,則選擇b;如果b為null,則選擇c;如果a、b、c都為null,則返回null。
GREATEST(value1,value2,...) 當有2或多個參數時,返回值為最大(最大值的)參數。比較參數所依據的規律同LEAST()相同。
mysql> SELECT GREATEST(2,0);
        -> 2

mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
        -> 767.0

mysql> SELECT GREATEST('B','A','C');
        -> 'C'

UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) 若無參數調用,則返回一個Unix timestamp ('1970-01-01 00:00:00' GMT 之後的秒數) 作為無符號整數。若用date 來調用UNIX_TIMESTAMP(),它會將參數值以'1970-01-01 00:00:00' GMT後的秒數的形式返回。date 可以是一個DATE 字符串、一個 DATETIME字符串、一個 TIMESTAMP或一個當地時間的YYMMDD 或YYYMMDD格式的數字。
mysql> SELECT UNIX_TIMESTAMP();
        -> 882226357

mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
        -> 875996580

TO_DAYS(date) 給定一個日期date, 返回一個天數 (從年份0開始的天數 )。
mysql> SELECT TO_DAYS(950501);
        -> 728779

mysql> SELECT TO_DAYS('1997-10-07');
        -> 729669

MD5(str),返回字符串str的MD5值。常用於對應用中的數據進行加密。 select MD5('123456')
INET_ATON(IP地址),返回IP地址的網絡字節序表示 INET_NTOA(num),返回網絡字節序代碼的ip地址。

4.刪除表中的重復數據

在需要給表中某些字段加唯一索引時,而字段中又存在需要重復清理數據的問題,不少DBA都應該遇到過。一般在處理時總是想在數據庫中只保留一條,其他的刪除,但是這樣的SQL寫出來總是效率不高,怎麼辦?其實可以轉換思路,把重復的都選出一條出來,存到一張臨時表,然後刪除原表中所有存在重復的,再把臨時表的數據庫全部插入原庫,這是比較通用並且高效的做法。

5.大量數據導入MySQL數據庫加快速度

對於MyISAM存儲引擎的表,可以通過以下方式快速的導入大量的數據。
ALTER TABLE tbl_name DISABLE KEYS;
loading the data
ALTER TABLE tbl_name ENABLE KEYS;
DISABLE KEYS和ENABLE KEYS用來打開或者關閉MyISAM表非唯一索引的更新。
InnoDB因為主鍵聚集索引的關系,如果沒有主鍵或者主鍵非序列的情況下,導入會越來越慢,如何快速的遷移數據到InnoDB?借助MyISAM的力量是很靠譜的。先關閉InnoDB的Buffer Pool,把內存空出來,建一張沒有任何索引的MyISAM表,然後只管插入吧,concurrent_insert=2,在文件末尾並發插入。插入完成後,ALTER TABLE把索引加上,記得還有ENGINE=InnoDB,就把MyISAM轉到InnoDB了,這樣的速度遠比直接往InnoDB裡插亂序數據來得快。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved