MySQLの構文をマニュアルでしっかり確認してみよう

この記事は、2015年「MySQLマニュアルを読む」アドベントカレンダーの10日目です.


 RDBMSを使った開発を行っている最中に、もっともよく書いたり調べたりするのがSQL文でしょう。私自身もそうですが、たいがい、必要になったときにピンポイントで調べて、またすぐ忘れる、という事が多いです。
マニュアルには当然、各SQLの構文がしっかりと書かれていますから、機会あるときに一度、眺めてみると新たな発見があるかもしれません。普段使っているシンプルな構文以外にも、もっともっとたくさんのオプション句があることに、きっとびっくりすることでしょう。


 SQLの構文については、13章 SQL Statement Syntax にまとまっています。
http://dev.mysql.com/doc/refman/5.7/en/sql-syntax.html


 最低でも、DDLDML は押さえておくと良さそうです。



 ちょっとばかり、DDLの部分を眺めてみました。機能ごとに CREATE/ALTER/DROP が分かれているので並び替えてみると以下のようになります。

13.1.8 CREATE DATABASE     13.1.1 ALTER DATABASE     13.1.18 DROP DATABASE 
13.1.9 CREATE EVENT        13.1.2 ALTER EVENT        13.1.19 DROP EVENT 
13.1.10 CREATE FUNCTION    13.1.3 ALTER FUNCTION     13.1.20 DROP FUNCTION 
13.1.11 CREATE INDEX                                 13.1.21 DROP INDEX 
13.1.12 CREATE PROCEDURE   13.1.4 ALTER PROCEDURE    13.1.22 DROP PROCEDURE 
    and CREATE FUNCTION                                  and DROP FUNCTION 
13.1.13 CREATE SERVER      13.1.5 ALTER SERVER       13.1.23 DROP SERVER 
13.1.14 CREATE TABLE       13.1.6 ALTER TABLE        13.1.24 DROP TABLE  
13.1.15 CREATE TABLESPACE                            13.1.25 DROP TABLESPACE 
13.1.16 CREATE TRIGGER                               13.1.26 DROP TRIGGER 
13.1.17 CREATE VIEW        13.1.7 ALTER VIEW         13.1.27 DROP VIEW 

13.1.28 RENAME TABLE       13.1.29 TRUNCATE TABLE 


 面白いなぁと思うのは、
・INDEX 操作には ALTER がない
・PROCEDURE/FUNCTION の操作で、CREATE/DROP には PROCEDUREもFUNCTIONも指定できるのに、ALTERには PROCEDURE しかなさげ
・TABLESPACE/TRIGGERにも、ALTERはない。*1
・TABLE 操作には、RENAME だったり TRUNCATE だったりの命令もある。


 余談ですが、TRUNCATEをDDLだと思っていない人に時々出会います。操作の目的としては「データを消したい」シーンで使うので、DELETEと同類というのは感覚としてわかります。
 バージョンによって大きく変わる部分でもないので、読みやすい日本語マニュアルのほうを見てみましょう。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.33 TRUNCATE TABLE 構文
これを見ると、DROP権限が必要であること、ロールバックできないこと、トリガも起動されないことが書かれています。よく見ると、英語版(5.6、5.7とも)には、日本語版よりもう少し情報が加えられていますね。歴史上ちょっと問題を含む時期があったっぽい(よく読み取れない。誰か解説してください)。

*1:そういやそもそも私、TABLESPACEの考え方分かっていないから、このあたりも押さえておきたいですね