第3章 SQL構文

テーブル操作

テーブルの作成や変更、削除などのテーブル操作を紹介します。とくにテーブルの作成は複雑な構文になっていますが、必要最低限の構文をおぼえるだけでも十分にテーブルを作成できますので、徐々にマスターしていくと良いでしょう。

CREATE TABLE構文

CREATE TABLEは、データベース内にテーブルを作成するための命令文です。テーブル作成時にフィールドのデータ型やプライマリキーの設定などを行うので、他の命令文と比べて構文が長くなりがちです。ただ、基本的にはテーブル名とフィールド名、それにフィールドとして設定するデータ型を設定するだけなので、構成はシンプルでおぼえやすいでしょう。

簡単なCREATE TABLEの構文は次のとおりです。

CREATE TABLE構文

CREATE TABLE テーブル名 ( フィールド定義, フィールド定義,
... )

CREATE TABLEの後にテーブル名を指定し、フィールドを定義していきます。フィールド定義とは、フィールド名やデータ型などの属性を指定することです。

簡単なCREATE TABLE構文の使用例
# id_c、fullname、sexのフィールドを持ったcustomerテーブルを作成します。
CREATE TABLE customer (
	id_c INT,
	fullname VARCHAR(40), 
	sex TINYINT
);

テーブル名に"customer"を指定し、id_c、fullnameといったフィールドを定義しています。id_cフィールドには、UNSIGNEDとNOT NULLという属性を追加しています。フィールド名を決める前に、すべて小文字で統一するか、単語の接続はアンダーライン( _ )を使うのか、ハイフン( - )を使うかなどを決めておくと良いでしょう。

標準SQL

CREATE TABLE構文は基本的な操作はほぼ同じですが、細部は各DBMS製品によって大きく仕様が異なります。ここではMySQLのCREATE TABLEをベースに説明していきますが、他のDBMSのことも考慮できるように、標準のSQLを確認しておきましょう。ここではSQL99の構文を紹介します。

SQL99の構文

CREATE {GLOBAL TEMPORARY or LOCAL TEMPORARY} TABLE テーブル名
    [ON COMMIT {PRESERVE ROWS or DELETE ROWS}
    フィールド名 データ型 属性 ,...
    or [LIKE テーブル名]
    or [table_constraint],...]

TEMPORARYは一時表を作成します。GLOBALを指定した場合は全てのユーザセッションから利用でき、LOCALを指定した場合はそれを作成したユーザセッションだけから利用できます。ON COMMIT PRESERVE ROWSは一時表に対するデータ変更を保存し、ON COMMIT DELETE ROWSは、COMMIT後に表の内容を全て消します。LIKE テーブル名オプションは、既存の表と同じ列定義と表制約を持つ新しい表を作成します。

CREATE TABLE構文

次は、MySQLのCREATE TABLE構文です。

CREATE [TEMPORARY]
TABLE [IF NOT EXISTS] テーブル名
    [(作成定義, ...)] [テーブルオプション] SELECT構文

キーワードの説明
TEMPORARY
TEMPORARY属性は、テンポラリテーブルを作成します。テンポラリテーブルは、コネクションごとに作成できるテーブルで、切断時に自動的に削除されます。
IF NOT EXISTS
IF NOT EXISTS属性は、テーブル名で指定したテーブルがすでに存在する場合、エラーを発生せずにテーブルの作成をキャンセルします。

[作成定義]、[テーブル定義]、[SELECT構文] などの太字の語句に関しては、下記を参照してください。

作成定義

作成定義では、フィールド名や属性などを定義します。

フィールド定義

フィールド名 データ型 [NOT NULL or NULL] [DEFAULT デフォルト値]
    [AUTO_INCREMENT] [UNIQUE [KEY] or [PRIMARY] KEY]
    [COMMENT '文字列'] [リファレンス定義]

NOT NULL
フィールドの値としてNULLを許可するかどうかを指定します。NOT NULLを指定しなければ、NULLは許可された設定になります。
INDEX、UNIQUE、PRIMARY KEYのいずれかを指定したフィールドは、NOT NULLを指定する必要があります。
DEFAULT
DEFAULT属性は、フィールドのデフォルト値を設定します。レコード登録時にフィールドの値が指定されていなかった場合、DEFAULT属性があれば自動的にデフォルト値が割り当てられます。
AUTO_INCREMENT -MySQL拡張
AUTO_INCREMENT属性は、新しいレコードの登録時に、自動的にAUTO_INCREMENT属性のあるフィールドの最大値+1を設定します。AUTO_INCREMENTを指定できるのは整数型のフィールドに対してだけです。AUTO_INCREMENTの値は1からはじまります。

自動インクリメントの定義は、各DBMS製品によって名称、仕様が違います。MySQLでは、AUTO_INCREMENTを使います。

※ 1つのテーブルには1つしかAUTO_INCREMENTフィールドを指定できません。

UNIQUE
UNIQUEを宣言したフィールドは、値の重複が禁止されます。重複する値を持ったレコードを挿入しようとした場合は、エラーが発生します。
[PRIMARY KEY]
PRIMARY KEY属性は、プライマリキーを設定します。プライマリキーとは、レコードを特定するためのユニークな値が保障されたフィールドのことです。プライマリキーはテーブルに対して1つの列だけで、その値は重複することなく、NULLも許可されません。このような条件を満たすことで、レコードを1行ずつ識別することが可能になります。
PRIMARY KEY ( )
PRIMARY KEYは複合プライマリキーにすることができます。複合プライマリキーは、この書式のみ設定可能で、上記の[PRIMARY KEY]書式では設定できません。
※プライマリキーが複数のフィールドから構成されている場合、それを強調したい際に複合プライマリキーと呼ぶことがあります。

先に定義したフィールドは、PRIMARYやUNIQUE、INDEXなどの制約を追加できます。

フィールド定義
    or [CONSTRAINT [シンボル]] PRIMARY KEY [インデックス型] (インデックスフィールド名,...)
[インデックスオプション ...]
    or {INDEX|KEY} [インデックス名] [インデックス型] (インデックスフィールド名,...)
[インデックスオプション ...]
    or [CONSTRAINT [シンボル]] UNIQUE [INDEX|KEY]
[インデックス名] [インデックス型] (インデックスフィールド名,...)
   
[インデックスオプション ...]
    or {FULLTEXT|SPATIAL} [INDEX|KEY] [インデックス名] (インデックスフィールド名,...)
[インデックスオプション ...]
    or [CONSTRAINT [シンボル]] FOREIGN_KEY [インデックス名] (インデックスフィールド名,...) [リファレンス定義]
    or CHECK (expr)

CONSTRAINT

インデックスと似ていますが、さらに外部キーも設定できます。

インデックスフィールド名

インデックスのフィールド名を指定します。

フィールド名 [(長さ)] [ASC or DESC]

インデックス型

BTREE、もしくはHASHのインデックス型を指定します。

USING {BTREE or HASH}

インデックスオプション

インデックスキーのブロックサイズや、インデックス型といったインデックスのオプションを指定します。

KEY_BLOCK_SIZE値
    or インデックス型
    or WITH PARSER parser_name

 

INDEX / KEY
INDEX属性は、インデックスを作成します。インデックスとは、レコードの索引のことで、データの検索速度を向上させるためのものです。 INDEXを指定したフィールドにはNOT NULLを指定する必要があります。
KEYはINDEXの同義語です。
FOREIGN KEY
CHECK
REFERENCES
互換性のためだけに用意されており、実際には何も行いません。
FULLTEXT-MySQL拡張
FULLTEXT属性は、フルテキスト検索用のインデックスを作成します。
CHAR、VARCHAR、TEXT型のみ作成する事ができます。

MyISAMストレージ エンジンだけがFULLTEXTインデックスをサポートします。

データ型

フィールドに指定できるデータ型は下記の通りです。

BIT[(長さ)]
    or TINYINT[(長さ)] [UNSIGNED] [ZEROFILL]
    or SMALLINT[(長さ)] [UNSIGNED] [ZEROFILL]
    or MEDIUMINT[(長さ)] [UNSIGNED] [ZEROFILL]
    or INT[(長さ)] [UNSIGNED] [ZEROFILL]
    or INTEGER[(長さ)] [UNSIGNED] [ZEROFILL]
    or BIGINT[(長さ)] [UNSIGNED] [ZEROFILL]
    or REAL[(長さ,小数点)] [UNSIGNED] [ZEROFILL]
    or DOUBLE[(長さ,小数点)] [UNSIGNED] [ZEROFILL]
    or FLOAT[(長さ,小数点)] [UNSIGNED] [ZEROFILL]
    or DECIMAL(長さ,小数点) [UNSIGNED] [ZEROFILL]
    or NUMERIC(長さ,小数点) [UNSIGNED] [ZEROFILL]
    or DATE
    or TIME
    or TIMESTAMP
    or DATETIME
    or YEAR
    or CHAR(長さ)
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or VARCHAR(長さ)
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or BINARY(長さ)
    or VARBINARY(長さ)
    or TINYBLOB
    or BLOB
    or MEDIUMBLOB
    or LONGBLOB
    or TINYTEXT [BINARY]
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or TEXT [BINARY]
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or MEDIUMTEXT [BINARY]
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or LONGTEXT [BINARY]
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or ENUM(値1,値2,値3,...)
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or SET(値1,値2,値3,...)
[CHARACTER SET キャラクタセット名] [COLLATE collation_name]
    or 特殊データ型

[BINARY]
バイナリ文字列を指定します。

リファレンス定義

リファレンス制約を設定します。

REFERENCES テーブル名 [(インデックスフィールド名,...)]
    [MATCH FULL or MATCH PARTIAL or MATCH SIMPLE]
    [ON DELETE リファレンスオプション]
    [ON UPDATE リファレンスオプション]

リファレンスオプション

RESTRICTやCSCADEといった参照操作を設定します。

リレーショナルを作成するには、参照元と参照側でデータ整合性が取れている必要があります。レコードが削除、更新される際にデータ整合性を維持するために5種類の参照操作が用意されています。

RESTRICT or CASCADE or SET NULL or NO ACTION

テーブルオプション

テーブルの設定を行います。たとえば、テーブルのストレージエンジンを指定したり、初期のAUTO_INCREMENT値、デフォルト文字セットなどが指定可能です。

[TABLESPACE テーブルスペース名 STORAGE DISK]
ENGINE [=] エンジン名
    or AUTO_INCREMENT [=] 値
    or AVG_ROW_LENGTH [=] 値
    or [DEFAULT] CHARACTER SET キャラクタセット名
    or CHECKSUM [=] {0 or 1}
    or COLLATE collation_name
    or COMMENT [=] '文字列'
    or CONNECTION [=] 'connect_文字列'
    or DATA DIRECTORY [=] 'absolute path to directory'
    or DELAY_KEY_WRITE [=] {0 or 1}
    or INDEX DIRECTORY [=] 'absolute path to directory'
    or INSERT_METHOD [=] { NO or FIRST or LAST }
    or KEY_BLOCK_SIZE [=] 値
    or MAX_ROWS [=] 値
    or MIN_ROWS [=] 値
    or PACK_KEYS [=] {0 or 1 or DEFAULT}
    or PASSWORD [=] '文字列'
    or ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
    or UNION [=] (テーブル名[,テーブル名]...)

AUTO_INCREMENT
AUTO_INCREMENTの初期値を指定します。
CHARACTER SET
テーブルのデフォルト文字セットを指定します。
COMMENT
フィールドに255文字までのコメントを設定します。SHOW CREATE TABLE、SHOW FULL COLUMNS構文で表示されます。

 

パーティションオプション

パーティションオプションは、テーブルの領域確保をコントロールします。

PARTITION BY
    [LINEAR] HASH(expr)
    or [LINEAR] KEY(フィールドリスト)
    or RANGE(expr)
    or LIST(expr)
[PARTITIONS num]
[SUBPARTITION BY
    [LINEAR] HASH(expr)
    or [LINEAR] KEY(フィールドリスト)
    [SUBPARTITIONS num]
]
[(パーティション定義 [, パーティション定義] ...)]

パーティション定義

パーティションの属性を設定します。

PARTITION パーティション名
    [VALUES {LESS THAN (expr) or MAXVALUE or IN (値リスト)}]
    [[STORAGE] ENGINE [=] エンジン名]
    [COMMENT [=] 'コメントテキスト' ]
    [DATA DIRECTORY [=] 'データのディレクトリ']
    [INDEX DIRECTORY [=] 'インデックスディレクトリ']
    [MAX_ROWS [=] max_number_of_rows]
    [MIN_ROWS [=] min_number_of_rows]
    [TABLESPACE [=] (tablespace_name)]
    [NODEGROUP [=] node_group_id]
    [(サブパーティション定義 [, サブパーティション定義] ...)]

サブパーティション定義

パーティションはSUBPARTITION BYでサブ・パーティションに分解する事ができます。サブパーティションは、パーティションと同じように機能します。

SUBPARTITION logical_name
    [[STORAGE] ENGINE [=] engine_name]
    [COMMENT [=] 'comment_text' ]
    [DATA DIRECTORY [=] 'data_dir']
    [INDEX DIRECTORY [=] 'index_dir']
    [MAX_ROWS [=] max_number_of_rows]
    [MIN_ROWS [=] min_number_of_rows]
    [TABLESPACE [=] (tablespace_name)]
    [NODEGROUP [=] node_group_id]

SELECT構文

CREATE TABLE構文の最後にSELECT構文を追加して、既存のテーブルをベースにして新しいテーブルを作成する事ができます。

[IGNORE or REPLACE] [AS] SELECT ... (Some legal select statement)

CREATE TABLEの使い方

テーブルを作成する際の手順は、CREATE TABLEに続き、作成するテーブル名を指定します。次に、カッコ内にフィールドの定義を列挙していきます。フィールドの定義はフィールド名とデータ型、それに制約などを必要なだけ宣言します。

CREATE TABLE構文の使用例
# テーブルの作成
CREATE TABLE customer (
	# 作成定義と制約
	id_c INT UNSIGNED NOT NULL AUTO_INCREMENT,
	fullname VARCHAR(40) NOT NULL, 
	age TINYINT UNSIGNED NOT NULL ,
	sex TINYINT UNSIGNED NOT NULL,
	email VARCHAR(50), 

	# 制約
	PRIMARY KEY (id_c)
);

# テーブルのコピー
CREATE TABLE note AS
	SELECT id_c, fullname FROM customer;

フィールド名とデータ型の宣言は必須ですが、デフォルト値やフィールドの制約は省略可能です。idフィールドはプライマリキーですので、NOT NULL で NULL値を拒否するように制約しています。また、AUTO_INCREMENTで、自動的に数値が割り当てられるように設定しています。
制約の行で、プライマリキーとインデックスを設定しています。


ALTER TABLE構文

ALTER TABLEは、テーブルの構造を変更するための構文です。例えば、フィールドの追加や削除、インデックスの作成や削除、既存のフィールド属性の変更、フィールド名やテーブル名の変更などの機能が用意されています。
ALTER TABLEは、CREATE TABLEと同じく複雑な構文となっていますが、シンプルに使うこともできます。

ALTER TABLE構文

ALTER [IGNORE] TABLE テーブル名 [詳細定義 , 詳細定義
...]

キーワードの説明
IGNORE -MySQL拡張
ユニークキーの重複があった行に対し、最初のレコードだけを使用し、他を削除します。
IGNOREが指定されない場合はエラーが発生し、ロールバックされます。

ロールバックとは
ロールバックとは、データ更新などで障害が起こったときに、記録してあるチェックポイントまでデータを戻し、改めて処理を開始することです。

ALTER TABLE構文の属性の多くは、CREATE TABLE構文と似ています。それらの詳細については、「CREATE TABLE構文」 をご参照ください。

詳細定義

  ADD [COLUMN] 作成定義 [FIRST
or AFTER フィールド名 ]
      or ADD [COLUMN] (作成定義,
作成定義, ...)
      or ADD INDEX [インデックス名] (インデックスフィールド名, ...)
      or ADD PRIMARY KEY (インデックスフィールド名,...)
      or ADD UNIQUE [インデックス名] (インデックスフィールド名, ...)
      or ADD FULLTEXT [インデックス名] (インデックスフィールド名, ...)
      or ADD [CONSTRAINT シンボル] FOREIGN KEY インデックス名
(インデックスフィールド名, ...) [リファレンス定義]
      or ALTER [COLUMN] フィールド名 {SET DEFAULT リテラル or DROP
DEFAULT}
      or CHANGE [COLUMN] 変更前フィールド名
作成定義
[FIRST
or AFTER 変更後フィールド名]
      or MODIFY [COLUMN] 作成定義
[FIRST or AFTER
フィールド名]
      or DROP [COLUMN] フィールド名
      or DROP PRIMARY KEY
      or DROP INDEX インデックス名
      or DISABLE KEYS
      or ENABLE KEYS
      or RENAME [TO] テーブル名
      or CHARACTER SET キャラクタセット名 [COLLATE collation_name]
      or ORDER BY フィールド名
      or テーブルオプション

テーブルオプション

テーブルオプション ...
or ADD [COLUMN] フィールド定義 [FIRST or AFTER フィールド名 ]
or ADD [COLUMN] (フィールド定義,...)
or ADD {INDEX|KEY} [インデックス名] [インデックス型] (インデックスフィールド名,...)
or ADD [CONSTRAINT [symbol]]
    PRIMARY KEY [インデックス型] (インデックスフィールド名,...)
or ADD [CONSTRAINT [symbol]]
    UNIQUE [INDEX|KEY] [インデックス名] [インデックス型] (インデックスフィールド名,...)
or ADD FULLTEXT [INDEX|KEY] [インデックス名] (インデックスフィールド名,...)
    [WITH PARSER parser_name]
or ADD SPATIAL [INDEX|KEY] [インデックス名] (インデックスフィールド名,...)
or ADD [CONSTRAINT [symbol]]
    FOREIGN KEY [インデックス名] (インデックスフィールド名,...)
    [リファレンス定義]
or ALTER [COLUMN] フィールド名 {SET DEFAULT literal or DROP DEFAULT}
or CHANGE [COLUMN] old_フィールド名 フィールド定義
    [FIRST|AFTER フィールド名]
or MODIFY [COLUMN] フィールド定義 [FIRST or AFTER フィールド名]
or DROP [COLUMN] フィールド名
or DROP PRIMARY KEY
or DROP {INDEX|KEY} インデックス名
or DROP FOREIGN KEY fk_symbol
or DISABLE KEYS
or ENABLE KEYS
or RENAME [TO] 新しいテーブル名
or ORDER BY フィールド名 [, フィールド名] ...
or CONVERT TO CHARACTER SET キャラクタセット名 [COLLATE collation_name]
or [DEFAULT] CHARACTER SET キャラクタセット名 [COLLATE collation_name]
or DISCARD TABLESPACE
or IMPORT TABLESPACE
or PARTITION BY パーティション・オプション
or ADD PARTITION (パーティション定義)
or DROP PARTITION パーティション名
or COALESCE PARTITION number
or REORGANIZE PARTITION パーティション名 INTO (パーティション定義)
or ANALYZE PARTITION パーティション名
or CHECK PARTITION パーティション名
or OPTIMIZE PARTITION パーティション名
or REBUILD PARTITION パーティション名
or REPAIR PARTITION パーティション名
or REMOVE PARTITIONING

インデックスフィールド名:

フィールド名 [(長さ)] [ASC or DESC]

インデックス型:

USING {BTREE or HASH}

キーワードの説明
[テーブルオプション]
[テーブルオプション]はCREATE TABLEで利用する事ができるENGINE、AUTO_INCREMENT、AVG_ROW_LENGTHといったテーブルオプションを意味します。

下記のクエリは、ALTER TABLEでAUTO_INCREMENTのカウンターを初期化しています。

ALTER TABLE t1 AUTO_INCREMENT = 0;

IGNORE
-MySQL拡張
IGNOREは、新しいテーブルのユニークキーに複製があった場合でも、エラーを発生せずに、ユニークキーに複製された最初のレコードだけを使い、それ以外のレコードを削除します。不正な値は、適合する許容値に一番近い値まで切り捨てられます。
ADD
ADDは、新しいフィールドを追加します。
FIRST、または AFTERを指定することで、テーブルの指定した位置にフィールドを追加することができます。

ALTER TABLE テーブル名 ADD フィールド名A VARCHAR(20)
AFTER フィールド名B;
AFTER
FIRST
FIRST、AFTERは、テーブルの指定した位置に、フィールドを追加することができます。FIRSTが指定したフィールドの前、AFTERが指定したフィールドの後に新しいフィールドを挿入します。デフォルトでは、フィールドはテーブルの最後に追加されます。
CHANGE
-MySQL拡張
フィールドの名前を変更します。

次は、現在のフィールド名から新しいフィールド名に変更し、新しいデータ型を指定する方法です。

ALTER TABLE テーブル名 CHANGE 元のフィールド名 新しいフィールド名 INTEGER;

データ型だけを変更したい場合はMODIFYを使ってください。

MODIFY
-Oracle拡張
フィールドのデータ型のみを変更します。

ALTER
TABLE テーブル名
MODIFY フィールド名
    TINYINT NOT NULL
;
DROP
-MySQL拡張
フィールドを削除します。

ALTER TABLE テーブル名 DROP フィールド名;
ORDER BY
ORDER BYは、指定した順にフィールドを並び替えて新しいテーブルを生成することができます。このオプションは、毎回同じ順番でレコードのクエリを行う場合に有用です。

※挿入と削除の後にはこの順序は保持されません。テーブルに大きな変更をした後にこのキーワードを使用することで、より高い性能を得ることができます

DROP INDEX
-MySQL拡張
インデックスを削除します。インデックス元の全てのフィールドが削除されると、そのインデックスも削除されます。

ALTER TABLE テーブル名 DROP INDEX フィールド名;
DROP PRIMARY KEY
プライマリ・インデックスを削除します。もしプライマリ・インデックスが存在しなければ、そのテーブルの最初のUNIQUE インデックスが削除されます。

ALTER TABLE テーブル名 DROP PRIMARY KEY;
DISABLE KYES -MySQL拡張
ENABLE KEYS -MySQL拡張
ALTER TABLE ... DISABLE KEYSによって、MyISAMテーブルの非ユニークなインデックスの更新を停止します。 その後、ALTER TABLE ... ENABLE KEYSによって、欠落しているインデックスを再作成できます。MySQLでは、キーを無効化することにより、大量の挿入の際の処理速度が大幅に迅速化されます。
FOREIGN KEY
REFERENCES
InnoDBストレージエンジンにサポートされています。

ALTER TABLEの使用例

ALTER TABLEをテストするために、テスト用のテーブルt1を作成します。

CREATE TABLE t1 (a INTEGER, b CHAR(10));

フィールド名aのデータ型と属性をINTEGERからTINYINT NOT NULLに変更します。

ALTER TABLE t1 MODIFY a TINYINT NOT NULL;

フィールド名aのフィールド名をaからbに変更します。

ALTER TABLE t1 CHANGE a b TINYINT NOT NULL;

TIMESTAMP型のフィールドをcという名称で追加します。

ALTER TABLE t1 ADD c TIMESTAMP;

フィールド名aにインデックスを追加します。

ALTER TABLE t1 ADD INDEX (a);

フィールド名cを削除します。

ALTER TABLE t1 DROP c;

フィールド名cをAUTO_INCREMENT属性つきで追加します。

ALTER TABLE t1 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (c);

テーブル名t1をt2に変更します。

ALTER TABLE t1 RENAME t2;

OPTIMIZE TABLE構文

OPTIMIZE TABLE構文

OPTIMIZE TABLE テーブル名

OPTIMIZE TABLEは、テーブルの最適化を行います。レコードの大部分を削除したり、VARCHAR、BLOB、TEXTフィールドなどの可変長行となっているテーブルに多くの変更を加えたりした場合などに
OPTIMIZE TEABLE処理を行うと良いでしょう。


DROP TABLE構文

テーブルを削除するには、DROP TABLEを使います。テーブルのデータも削除されるので、注意してください。

DROP TABLE構文

DROP TABLE [IF EXISTS] テーブル名 [, テーブル名,...]

DROP TABLE構文の使用例
# customer テーブルを削除
DROP TABLE customer;
キーワードの説明
IF EXISTS
-MySQL 拡張
データベースが存在しないことに関するするエラーを防ぎます。
IF EXISTSを指定せずに、存在しないデータベース名を指定した場合は、エラーが発生します。

関連記事