2014年9月28日日曜日

SQL文におけるデータベースやフィールドを指定する識別子 (mySQL)

ダブル・クォーテーション(")、シングル・クォーテーション(')、バッククォート/バックティック(`)の使い方を一度整理してみます。

基本的にSQLの構文はどのデータベースでも同じでしょうが、下記リンクなどを読む限りではデータベースソフトごとに微妙に仕様が違うと思われます。

ここではMySQL 5.4/PHPMyAdmin4.1.12で確認しています。

違うデータベースソフトを使っている場合には、それぞれのデータベースソフトのマニュアルを参照するのが一番確実でしょう。
http://pear.php.net/manual/ja/package.database.mdb2.intro-quote.php

ここでも最後にmySQLの参考ページを紹介します。

「顧客データ」というデータベースで「名前」というフィールドに「鈴木」という文字列を含むレコードを抽出するクエリ文は次のようになります。

ここで%はSQLのWHERE句におけるLIKE演算子におけるワイルドカードです。


SELECT * FROM `顧客データ` WHERE `名前` like '%鈴木%'


私もごちゃごちゃになっていたのですが、データベース名とフィールド名はバックティック(`)で引用し、指定してあげる必要があります。


実はバックティック(`)がなくてもSQL文は上記の環境ではエラーなしに実行されます。なんと下記パターンマッチングの項、マニュアルでも識別子の引用符はなしです。

しかし、マニュアルの他のページやPHPMyAdmin4.1.12のSQLでSELECTボタンからデフォルトのSELECT文を呼び出した場合にデータベース名はバックティック(`)で囲まれてきます。私はこれで覚えようと思います。

同様に例えば図のColumnの欄からフィールド名を選んでSQL文に追加できるようになっていますが、この時にフィールド名はバックティック(`)で囲まれます。



さて値ですが、これはバックティック(`)では動作しません。ダブル・クォーテーション(")、シングル・クォーテーション(')あるいは状況によっては引用符なしだと動作します。

先に述べたとおり、正確にはマニュアルに当たる必要があり、参考となりそうなページを紹介します。


1.3.4.7. パターンマッチング
http://dev.mysql.com/doc/refman/5.1-olh/ja/pattern-matching.html



識別子引用符文字は(‘`’)バッククォートです。

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

ANSI_QUOTES
モードでMySQLを実行する場合は、識別子を囲む引用符として二重引用符も使用できます。
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax. (...)
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

注:ANSI_QUOTESモードは二重引用符を用いた文字列を識別子として解釈するため、このモードが実行されているとき文字列リテラルは一重引用符で囲まなければいけません。二重引用符は使用できません。
 


 1.3.4.7. パターンマッチング

MySQL では、標準の SQL パターンマッチングに加え、vi、grep、sed などの Unix ユーティリティーで使用されるものに似た拡張正規表現に基づくパターンマッチング形式が提供されています。

SQL パターンマッチングでは、「_」は任意の 1 文字に一致し、「%」は任意の数の文字 (0 個の文字も含む) に一致します。MySQL のデフォルトでは、SQL パターンでは大文字と小文字が区別されません。次にいくつかの例を示します。SQL パターンを使用するときは、= や <> は使用せず、代わりに LIKE または NOT LIKE 比較演算子を使用します。

「b」で始まる名前を探すには、次のクエリーを使用します。

mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

「fy」で終わる名前を探すには、次のクエリーを使用します。

mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

「w」を含む名前を探すには、次のクエリーを使用します。

mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+
 


0 件のコメント:

コメントを投稿