1. 程式人生 > 其它 >MySQL特有的SQL語句 第一彈

MySQL特有的SQL語句 第一彈

關於SQL,我們總是會有無窮無盡相關的話題,有時候碰到了一些覺得不錯的SQL功能會標記下來,好記性不爛爛筆頭,回頭來看,自己也收集了不少的點子,但是從整體來看,可能僅僅是一瓢水而已。大家有好的想法也歡迎留言,一起總結完善一下。

首先MySQL裡面的SQL標準可以參考下面的表格,我們今天想總結的是MySQL特有的SQL語句。

我們可以化繁為簡,把所有的SQL都按照增刪改查的四個維度來對待,只是有些語法的含義更廣一些,比如增,建立表我們也算增的範疇,改,修改欄位也算是改的範疇。

create語句

如果要複製表結構資訊,下面的語句真是簡潔有力,會把表test1的結構複製出來。

create table test like test1;

select into語句

select into語句可以很快的從表裡取出資料,快速構造出一個表來。

SELECT vale1, value2 into Table2 from Table1 這裡會要求目標表Table2不存在,因為在插入時會自動建立表Table2

insert語句中的表示式

MySQL裡的insert語句還是很豐富的。比如下面的動態值,設定表示式的方式,MySQL就有自己的口味。

INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

--ok INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

--wrong

insert語句

MySQL支援的特有的insert語句,下面的第一種是mysqldump匯出的語句格式,這種方式比較清晰,相比多條SQL語句效果要好太多。

INSERT INTO table (a, b, c) VALUES (1,2,3) ,(2,3,4);

下面的語句看起來比較特別,解析MySQL binlog會發現,裡面的insert語句是這個樣子的。

INSERT INTO table SET a=1, b=2, c=3;

drop語句

MySQL裡面的drop語句還是蠻有特點,它不會像Oracle那樣可以單獨刪除索引,刪除是始終要和表關聯起來,這樣想來和IOT的特點還是蠻對味的。

如果你直接刪除一個索引,就會丟擲如下的錯誤。

•Drop index ind_account_id2;

•ERROR 1064 (42000):

可以使用如下的方式:

drop index ind_account_id2 on t_user_login_record;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

或者是用比較經典的寫法:

alter table t_user_login_record drop index account;

級聯刪除

MySQL裡面支援級聯刪除,下面的語句會級聯刪除資料,這一點Oracle目前還是不支援這種方式的。

delete A, B from A, B where A.id = B.aid

級聯更新

update A, B set A.a = a1, B.b = b1 where A.id = B.aid

change modify

change,modify用法有些相似,但是細究起來還是有自己適合的使用場景,比如與修改欄位b的型別或者屬性,change還更適合於修改欄位名稱,修改資料型別modify更加直接一些。

ALTER TABLE t1 CHANGE b b BIGINT NOT NULL; ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

replace語句

MySQL裡面的replace語句還是很有特色的,和Oracle裡面的merge有一拼,它支援兩種模式,資料值和子查詢的方式

replace into x values(...)

或者

replace into x select * from y

renmae語句

這個功能很可能被大家忽略,但是實際上這個功能很實用,比如要把一個表清理表,如果你把它歸檔到一個歷史資料庫中而暫時不清理資料,這種方式就很快捷。

rename table testsync.t_fund_info to test.t_user_login_record;

Query OK, 0 rows affected (0.05 sec)

limit語法

limit的使用算是MySQL中很經典的使用方法了,它也支援多種模式。

比如只返回第2條結果

select * from x

limit 2

返回第2條到第12條的結果

or limit 2, 10

order by的妙用

如果下面的資料需要排序,

select *from test order by name; +------+------+ | id | name | +------+------+ | 1 | aa1 | | 3 | aa10 | | 4 | aa11 | | 2 | aa2 | +------+------+ 我們希望是按照aa1,aa2,aa10,aa11的順序來顯示,直接這樣寫就可以了。

select *from test order by name+0; +------+------+ | id | name | +------+------+ | 1 | aa1 | | 2 | aa2 | | 3 | aa10 | | 4 | aa11 | +------+------+

特有的函式

如果需要擷取一下字串,比如截取出數字,就有很多種實現方式。

比如下面的方式就可行。

mysql> select replace('123456G', right('123456G',1), '');

+--------------------------------------------+
| replace('123456G', right('123456G',1), '') |
|+-------------------------------------------+
| 123456                                     |
|+-------------------------------------------+

或者是使用cast來過濾

> select cast('123124aabc' as unsigned); 
+--------------------------------+
| cast('123124aabc' as unsigned) |
+--------------------------------+
|                         123124 |
+--------------------------------+
1 row in set, 1 warning (0.01 sec)