【例文付き】SQLチートシート – 基本編
基本的なSQLの構文をまとめます。上級者になりたい方向けの本も最後に紹介しています。
SELECT 基本
役割
テーブルからレコードの情報を参照するために利用します。
構文
SELECT カラム名, カラム名 FROM テーブル名 WHERE カラム名 比較演算子 値 AND カラム名 比較演算子 値 ORDER BY カラム名 DESC
すべてのカラムを取得したいときにはカラム名の箇所を*にすればOKです。
SELECT * FROM テーブル名
コード例
usersテーブルから名前を取得するSQLです。
SELECT name FROM users WHERE age = 30 ORDER BY id DESC
もう一個例文を載せておきます。WHERE句で文字列を使う場合です。
SELECT name, age FROM users WHERE name = 'shohei'
数値を利用する場合には’は不要でしたが、文字列との比較をするときには必須です。
またWHEREで利用する=などの比較演算子にLIKEを用いると、比較対象の値にワイルドカードが利用可能です。
SELECT name, age FROM users WHERE name LIKE 'sho%'
この例の場合だと、shoheiもshotaも引っかかります。
利用できるワイルドカードは2つです。
%は「0文字以上の任意の文字列」。_は「1文字の任意の文字」です。正規表現とは異なるので注意しましょう。
SELECT 集合関数
役割
SELECTの基本形では取得対象がカラム自体の値になっていましたが、集合関数ではカラムもしくはカラム以外の値に対して何かしらの計算を加えた値を返します。
構文
SELECT 集合関数(カラム名), 集合関数(カラム名) FROM テーブル名
集合関数にはMAX、MIN、AVGなどがあります。
コード例
SELECT MAX(age), AVG(age) FROM users
このコード例ではWHERE句とこの後説明するグループ化をどちらも利用していないので全てのカラムについて集合させた結果を出力します。
SELECT グループ化
役割
特定の条件に合致したレコードをグループ化した(擬似的に一つのレコードにまとめた)上で演算を行います。基本的に集合関数とセットで使います。
構文
SELECT カラム名A, カラムB, 集合関数(カラム名C) FROM テーブル名 GROUP BY カラム名A, カラム名B
GROUP BYを利用した場合、SELECTで指定できるのはGROUP BYで指定したカラムか集合関数のみになる点に注意です。
例えば以下のようなSQL文は実行できません。
SELECT name, AVG(age) FROM users GROUP BY job
job(職業)でグループ化しているので、内部的にできているテーブルはjob以外はぐちゃっとしています。集合関数を使うとぐちゃっとした値をどのように集約させるか決まるのでSELECTできますが、それ以外の値はぐちゃっとした状態が解消されないので、指定できません。
ルールとして覚える必要はありません。まずGROUP BYで作られる一時テーブルを想像してから、何をSELECTできるのか考えれば自然にわかります。
SELECT グループ化 絞り込み
役割
グループ化した上で算出可能になった値を利用して、絞り込みを行うときに利用します。
構文
SELECT カラム名A, 集合関数(カラム名B) FROM テーブル名 GROUP BY カラム名A HAVING 集合関数(カラム名B) 比較演算子 値
役割の補足
絞り込みで使われるものとしてWHERE句が浮かぶと思うのですが、HAVINGとは明確に異なる点があります。それが実行タイミングです。WHERE句はグループ化前に実行されHAVINGはグループ化後に実行されます。
そのためグループ化した後に利用可能な集合関数を利用した絞り込みはHAVINGでのみ利用可能です。
コード例
SELECT name, AVG(age) FROM users GROUP BY job HAVING MAX(age) <= 10
SELECT 重複削除
役割
出力対象の行が全く同じ値であったら、重複を削除して表示します。
構文
SELECT DISTINCT カラム名A, カラムB FROM テーブル名
注意点として、あくまでDISTINCTは出力される行全体にかかっており、カラムAだけに対して重複削除をしているわけではないということです。
コード例
SELECT DISTINCT age, job FROM users
INSERT
役割
レコードを追加します。
構文
INSERT INTO テーブル名 (カラム名, カラム名, カラム名) VALUES (値, 値, 値)
値が文字列の場合には’で囲む必要があるので注意です。あと値が必須のカラムに値を設定しないでINSERTするとエラーになるので注意です。
コード例
INSERT INTO users (name, age, job) VALUES ('shouhei', 29, 'baseball_player')
UPDATE
役割
行の値を更新します。
構文
UPDATE テーブル名 SET カラム名 = 値, カラム名 = 値 WHERE 条件
WHEREをつけない場合、テーブルに存在する全ての行の値が更新されてしまいます。本番環境のDBでやったらとんでもない事故になるので気をつけましょう。
コード例
UPDATE users SET job = 'soccer_player' WHERE name = 'shohei'
DELETE
役割
行を削除します。
構文
DELETE FROM テーブル名 WHERE 条件
WHEREをつけない場合、テーブルに存在する全ての行を削除してしまいます。本番環境のDBでやったらUPDATEを超えるとんでもない大事故になるので気をつけましょう。
コード例
DELETE FROM users WHERE name != 'shohei'
まとめ
この記事ではSQLの基本となる情報をまとめました。
ただし重要な「結合」については記載していません。というのも結合は奥が深く、それだけでかなりの説明量になってしまうからです。結合を業務で利用する、もしくは興味があるという方は以下の記事もご確認ください。
あとSQLの上級者になりたい方にはこちらの本がおすすめ。上級者になりたい中級者向けSQL教本といったらまず名前が上がる本で、この記事では記載していないCASE式などより簡潔にパフォーマンスの良いSQLを書くための技術が詰まっています。