MySQL特有的SQL語句 第一彈

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

  首先MySQL裡面的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)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2142375/,如需轉載,請註明出處,否則將追究法律責任。

相關文章