SQLのコマンド一覧を知りたいなぁ・・・
SQLでどんなことができるかもっと知りたいなぁ・・・
SQLの基礎的な書き方がわかった後、何を学べばいいか悩む人がとても多いです。深く学ぼうとすると覚える範囲は多いですし、どんなことができるかSQLのコマンド一覧を知りたい人が多いのではないでしょうか。
こんにちは!フリーランスエンジニア兼テックライターのワキザカです。
この記事では、SQLのコマンド一覧をわかりやすい順に解説します!
入門編・応用編に分けて解説しているので、入門編から見て、わからないところから学んでいくのがおすすめです。
この記事はこんな人のために書きました。
- SQLのコマンド一覧が知りたい人
- SQLでどんなことができるのか知りたい人
- SQLコマンドの書き方をもっと知りたい人
SQLのコマンド一覧を覚える前に大枠を知ろう
SQLのコマンドをいきなり解説する前に、SQLの基礎について知っておきましょう。
SQLは、大きく分けて以下の3つの種類があります。
- SQLの3つの種類
-
- DDL
- DML
- トランザクション制御
それぞれ詳しく解説しますね。
DDL
DDLは、データベース・テーブルを操作するためのSQLの文法です。たとえば、以下のような書き方があります。
- DDLのSQL文の例
-
- CREATE文:データベース・テーブルの作成
- ALTER文:データベース・テーブルの定義変更
- DROP文:データベース・テーブルの削除
SQLを初めて使う時は、CREATE文でテーブルを作るところから始まります。基礎として覚えておくのがおすすめです。
DML
DMLは、レコードを操作するためのSQLの文法です。たとえば、以下のような書き方があります。
- DMLのSQL文の例
-
- SELECT文:レコード検索
- INSERT文:レコード挿入
- UPDATE文:レコード更新
- DELETE文:レコード削除
テーブルにレコードを挿入してデータを作ったり、レコードを検索して知りたい情報を表示することができます。テーブル作成後はDML操作が基本となるので、それぞれの意味を覚えておくのがおすすめです!
トランザクション制御
トランザクション制御は、データの更新結果を途中で確認することができる仕組みです。
誤ってデータの削除・更新をしてしまうと、事故につながりますよね。事前にSQLで更新結果を確認できれば、事故が起こるのを防ぐことができます。
以下のように「BEGIN;」~「ROLLBACK;」で囲うことで、元のデータを更新確定せずに、値を確認することができます。
トランザクション制御するSQLの例
-- トランザクション制御開始 BEGIN; -- users_listテーブルの、idが1のnameを更新するUPDATE文 UPDATE users_list SET name = '侍1_Ver2' WHERE id = 1; -- ①users_listテーブルのデータ確認用のSELECT文 SELECT * FROM users_list WHERE id = 1; -- 処理を元の状態に戻す ROLLBACK; -- ②users_listテーブルのデータを再確認するSELECT文 SELECT * FROM users_list WHERE id = 1;
実行結果(ROLLBACK前のusers_listのデータ):
| id | name | age | created_at | updated_at | | ---: | --- | ---: | --- | --- | | 1 | 侍1_Ver2 | 18 | 2019-07-01 | 2019-07-26 |
実行結果(ROLLBACK後のusers_listのデータ):
| id | name | age | created_at | updated_at | | ---: | --- | ---: | --- | --- | | 1 | 侍1 | 18 | 2019-07-01 | 2019-07-26 |
「ROLLBACK;」前のデータはUPDATE文で更新した結果が、SELECT文の結果に反映されています。「ROLLBACK;」以降のSELECT文の結果では、UPDATE文が反映されていないですよね。
このように、更新結果を戻すことができるのです。
ちなみに、「ROLLBACK;」を「COMMIT;」に変えると、データ更新を確定することができます。「BEGIN;」~「ROLLBAK;」で囲うのを基本としつつ、確認が取れたら「COMMIT;」に変えて再実行するのがおすすめです。
入門編:SELECT文のSQLコマンドを使いこなせるようになろう
ここからは、SELECT文のSQLコマンドについて、以下4つに分けて解説します。
- データ数を変えずに結果を変える方法
- 検索条件を追加する方法
- 条件によってデータを変える方法
- 複数テーブルのデータを使う方法
それぞれ解説しますね。
データ数を変えずに結果を変える方法
まずは、データ数を変えずに結果を変える方法について解説します。
AS:結果の項目名を変える
まず、「AS句」について解説します。AS句を使うと、表示する列名を変えることができます。
たとえば、AS句がない場合は、次のようにテーブルで定義されている列名が表示されてしまいます。
AS句を使わない場合のSQL:
SELECT * FROM users;
実行結果:
| id | name | age | | ---: | --- | ---: | | 1 | 侍1 | 22 | | 2 | 侍2 | 23 | | 3 | 侍3 | 25 | | 4 | 侍4 | 27 | | 5 | 侍5 | 21 |
列名が、id、name、ageになっていますよね。簡単な単語なのでわかりやすいかもしれませんが、日本語になっていたほうが伝わりやすいはずです。
次のように書くことで、表示名を変えることができます。
AS句を加えたSQL:
SELECT id as 'ID', name as '名前', age as '年齢' FROM users;
| ID | 名前 | 年齢 | | ---: | --- | ---: | | 1 | 侍1 | 22 | | 2 | 侍2 | 23 | | 3 | 侍3 | 25 | | 4 | 侍4 | 27 | | 5 | 侍5 | 21 |
列の表示名が、ID、名前、年齢になったのでわかりやすくなりましたよね。このように、表示名を変えることができます。
取得した結果をそのままアプリ画面で使う場合も多いので、覚えておくのがおすすめです。
ORDER BY:ソート
次に、「ORDERT BY」について解説します。「ORDER BY」を使うと、データの順序を変えることができます。
たとえば、先ほどのデータは以下のように表示されていました。
AS句で使ったサンプルのデータ:
| id | name | age | | ---: | --- | ---: | | 1 | 侍1 | 22 | | 2 | 侍2 | 23 | | 3 | 侍3 | 25 | | 4 | 侍4 | 27 | | 5 | 侍5 | 21 |
これを、age(年齢)が若い順に表示するときは、次のように書きます。
ORDER BYでageを昇順に変更するSQL:
SELECT * FROM users ORDER BY age ASC;
実行結果:
| id | name | age | | ---: | --- | ---: | | 5 | 侍5 | 21 | | 1 | 侍1 | 22 | | 2 | 侍2 | 23 | | 3 | 侍3 | 25 | | 4 | 侍4 | 27 |
age(年齢)を昇順でソートされていますよね。このように、簡単に順序を並び替えることができます。
ORDER BYの詳しい使い方は以下で解説しているので、深く知りたい方は見てみてくださいね!
検索条件を追加する方法
次に、検索条件を追加する方法について解説します。
DISTINCT:重複削除
まず、「DISTINCT」について解説します。DISTINCTを使うと、重複したデータを非表示にすることができます。
今回は以下のテーブルがあることを前提に、解説を進めていきますね。
上記データから、重複なしの「部署コード」「部署名称」を取得する場合は、次のように書きます。
DISTINCTで重複を除いたSQL:
SELECT DISTINCT dept_cd, dept_name FROM dept_users;
実行結果:
| dept_cd | dept_name | | --- | --- | | A0001 | 第一開発部 | | A0002 | 第二開発部 |
dept_cd(部署コード)、dept_name(部署名称)が重複なしで取得できていますよね。重複なしでデータ取得するケースはよくあるので、覚えておくのがおすすめです。
DISTINCTのさらに詳しい使い方は以下で解説しています。もっと深く知りたい方は、ぜひ見てみてくださいね。
LIKE:あいまい検索
次に、「LIKE」について解説します。「LIKE」を使うと、あいまい検索をすることができます。
たとえば、上記のユーザ一覧テーブルの名前に、「太郎」が含まれているデータを調べることができるのです。
具体的には、以下のようにSQLを書きます。
LIKEを使ってあいまい検索するSQL:
SELECT * FROM users WHERE name LIKE '%太郎%';
実行結果:
| id | name | age | | ---: | --- | ---: | | 1 | 侍太郎1 | 22 | | 2 | 侍太郎2 | 23 | | 3 | 侍太郎3 | 25 |
name(名前)に、「太郎」が含まれているデータのみ表示されていますよね。このように、一部の文字を含むデータを検索することができます。
LIKEの詳しい使い方については、以下で解説しています。大文字・小文字を判別する方法についても触れているので、LIKEをもっと使いこなしたい方は、ぜひ見てみてくださいね。
BETWEEN:A~Bの間の値を検索
次は、「BETWEEN」について解説します。BETWEENは、「A~Bの間の値」を条件に指定することができる方法です。
たとえば、上記のユーザ一覧テーブルの中でage(年齢)が23 ~ 27までの値のみ表示することができます。
具体的には、以下のようにSQLを書きます。
BETWEENを使ったSQL:
SELECT * FROM users WHERE age BETWEEN 23 AND 27;
実行結果:
| id | name | age | | ---: | --- | ---: | | 2 | 侍太郎2 | 23 | | 3 | 侍太郎3 | 25 | | 4 | 侍1 | 27 |
「BETWEEN A AND B」のようにA、Bの値を指定すると、上記のようにその間の値を条件にすることができます。
BETWEENの使い方については、以下でも詳しく解説しています。基礎的な使い方だけでなく「日付でも使えるの?」「文字列でも使えるの?」といった疑問にも答えているので、より詳しく知りたい方は見てみてくださいね。
AND / OR:複数条件を追加するときの書き方
次に、「AND / OR」条件の使い方について解説します。
WHEREの条件は、複数設定することができます。複数指定するときに、「条件1かつ条件2の時」と指定するか、「条件1または条件2の時」と指定するか決めるのが「AND」「OR」です。
たとえば、上記のユーザ一覧テーブルから「名前に太郎を含む」かつ「年齢が23歳~25歳」で指定する場合は、次のようになります。
ANDを使ってWHEREに複数条件を入れたSQL:
SELECT * FROM users WHERE name LIKE '%太郎%' AND age BETWEEN 23 AND 25;
実行結果:
| id | name | age | | ---: | --- | ---: | | 2 | 侍太郎2 | 23 | | 3 | 侍太郎3 | 25 |
「名前に太郎を含む」かつ「年齢が23歳~25歳」のデータのみ表示されていますよね。仮にOR条件にすると、次のようになります。
SELECT * FROM users WHERE name LIKE '%太郎%' OR age BETWEEN 23 AND 25;
実行結果:
| id | name | age | | ---: | --- | ---: | | 1 | 侍太郎1 | 22 | | 2 | 侍太郎2 | 23 | | 3 | 侍太郎3 | 25 |
「名前に太郎を含む」データの時点で3件あるため、3件データが表示されています。このように、ANDとORは絞り込み方が変わるので、使い方を覚えておくのがおすすめです。
IN / NOT IN:複数含む・含まない
次に、「IN / NOT IN」条件の使い方について解説します。
「IN」は、複数の要素を条件に指定することができる方法です。age(年齢)が「23、25のとき」のようなイメージですね。
「NOT IN」はINの逆で、ageが「23、25以外のとき」のようなイメージです。
ageに23、25を含むときのSQLの書き方は、以下のとおりです。
IN句を使ったSQL:
SELECT * FROM users WHERE age IN (23,25);
実行結果:
| id | name | age | | ---: | --- | ---: | | 2 | 侍太郎2 | 23 | | 3 | 侍太郎3 | 25 |
ageが23、25のデータのみ表示されていますよね。AND条件で「age = 23」「age = 25」2つの条件を指定して書くこともできますが、1行で表現できた方がシンプルですよね。
使いこなすととても便利なので、使い方を覚えておくのがおすすめです。IN句の詳しい使い方については、以下で詳しく解説しています。興味がある方は、ぜひ参考にしてみてくださいね。
条件によってデータを変える方法
次に、条件によって表示するデータを変える方法について解説します。
CASE:検索結果によって変える
CASEは、値によって表示方法を変える時に使います。
たとえば、次のようなテスト結果一覧テーブルがあったとします。
単純に点数を表示したいだけであれば全件表示すれば良いですが、点数に応じて以下のように表示を分けたいときにCASEを使います。
- CASEを使って得点の表示を変える例
-
- 80点以上の場合:合格(優秀)
- 31点 ~ 79点の場合:合格(普通)
- 30点以下:赤点
具体的には、以下のようにSQLを書きます。
CASEを使ったSQL:
SELECT id, point, CASE WHEN 80 <= point THEN '合格(優秀)' WHEN 31 < point AND point < 80 THEN '合格(普通)' WHEN point <= 30 THEN '赤点' END as '結果' FROM test_results;
実行結果:
| id | point | 結果 | | ---: | ---: | --- | | 1 | 66 | 合格(普通) | | 2 | 99 | 合格(優秀) | | 3 | 56 | 合格(普通) | | 4 | 44 | 合格(普通) | | 5 | 20 | 赤点 |
結果の列に、合格(優秀)、合格(普通)、赤点などが表示されていますよね。このように、テーブルのデータを使って、表示項目を追加したいときにとても便利です。
CASEについては以下でも詳しく解説しています。UPDATE文で使いこなすコツも解説しているので、興味がある方は見てみてくださいね!
サブクエリ:別のクエリの結果で条件を作る
次に、「サブクエリ」の使い方を解説します。
サブクエリは、SELCT文で取得した結果を使って、別のSQL(SELECT文やUPDATE文など)を実行する書き方です。
たとえば、次のような2つのテーブルがあったとします。
部署所属ユーザ一覧テーブルから第一開発部のユーザIDを取得し、それを使ってユーザ一覧テーブルのデータを表示するようなケースで使います。具体的には、以下のようにSQLを書きます。
サブクエリでSELECT文を実行するSQL:
SELECT * FROM users WHERE id IN ( SELECT id FROM dept_users WHERE dept_cd = 'A0001' );
実行結果:
| id | name | age | | ---: | --- | ---: | | 1 | 侍太郎1 | 22 | | 2 | 侍太郎2 | 23 |
まず、WHEREの条件の中で以下のSQLを実行しています。
SELECT id FROM dept_users WHERE dept_cd = 'A0001';
実行結果:
| id | | ---: | | 1 | | 2 |
dept_cd(部署コード)がA0001のidを取得しています。このidを使って、「WHERE id IN SELECT文で取得したid」を条件にすることで、絞ったデータを表示しているのです。
少しわかりづらいかもしれませんが、サブクエリは「2つのSQLでできているだけ」です。そのため、以下の流れで作ると作りやすいのでおすすめです。
- サブクエリを作るときのおすすめの流れ
-
- 手順1:WHEREの条件に使うSELECT文だけを一旦作る
- 手順2:大元のSELECT文をサブクエリなしで一旦作る
- 手順3:手順1の結果を使って、手順2のWHERE句の条件を書き換える
1つずつ結果が正しくなることを確認してから、サブクエリ化できるので作りやすくなります。
複数テーブルのデータを使う方法
次に、複数テーブルのデータを表示する方法について解説します。
JOIN:テーブルを結合して使う
まず、JOINの使い方を解説しますね。
JOINは、複数テーブルをつなげてデータを取得することができる仕組みです。
たとえば、先ほどの例で使った次のようなテーブルがあったとします。
このデータをつなげて、次のようにデータを表示するSQLを書いてみましょう。
SQLの書き方は、次のとおりです。
JOINを使ったSQLの書き方:
SELECT dept_users.dept_cd, dept_users.dept_name, users.id, users.name FROM users INNER JOIN dept_users ON users.id = dept_users.id;
実行結果:
| dept_cd | dept_name | id | name | | --- | --- | ---: | --- | | A0001 | 第一開発部 | 1 | 侍太郎1 | | A0001 | 第一開発部 | 2 | 侍太郎2 | | A0002 | 第二開発部 | 3 | 侍太郎3 | | A0002 | 第二開発部 | 4 | 侍1 | | A0002 | 第二開発部 | 5 | 侍2 |
2つのテーブルを結合して、表示できていますよね。「INNER JOIN 結合するテーブル ON 条件」で簡単に結合することができます。
注意点としては、SELECT直後の「テーブル名.列名」で指定しているところですね。
usersテーブル、dept_usersテーブルどちらも「id」の列がありますよね。そのため、ただ「id」だけを指定してしまうと「どっちのテーブルのidなの?」と理解できず、エラーになってしまいます。
どちらも同じデータにはなりますが、明確にどちらか指定する必要があるので注意しましょう。
JOINのさらに詳しい使い方は、以下で詳しく解説しています。興味がある方は、以下を見てみてくださいね。
UNION:結果をマージして使う
次に、UNIONの使い方を解説します。
JOINはテーブルを結合して表示しましたが、UNIONはSELECT文の結果を合体させる時に使います。
たとえば、次のような2つのテーブルがあったとします。
上記のように、列名が全く同じテーブルのときに検索結果を合体させることができます。具体的には、以下のようにSQLを書きます。
UNIONを使うSQL:
SELECT *, 'dev_client_lists' AS 'テーブル名' FROM dev_client_lists UNION SELECT *, 'mkt_client_lists' AS 'テーブル名' FROM mkt_client_lists;
実行結果:
| comp_cd | comp_name | sales_count | テーブル名 | | --- | --- | ---: | --- | | CP0001 | 株式会社A | 1 | dev_client_lists | | CP0002 | 株式会社B | 4 | dev_client_lists | | CP0003 | 株式会社C | 2 | dev_client_lists | | CP0004 | 株式会社D | 5 | dev_client_lists | | CP0005 | 株式会社E | 8 | dev_client_lists | | CP0101 | 株式会社AA | 11 | mkt_client_lists | | CP0102 | 株式会社BA | 15 | mkt_client_lists | | CP0103 | 株式会社CA | 13 | mkt_client_lists | | CP0104 | 株式会社DA | 14 | mkt_client_lists | | CP0105 | 株式会社EA | 16 | mkt_client_lists |
2つのSELECT文の結果をつなげて表示できていますよね。複数の条件でとってきたデータを、同じ列に整えてUNIONで繋げるケースはよくあります。
UNIONの詳しい使い方・UNION ALLとの違いについては以下で詳しく解説しています。さらに深く知りたい方は、ぜひ見てみてくださいね。
応用編:他のDMLのSQLコマンドを覚えよう
SELECT文の使い方を覚えたら、他のDMLで応用する方法を覚えましょう。
ここまで解説した方法はUPDATE文、INSERT文、DELETE文などでも使うことができます。UPDATE文を使ったサンプルを解説しますね。
「条件によってデータを変える方法」で解説した、サブクエリを使ったデータ更新について解説します。SELECT文は、以下のようになっていました。
SELECT文のSQL:
SELECT * FROM users WHERE id IN ( SELECT id FROM dept_users WHERE dept_cd = 'A0001' );
実行結果:
| id | name | age | | ---: | --- | ---: | | 1 | 侍太郎1 | 22 | | 2 | 侍太郎2 | 23 |
SELECT文の結果を使って、SELECT文でデータを取得するSQLでしたね。これを、SELECT文の結果を使って、UPDATE文でデータ更新するサンプルに書き換えてみます。
UPDATE文でサブクエリを置き換えたSQL:
UPDATE users SET name = 'サブクエリで更新' WHERE id IN ( SELECT id FROM dept_users WHERE dept_cd = 'A0001' );
実行結果:
| id | name | age | | ---: | --- | ---: | | 1 | サブクエリで更新 | 22 | | 2 | サブクエリで更新 | 23 | | 3 | 侍太郎3 | 25 | | 4 | 侍1 | 27 | | 5 | 侍2 | 21 |
このように、UPDATEに置き換えることも容易です。サブクエリ以外にも、WHEREで指定した条件を使うことができます。
「BEGIN;」~「ROLLBACK;」で囲ってデータ書き換えしないようにしつつ、条件式を使って試してみるのがおすすめです。
ちなみに、UPDATE文、INSERT文、DELETE文の詳細な使い方は以下で解説しています。よく使う条件の書き方も解説しているので、見ながらSQLを書くのがおすすめです!
まとめ
今回は、SQLの基礎・コマンド一覧について解説しました。
SQLは条件を絞ってデータを取得する方法を覚えれば、あとは更新に活かしていくだけです。
入門編からでいいので、ぜひSQLのコマンドを覚えていって下さいね!