MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでプリペアドステートメントとして準備できるSQLステートメントの種類とは?

実は、すべてのSQLステートメントをプリペアドステートメント(PREPARE文)として準備できるわけではありません。MySQLでは、以下に挙げる種類のSQLステートメントのみがプリペアドステートメントとして利用できます。

SELECTステートメント

データを検索・取得するためのSELECT文は、最も代表的なプリペアドステートメントの対象です。プレースホルダー「?」を使って条件値を動的に渡せるのが特徴です。

実行例

mysql> PREPARE stmt FROM 'SELECT tender_value from Tender WHERE Companyname = ?';
Query OK, 0 rows affected (0.09 sec)
Statement prepared

mysql> SET @A = 'Singla Group.';
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE stmt using @A;
+--------------+
| tender_value |
+--------------+
|   220.255997 |
+--------------+
1 row in set (0.07 sec)

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)

INSERT・REPLACE・UPDATE・DELETEステートメント

テーブル内のデータを変更するDML(データ操作言語)ステートメントも、プリペアドステートメントとして準備できます。なお、EXECUTE時にUSING句でパラメータを渡す必要がある点に注意しましょう。パラメータを指定せずに実行するとエラーになります。

実行例

mysql> PREPARE stmt1 FROM 'DELETE from Tender WHERE Sr = ?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> SET @A = 4;
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE stmt1;
ERROR 1210 (HY000): Unknown error 1210

mysql> EXECUTE stmt1 using @A;
Query OK, 1 row affected (0.08 sec)

mysql> DEALLOCATE PREPARE stmt1;
Query OK, 0 rows affected (0.00 sec)

mysql> Select * from tender;
+----+---------------+--------------+
| Sr | CompanyName   | Tender_value |
+----+---------------+--------------+
|  1 | Abc Corp.     |   250.369003 |
|  2 | Khaitan Corp. |   265.588989 |
|  3 | Singla group. |   220.255997 |
+----+---------------+--------------+
3 rows in set (0.00 sec)

上記の例では、パラメータを渡さずにEXECUTEした場合にエラー(ERROR 1210)が発生し、「using @A」のようにパラメータを渡すことで正常にDELETE処理が完了していることが分かります。

CREATE TABLEステートメント

テーブルを作成するDDL(データ定義言語)の一つであるCREATE TABLE文も、プリペアドステートメントとして実行できます。

実行例

mysql> PREPARE stmt3 FROM 'CREATE TABLE Student(Id INT, Name Varchar(20))';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE stmt3;
Query OK, 0 rows affected (0.73 sec)

mysql> DEALLOCATE PREPARE stmt3;
Query OK, 0 rows affected (0.00 sec)

SET・DOおよび多くのSHOWステートメント

変数を設定するSET文、式を評価するDO文、さらにSHOW TABLESなど多くのSHOW系ステートメントも対象です。

実行例

mysql> PREPARE stmt10 FROM 'SHOW TABLES';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE stmt10;
+-------------------+
| Tables_in_query   |
+-------------------+
| emp               |
| emp123            |
| emp_t             |
| examination_btech |
| new_number        |
| student           |
| student_detail    |
| student_info      |
| tender            |
| website           |
+-------------------+
10 rows in set (0.00 sec)

まとめ

MySQLのプリペアドステートメントで利用できるのは、主に以下のステートメントです。

  • SELECTステートメント
  • INSERT・REPLACE・UPDATE・DELETEなどのデータ操作ステートメント
  • CREATE TABLEステートメント
  • SET・DOおよび多くのSHOWステートメント

これら以外のステートメントはPREPARE文で準備できないため、用途に応じて通常のSQL実行を使い分けることが重要です。また、使い終わったプリペアドステートメントはDEALLOCATE PREPARE文で解放するのが良い習慣です。

  1. MySQL Workbenchの列フラグ(PK・NN・AIなど)の意味を徹底解説

    MySQL Workbenchでは、テーブルの列(カラム)に対してさまざまな「列フラグ」を設定することで、データの整合性を保つことができます。テーブルデザイナーで各カラムのチェックボックスに表示されるこれらのフラグは、それぞれ以下のような意味を持っています。PK - Primary Key(主キー)NN - NOT NULL(NULL値不可)BIN - Binary(バイナリ)UN - Unsigned(符号なし)UQ - Unique(一意制約)ZF - Zero Filled(ゼロ埋め)G - Generated Column(生成列)AI - Auto Increment(自動採番)それ

  2. MySQLのSELECTステートメントでカンマを使える?CROSS JOINとの関係を解説

    MySQLのSELECTステートメント間にカンマは使用できますか?はい、使用できます。FROM句でテーブル名をカンマ(,)で区切って指定すると、複数のテーブルを組み合わせて照会することが可能です。構文は以下の2通りがあります。構文1:select * from テーブル名1,テーブル名2; 構文2:select * from テーブル名1 cross join テーブル名2;この2つの構文は、まったく同じ結果を返します。つまり、カンマ区切りによるテーブル指定は CROSS JOIN(交叉結合)と完全に同等です。両者とも、各テーブルのすべての行を組み合わせた「直積(デカルト積)」を求める操作にな