公開日:2019/9/25
更新日:2019/9/25
キーワード:SQL 基本文法
文字数:8100(読み終わるまでおよそ13分)
この記事でわかること
- SQLにおけるデータの取得方法
- SQLにおけるデータ取得の基本的な文法
はじめに
SQL(エスキューエル)とは、データベースに存在するデータを好きなように条件を指定して抽出したりするためのプログラム言語です。
SQLは国際標準化されていますので、「MySQL」や「PostgreSQL」など、扱うデータベースの種類が変わったとしても、一度文法を覚えてしまえば、同じように操作することが可能です。
SQLはどのシステム開発、アプリ開発においても必須となる言語ですので、データをうまく扱いたい方は、ぜひこの機会にマスターしてみてください。
1) データベース(DB)とは?
「データベース」とは、『様々な情報が属性ごとに整理されているデータの集合体』です。
例えば、「住所録データベース」から任意の名前を指定して検索すると、その人の住んでるところを始め、様々な個人情報を取得することができます。これは、名前という情報に様々な他情報が紐づいているからです。
また、このようなデータベースを構築するにはデータベース製品と呼ばれるミドルウェアを利用するのが一般的です。
オープンソースの「MySQL」や「PostgreSQL」から、商用の「Oracle」、「SQLserver」などがあります。
2) SQLでできることとは?
大きく分けて4つです。
データの、『取得』、『登録』、『更新』、『削除』です。
特に、任意の条件を指定し、望んだデータのみを取得する抽出(検索)は、SQLのキモとなる部分です。
更新、削除を行うさいにも抽出を利用し、「ある特定のデータに対し更新、削除をする」という場合が多いです。
なので、まず最初に覚えるべきは『データの取得』の方法であります。
このページでは、データ取得の基本的な文法を網羅していますので、ぜひ覚えてみてください。
1.基本的なデータの取得方法(SELECT、FROMについて)
ここではデータベースからデータを取得し、欲しい情報を表示する方法を説明します。
SQLの文法として、「SELECT」、「FROM」の2つはすごく基本的な構成句となります。
これらを組み合わせるだけで、最低限のSQL文は書けますのでぜひ覚えていきましょう。
□この章で用いるテーブル
- 社員情報テーブル
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 30 |
上記の「社員情報テーブル」があらかじめデータベースに登録されているとします。
このテーブルから、必要なデータを取得していきましょう。
1) SELECT、FROMを使ってデータを取得する
SQLの文法には当然ですが記述ルールがあり、SELECTの後ろには対象となるカラム名(列名)を書かなくてはいけなく、そして、FROM句の後ろには対象とするテーブル名を書かなくてはいけない、などがあります。
下記の通りです。
SELECT カラム名 FROM テーブル名;
例えば、社員情報テーブルから社員番号のデータを取得したいときは、
SELECT 社員番号 FROM 社員情報テーブル;
と記述します。このSQLを実行した場合、返却されるデータは下記の通りです。
- 返却されるデータ
社員番号 |
0001 |
0002 |
0003 |
0004 |
0005 |
①複数のカラムからデータを取得する方法
もちろん、複数のカラムからデータを取得することもできます。
例えば、社員番号と所属部署のカラムからデータを取得したい場合、下記のように記述します。
SELECT 社員番号,所属部署 FROM 社員情報テーブル;
複数のカラムは「,」(カンマ)で区切ります。
下記のデータが返却されます。
- 返却されるデータ
社員番号 | 所属部署 |
0001 | 開発部門 |
0002 | 営業部門 |
0003 | 企画部門 |
0004 | IT部門 |
0005 | 企画部門 |
②全てのカラムからデータを取得する方法
全てのカラムを取得したい場合、いちいち全てのカラムを「,」で区切るのは面倒ですよね。
その場合、下記のように記述すれば一括で全カラムを取得できます。
SELECT * FROM 社員情報テーブル;
SELECT句のうしろに「*」(アスタリスク)を書けば、全てのカラムを取得できます。
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 30 |
2.特定のデータを指定してデータを抽出する方法(WHERE、演算子について)
ここでは、ある特定の条件を付与してそれに該当するデータのみを抽出する方法を説明していきます。
「WHERE」という構成句と、バリエーション豊かな演算子を用いれば任意のデータを取得できますので、覚えていきましょう。
□この章で用いるテーブル
- 社員情報テーブル
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 30 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
「社員情報テーブル」があらかじめデータベースに登録されているとします。
補足事項として、このテーブルには「NULL」という値が登録されています。
これは、SQLにおいて「データが存在しない」という意味になります。空文字や空白とは別の解釈となりますので、ご注意ください。
1) 比較演算子について
比較演算子とはWHERE句とセットで使うことの多い演算子です。
例えば、「企画部門の社員だけを抽出したい」、「年齢が30以上の社員だけを抽出したい」というように、任意の条件を付与することができます。
- 基本的な比較演算子
演算子 | 意味 |
= | 等しい |
> | 大きい |
>= | 以上 |
< | 小さい |
<= | 以下 |
<> もしくは != | 等しくない |
WHERE句以降の文法は下記のような構成になります。
WHERE カラム名 比較演算子 条件値;
では、実際に比較演算子を使ってデータを取得していきます。
①条件:所属部署が「企画部門」のデータのみを取得する(演算子「=」の使用)
SELECT * FROM 社員情報テーブル WHERE 所属部署 = '企画部門';
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0005 | 加藤マヤ | 企画部門 | 30 |
②条件:年齢が30より大きいデータのみを取得する(演算子「>」の使用)
SELECT * FROM 社員情報テーブル WHERE 年齢 > 30;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
③条件:年齢が30以上のデータのみを取得する(演算子「>=」の使用)
SELECT * FROM 社員情報テーブル WHERE 年齢 >= 30;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0005 | 加藤マヤ | 企画部門 | 30 |
④条件:年齢が25より小さいデータのみを取得する(演算子「<」の使用)
SELECT * FROM 社員情報テーブル WHERE 年齢 < 25;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0004 | 由浅春香 | IT部門 | 24 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
⑤条件:年齢が25以下のデータのみを取得する(演算子「<=」の使用)
SELECT * FROM 社員情報テーブル WHERE 年齢 <= 25;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
⑥条件:氏名が「鈴木一郎」と等しくないデータのみを取得する(演算子「<>、!=」の使用)
SELECT * FROM 社員情報テーブル WHERE 氏名 <> '鈴木一郎';
もしくは
SELECT * FROM 社員情報テーブル WHERE 氏名 != '鈴木一郎';
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 30 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
2) ワイルドカード検索(LIKE演算子について)
SQLではワイルドカード検索も行えます。
ワイルドカード検索とは、「文字列の始めが〇〇と一致する」、「文字列に△△が含まれている」などの部分的な一致を目的とした検索のことです。
「LIKE」演算子と、「%」(パーセント)を検索する文字列に付与することにより、実現できます。
一致の種別 | 表記 |
前方一致 | 〇〇〇% |
後方一致 | %〇〇〇 |
部分一致 | %〇〇〇% |
※〇〇〇は検索する文字列
①条件:氏名が「鈴木」で始まるデータのみを取得する(前方一致)
SELECT * FROM 社員情報テーブル WHERE 氏名 LIKE '鈴木%';
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0007 | 鈴木健司 | NULL | 18 |
②条件:氏名が「郎」で終わっているデータのみを取得する(後方一致)
SELECT * FROM 社員情報テーブル WHERE 氏名 LIKE '%郎';
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
③条件:氏名に「藤」が含まれているデータのみを取得する(部分一致)
SELECT * FROM 社員情報テーブル WHERE 氏名 LIKE '%藤%';
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0005 | 加藤マヤ | 企画部門 | 30 |
3) NOT演算子について
ここまでいくつか演算子について説明してきましたが、それらの前に「NOT」を付与することにより、「~~ではない」という否定の意味を持つことができます。
NOT演算子とよばれ、指定した条件式を否定するときに使用します。
条件:所属部署が「企画部門」ではないデータのみを取得する
SELECT * FROM 社員情報テーブル WHERE NOT 所属部署 = '企画部門';
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0004 | 由浅春香 | IT部門 | 24 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
4) NULLに関する検索(IS NULL 演算子、IS NOT NULL について)
前述しましたが、テーブルのデータには「NULL」という「データが存在しない」といった意味をもつものが存在します。そのNULLデータを取得したい、または抽出から省きたい場合の方法をここでは説明していきます。
①条件:所属部署が「NULL」のデータのみを取得する
SELECT * FROM 社員情報テーブル WHERE 所属部署 IS NULL;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
②条件:所属部署が「NULL」ではないデータのみを取得する
SELECT * FROM 社員情報テーブル WHERE 所属部署 IS NOT NULL;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 30 |
5) AND演算子について
複数の検索条件を「AND」でつなげることにより、「〇〇〇かつ、△△△」という条件で抽出した結果を得ることができます。
条件:所属部署が「企画部門」、かつ年齢が28より大きいデータのみを取得する
SELECT * FROM 社員情報テーブル WHERE 所属部署 = '企画部門' AND 年齢 > 28;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0005 | 加藤マヤ | 企画部門 | 30 |
6) OR演算子について
複数の検索条件を「OR」でつなげることにより、「〇〇〇または、△△△」という条件で抽出した結果を得ることができます。
条件:氏名が「鈴木一郎」、または年齢が25以下のデータのみを取得する
SELECT * FROM 社員情報テーブル WHERE 氏名 = '鈴木一郎' OR 年齢 <= 25;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
3.データの並び替え(ORDER BYについて)
取得したデータを、「番号を小さい順に並び替えたい」、「年齢を大きい順に並び替えたい」などのあるカラムにおいて昇順、降順にしたい場合は、「ORDER BY」という構成句を使います。
「ASC」を付与することにより昇順、「DESC」を付与することにより降順となります。
□この章で用いるテーブル
- 社員情報テーブル
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 30 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
①条件:取得したデータを「年齢」を昇順に並び替える
SELECT * FROM 社員情報テーブル ORDER BY 年齢 ASC;
もしくは
SELECT * FROM 社員情報テーブル ORDER BY 年齢;
※昇順降順の条件を付与しない場合、昇順と同じ動きをします。
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0007 | 鈴木健司 | NULL | 18 |
0006 | 山田誠 | NULL | 22 |
0004 | 由浅春香 | IT部門 | 24 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0005 | 加藤マヤ | 企画部門 | 30 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0001 | 鈴木一郎 | 開発部門 | 41 |
②条件:取得したデータを「社員番号」を降順に並び替える
SELECT * FROM 社員情報テーブル ORDER BY 社員番号 DESC;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0007 | 鈴木健司 | NULL | 18 |
0006 | 山田誠 | NULL | 22 |
0005 | 加藤マヤ | 企画部門 | 30 |
0004 | 由浅春香 | IT部門 | 24 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0001 | 鈴木一郎 | 開発部門 | 41 |
4.データの最大取得行数(LIMITについて)
例えば100行のデータが取得できたとして、「先頭の50行だけを表示してほしい」という場合には、「LIMIT」という構成句を使用します。
LIMIT句は最大取得行数を制御する役割を持ちます。
□この章で用いるテーブル
- 社員情報テーブル
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 30 |
0006 | 山田誠 | NULL | 22 |
0007 | 鈴木健司 | NULL | 18 |
条件:取得したデータのうち、最大4件まで表示する
SELECT * FROM 社員情報テーブル LIMIT 4;
- 返却されるデータ
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
5.重複するデータをまとめる方法(DISTINCTについて)
取得したデータのなかに同じ文字列の、重複したデータが存在する場合があります。
それらの重複データを1つにまとめたいときは「DISTINCT」という構成句を使います。
□この章で用いるテーブル
- 社員情報テーブル
社員番号 | 氏名 |
0001 | 鈴木一郎 |
0002 | 佐藤太郎 |
0003 | 後藤ヒロシ |
0004 | 鈴木一郎 |
0005 | 鈴木一郎 |
0006 | 山田誠 |
0007 | 佐藤太郎 |
条件:取得したデータのうち、「氏名」で重複したデータを1つにまとめる
SELECT DISTINCT(氏名) FROM 社員情報テーブル;
- 返却されるデータ
氏名 |
鈴木一郎 |
佐藤太郎 |
後藤ヒロシ |
山田誠 |
3人いた「鈴木一郎」、2人いた「佐藤太郎」が1つにまとまった形で返却されます。
6.集計関数の扱い方(SUM、AVG、COUNT、MAX、MINについて)
ここではSQLにおける集計関数の説明をしていきます。
取得したデータの合計を表示する「SUM関数」や平均値を算出する「AVG関数」などがあります。
1つ1つ説明していきます。
□この章で用いるテーブル
- 社員情報テーブル
社員番号 | 氏名 | 年齢 |
0001 | 鈴木一郎 | 41 |
0002 | 佐藤太郎 | 35 |
0003 | 後藤ヒロシ | 25 |
0004 | 由浅春香 | 24 |
0005 | 加藤マヤ | 30 |
0006 | 山田誠 | 22 |
0007 | 鈴木健司 | 18 |
1) SUM関数について
SUM関数を使用することで、列の値の合計値を求めることができます。
条件:取得したデータのうち、「年齢」の合計値を表示する
SELECT SUM(年齢) FROM 社員情報テーブル;
- 返却されるデータ
SUM(年齢) |
195 |
2) AVG関数について
AVG関数を使用することで、列の値の平均値を求めることができます。
条件:取得したデータのうち、「年齢」の平均値を表示する
SELECT AVG(年齢) FROM 社員情報テーブル;
- 返却されるデータ
AVG(年齢) |
27.8571 |
3) COUNT関数について
COUNT関数を使用することで、NULL以外の値の行数を調べることができます。
条件:取得したデータのうち、「年齢」がNULL以外のデータ数を表示する
SELECT COUNT(年齢) FROM 社員情報テーブル;
- 返却されるデータ
COUNT(年齢) |
7 |
4) MAX関数について
MAX関数を使用することで、列の値の最大値を調べることができます。
条件:取得したデータのうち、「年齢」が一番大きい値を表示します
SELECT MAX(年齢) FROM 社員情報テーブル;
- 返却されるデータ
MAX(年齢) |
41 |
5) MIN関数について
MIN関数を使用することで、列の値の最小値を調べることができます。
条件:取得したデータのうち、「年齢」が一番小さい値を表示します
SELECT MIN(年齢) FROM 社員情報テーブル;
- 返却されるデータ
MIN(年齢) |
18 |
7.グループ化(GROUP BY、HAVINGについて)
ここで説明するグループ化という方法は、主に前述した集計関数とともに使用されます。
指定したカラムの同じデータをグループ化し、別のカラムの合計値、平均値などを表示するのが主な使い方です。
下記に詳しい書き方を説明していきますので、見ていきましょう。
□この章で用いるテーブル
- 社員情報テーブル
社員番号 | 氏名 | 所属部署 | 年齢 |
0001 | 鈴木一郎 | 開発部門 | 41 |
0002 | 佐藤太郎 | 営業部門 | 35 |
0003 | 後藤ヒロシ | 企画部門 | 25 |
0004 | 由浅春香 | IT部門 | 24 |
0005 | 加藤マヤ | 企画部門 | 31 |
0006 | 山田誠 | 営業部門 | 23 |
0007 | 鈴木健司 | 開発部門 | 19 |
1) GROUP BYについて
GROUP BYのうしろに記述したカラムを、同じデータごとにグループ化することができます。
例えば、「各所属部署に配属されている社員それぞれの平均年齢を調べたい」というときには、GROUP BYとAVG関数を組み合わせると取得することができます。
条件:「所属部署」をグループ化し、「年齢」の平均値を表示する
SELECT 所属部署,AVG(年齢) FROM 社員情報テーブル GROUP BY 所属部署;
- 返却されるデータ
所属部署 | AVG(年齢) |
開発部門 | 30 |
営業部門 | 29 |
企画部門 | 28 |
IT部門 | 24 |
2) HAVINGについて
HAVINGとは、グループ化されたデータを絞り込むための構成句です。
前述したWHERE句と似ていますが、WHERE句はグループ化される前のテーブル全体を検索対象としますが、HAVING句はグループ化した後のデータを検索対象とします。
例えば、「各所属部署に配属されている社員それぞれの平均年齢を算出し、さらに平均年齢が29以上を絞り込みたい」というときに使用します。
条件:「所属部署」をグループ化し、「年齢」の平均値が29以上のデータを表示する
SELECT 所属部署,AVG(年齢) FROM 社員情報テーブル
GROUP BY 所属部署 HAVING AVG(年齢) >=29;
- 返却されるデータ
所属部署 | AVG(年齢) |
開発部門 | 30 |
営業部門 | 29 |
7.おわりに
いかがだったでしょうか。
これまでに説明してきたSQLの文法は基本的なものです。
ですが、これらの知識を組み合わせることにより、ある程度複雑な式も構成できますので、ぜひ色々と試してみてください。