基本的なSQLを使いこなす | [連載]PHPでデータベース(PDO) 第4回

基本的なSQL IT技術
基本的なSQL

このシリーズはPHPでデータベースを扱いたいと考えている方を対象とした記事となっています。

PHPからPDOを使用してデータベースを扱う方法について紹介をしていっていますが、今回は少しPHPのプログラムから逸れて、データベースの問い合わせに使うSQLについて、基本的な部分だけ簡単に紹介しています。

せっかくPHPからデータベースを扱える環境やプログラムが準備できても、実際にデータベースに対して発行するSQLを作ることができないと、結局何も実現できないことになってしまうためです。

直ぐに使えるSQLだけに絞って紹介していますので、是非PDOの勉強や確認をする際のプログラムなどで役立ててみてください。

SQLの基本は4種類 [SELECT, INSERT, UPDATE, DELETE]

SQLにはいろいろなコマンドが準備されています。そのコマンドに付随してしていできる様々な条件式や、データベース固有のコマンドまで、すべてを網羅して覚えようとするとかなり大変です。その中でも、SQLで最も重要で基本的なコマンドは以下の4つで、大体の事はこの4つのコマンドを組み合わせていくことで実現ができてしまいます。

  • SELECT : データの選択
  • INSERT : データの挿入
  • UPDATE : データの更新
  • DELETE : データの削除

大文字小文字の区別はないので、どちらで書いても構いません。人や書籍などによって大文字派と小文字があったりします。

これらのコマンドは、SQL文の先頭に指定されると、そのSQL全体の目的を示すことになるため、しばしばそういったSQL文のことを”コマンド名”文と呼称します。(SELECT文や、UPDATE文など)

次項以降では、各コマンドについてそれぞれ簡単に紹介していきます。

INSERT – データの挿入

INSERTは、データベースにデータ(新しい行/レコード)を挿入するSQLコマンドです。

INSERT INTO テーブル名(列1,列2,...)  VALUES(値1,値2,...);

INSERT INTO テーブル名に続いて列/フィールド名を列挙して、続くVALUESに続いて値を列挙して指定します。テーブル名に続く列名は省略が可能で、その場合テーブル構造の列順にそってVALUESで値を指定する必要があります。ただプログラム上は間違いの原因になるので、省略しない書き方を覚えることをオススメします。

文字や日付型の値を指定する場合は、'(シングルクォート)で囲んで指定するのが一般的ですが、使用するデータベースによって異なる可能性があります。セキュリティ上大きな脆弱性を抱えることに繋がるので、本件は次回細かく取り扱っていきます。PHPのプログラムからPDO経由でSQLを発行する場合は、文末の;(セミコロン)は必要ありません。

SELECT – データの抽出

SELECTは、データベースからデータを抽出/取得するSQLコマンドです。

SELECT カラム名1, カラム名2,... FROM テーブル名;
SELECT * FROM テーブル名;

SELECTに続いて取得するカラム名とどのテーブルから取得するのかをFROM句で指定します。全てのカラムを取得する場合は、前回紹介したSQLでも登場しましたが、2文目のSQLのように*(アスタリスク)で指定します。

SELECT文は、データベースエンジニアやプログラマーの腕が試される重要なSQLです。効率がよく安全なSQL文を作るため、柔軟な思考が求められます。

少し複雑になってしまいますが、抽出するデータの条件の指定について紹介します。

SELECT * FROM テーブル名 WHERE 条件式;

上記SQL文では、WHERE句によって条件を指定しています。条件式は複数指定することができ、ANDORといった論理演算で複数の条件式の扱いを指定できます。単純な条件式についていくつか紹介してみます。

--カラム名の値が指定したもの
SELECT * FROM テーブル名 WHERE カラム名 = 値;

--カラム名の値がIN句に続く値の列挙に含まれるもの
SELECT * FROM テーブル名 WHERE カラム名 IN (値1, 値2,...);

-- カラム名の値がBETWEEN句に続く値1と値2の間のもの
SELECT * FROM テーブル名 WHERE カラム名 BETWEEN 値1 AND 値2;

-- カラム名の値がNULL値のもの
SELECT * FROM テーブル名 WHERE カラム名 IS NULL;

-- カラム名1の値が値1と等しく、且つ、カラム名2の値がNULL値のもの
SELECT * FROM テーブル名 WHERE カラム名1 = 値1 AND カラム名2 IS NULL;

ここで紹介したもの以外にも、WHERE句では様々な条件の指定方法があります。また、この条件式にSELECTのSQL文を指定(入れ子)することもでき、大規模なシステムの場合だと一つのSQLで100行を超えるような長文となることもある程です。興味のある方は、とてもやりがいのある楽しい分野なので、是非本格的にデータベースやSQLについて学んでみてください。

UPDATE – データの更新

UPDATEは、データベースのデータを更新するSQLコマンドです。

UPDATE テーブル名 SET カラム名1 = 値1, カラム名2 = 値2,... WHERE 条件式;

UPDATEに続いて対象とするテーブル名を指定し、SET句に続いてカラムと値のペアを,(カンマ)で区切って指定します。最後に対象とするデータの条件式をWHERE句で指定します。

※注意
WHERE句の指定を忘れると、指定したテーブルの情報が全て更新されてしまいます。

私も若かりし頃にやらかしましたし、多くのエンジニアが人生で一度は大失敗をしてしまった苦い経験もあるかもしれません。WHERE句を忘れてしまうとすべてのデータが更新されてしまい、対象とするデータによっては大惨事となってしまいます。

事故を防ぐための方法は様々ありますが、最初のうちは、先にSELECT文を発行して対象データを確認し、そのSELECT文内のWHERE句を使う形でUPDATE文を作成するようにすると間違いが起こることを防止できるでしょう。

実行結果に間違いがあった場合に取り消しをすることが可能なトランザクションという仕組みについては、本シリーズの後半で改めて紹介します。

DELETE – データの削除

DELETEは、データベースに保管されているデータ/レコードを削除するSQLコマンドです。

DELETE FROM テーブル名 WHERE 条件式;

UPDATEと同じで、条件式を指定し忘れてしまうと全てのデータが削除されてしまう危険なSQLですので、使用には細心の注意を払いましょう。

余談ですが、このDELETE文は一行ずつデータを削除するため、利用するデータベースによってはかなり低速になってしまいます。データに更新があったときに、それをトリガーとして他のデータを更新したり、同期を掛けたりと様々な処理が行われるように設定されていることがあるためです。テーブルのデータをすべて削除したい場合は、TRUNCATEが便利ですので、ここで合わせて紹介だけしておきます。

TRUNCATE テーブル名;

テーブル名で指定したデータがすべて削除され、テーブルの中身が空っぽになります。プログラムの開発を進めていると、余計なデータが量産されてしまって、全部削除したいということが稀にあります。TRUNCATE文は、そういった時に便利なので利用してみてください。データの走査処理が行われず、高速な削除を実行してくれます。

まとめ

今回はPHP/PDOのプログラムには直接関係のない「SQLの紹介」といった記事となりましたが、前回紹介したPDO::query()に指定するSQLとして、参考にしてみてもらえればと思います。

SQLの世界は単純なのに奥が深く、蓄積された膨大なデータから必要なデータを取り出して分析するなど、とてもやりがいがあって面白い分野です。特に、プログラム側で実装すると大変な検索や集計といった処理は、データベース側の処理(SQL)で吸収することができる部分でもあり、プログラムの構造とは表裏一体とも言えます。

効率的なSQLを組み立てられるようになれば、プログラムの制作にかかる時間を大幅に削減することにもつながりますので、PHPなどのプログラム言語の勉強と合わせて学んでいくことをオススメします。