SQLの基本文法を徹底解説!

この記事を書いた人
北爪 聖也

株式会社pipon代表取締役。 キャリアはADK(広告代理店)でテレビ広告運用をして残業120時間するが、ネット広告では自分の業務がAIで自動化されていることに驚愕する。そこで、機械学習受託会社に転職し、技術力を身につけた後、piponを創業。現在、製薬業界、大手監査法人、EC業界、様々な業界でAI受託開発事業を運営。

公開日: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について)

kamachiさんによる写真ACからの写真

ここではデータベースからデータを取得し、欲しい情報を表示する方法を説明します。

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企画部門
0004IT部門
0005企画部門

②全てのカラムからデータを取得する方法

全てのカラムを取得したい場合、いちいち全てのカラムを「,」で区切るのは面倒ですよね。

その場合、下記のように記述すれば一括で全カラムを取得できます。

SELECT * FROM 社員情報テーブル;

SELECT句のうしろに「*」(アスタリスク)を書けば、全てのカラムを取得できます。

  • 返却されるデータ
社員番号氏名所属部署年齢
0001鈴木一郎開発部門41
0002佐藤太郎営業部門35
0003後藤ヒロシ企画部門25
0004由浅春香IT部門24
0005加藤マヤ企画部門30

2.特定のデータを指定してデータを抽出する方法(WHERE、演算子について)

シルバーブレットさんによる写真ACからの写真

ここでは、ある特定の条件を付与してそれに該当するデータのみを抽出する方法を説明していきます。

「WHERE」という構成句と、バリエーション豊かな演算子を用いれば任意のデータを取得できますので、覚えていきましょう。

□この章で用いるテーブル

  • 社員情報テーブル
社員番号氏名所属部署年齢
0001鈴木一郎開発部門41
0002佐藤太郎営業部門35
0003後藤ヒロシ企画部門25
0004由浅春香IT部門24
0005加藤マヤ企画部門30
0006山田誠NULL22
0007鈴木健司NULL18

「社員情報テーブル」があらかじめデータベースに登録されているとします。

補足事項として、このテーブルには「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山田誠NULL22
0007鈴木健司NULL18

⑤条件:年齢が25以下のデータのみを取得する(演算子「<=」の使用)

SELECT * FROM 社員情報テーブル WHERE 年齢 <= 25;
  • 返却されるデータ
社員番号氏名所属部署年齢
0003後藤ヒロシ企画部門25
0004由浅春香IT部門24
0006山田誠NULL22
0007鈴木健司NULL18

⑥条件:氏名が「鈴木一郎」と等しくないデータのみを取得する(演算子「<>、!=」の使用)

SELECT * FROM 社員情報テーブル WHERE 氏名 <> '鈴木一郎';

もしくは

SELECT * FROM 社員情報テーブル WHERE 氏名 != '鈴木一郎';
  • 返却されるデータ
社員番号氏名所属部署年齢
0002佐藤太郎営業部門35
0003後藤ヒロシ企画部門25
0004由浅春香IT部門24
0005加藤マヤ企画部門30
0006山田誠NULL22
0007鈴木健司NULL18

2) ワイルドカード検索(LIKE演算子について)

SQLではワイルドカード検索も行えます。

ワイルドカード検索とは、「文字列の始めが〇〇と一致する」、「文字列に△△が含まれている」などの部分的な一致を目的とした検索のことです。

「LIKE」演算子と、「%」(パーセント)を検索する文字列に付与することにより、実現できます。

一致の種別表記
前方一致〇〇〇%
後方一致%〇〇〇
部分一致%〇〇〇%

※〇〇〇は検索する文字列

①条件:氏名が「鈴木」で始まるデータのみを取得する(前方一致)

SELECT * FROM 社員情報テーブル WHERE 氏名 LIKE '鈴木%';
  • 返却されるデータ
社員番号氏名所属部署年齢
0001鈴木一郎開発部門41
0007鈴木健司NULL18

②条件:氏名が「郎」で終わっているデータのみを取得する(後方一致)

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山田誠NULL22
0007鈴木健司NULL18

4) NULLに関する検索(IS NULL 演算子、IS NOT NULL について)

前述しましたが、テーブルのデータには「NULL」という「データが存在しない」といった意味をもつものが存在します。そのNULLデータを取得したい、または抽出から省きたい場合の方法をここでは説明していきます。

①条件:所属部署が「NULL」のデータのみを取得する

SELECT * FROM 社員情報テーブル WHERE 所属部署 IS NULL;
  • 返却されるデータ
社員番号氏名所属部署年齢
0006山田誠NULL22
0007鈴木健司NULL18

②条件:所属部署が「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山田誠NULL22
0007鈴木健司NULL18

3.データの並び替え(ORDER BYについて)

akizouさんによる写真ACからの写真

取得したデータを、「番号を小さい順に並び替えたい」、「年齢を大きい順に並び替えたい」などのあるカラムにおいて昇順、降順にしたい場合は、「ORDER BY」という構成句を使います。

「ASC」を付与することにより昇順、「DESC」を付与することにより降順となります。

□この章で用いるテーブル

  • 社員情報テーブル
社員番号氏名所属部署年齢
0001鈴木一郎開発部門41
0002佐藤太郎営業部門35
0003後藤ヒロシ企画部門25
0004由浅春香IT部門24
0005加藤マヤ企画部門30
0006山田誠NULL22
0007鈴木健司NULL18

①条件:取得したデータを「年齢」を昇順に並び替える

SELECT * FROM 社員情報テーブル ORDER BY 年齢 ASC;

もしくは

SELECT * FROM 社員情報テーブル ORDER BY 年齢;

※昇順降順の条件を付与しない場合、昇順と同じ動きをします。

  • 返却されるデータ
社員番号氏名所属部署年齢
0007鈴木健司NULL18
0006山田誠NULL22
0004由浅春香IT部門24
0003後藤ヒロシ企画部門25
0005加藤マヤ企画部門30
0002佐藤太郎営業部門35
0001鈴木一郎開発部門41

②条件:取得したデータを「社員番号」を降順に並び替える

SELECT * FROM 社員情報テーブル ORDER BY 社員番号 DESC;
  • 返却されるデータ
社員番号氏名所属部署年齢
0007鈴木健司NULL18
0006山田誠NULL22
0005加藤マヤ企画部門30
0004由浅春香IT部門24
0003後藤ヒロシ企画部門25
0002佐藤太郎営業部門35
0001鈴木一郎開発部門41

4.データの最大取得行数(LIMITについて)

紺色らいおんさんによる写真ACからの写真

例えば100行のデータが取得できたとして、「先頭の50行だけを表示してほしい」という場合には、「LIMIT」という構成句を使用します。

LIMIT句は最大取得行数を制御する役割を持ちます。

□この章で用いるテーブル

  • 社員情報テーブル
社員番号氏名所属部署年齢
0001鈴木一郎開発部門41
0002佐藤太郎営業部門35
0003後藤ヒロシ企画部門25
0004由浅春香IT部門24
0005加藤マヤ企画部門30
0006山田誠NULL22
0007鈴木健司NULL18

条件:取得したデータのうち、最大4件まで表示する

SELECT * FROM 社員情報テーブル LIMIT 4;
  • 返却されるデータ
社員番号氏名所属部署年齢
0001鈴木一郎開発部門41
0002佐藤太郎営業部門35
0003後藤ヒロシ企画部門25
0004由浅春香IT部門24

5.重複するデータをまとめる方法(DISTINCTについて)

photoBさんによる写真ACからの写真

取得したデータのなかに同じ文字列の、重複したデータが存在する場合があります。

それらの重複データを1つにまとめたいときは「DISTINCT」という構成句を使います。

□この章で用いるテーブル

  • 社員情報テーブル
社員番号氏名
0001鈴木一郎
0002佐藤太郎
0003後藤ヒロシ
0004鈴木一郎
0005鈴木一郎
0006山田誠
0007佐藤太郎

条件:取得したデータのうち、「氏名」で重複したデータを1つにまとめる

SELECT DISTINCT(氏名) FROM 社員情報テーブル;
  • 返却されるデータ
氏名
鈴木一郎
佐藤太郎
後藤ヒロシ
山田誠

3人いた「鈴木一郎」、2人いた「佐藤太郎」が1つにまとまった形で返却されます。

6.集計関数の扱い方(SUM、AVG、COUNT、MAX、MINについて)

photoBさんによる写真ACからの写真

ここでは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について)

toraemonさんによる写真ACからの写真

ここで説明するグループ化という方法は、主に前述した集計関数とともに使用されます。

指定したカラムの同じデータをグループ化し、別のカラムの合計値、平均値などを表示するのが主な使い方です。

下記に詳しい書き方を説明していきますので、見ていきましょう。

□この章で用いるテーブル

  • 社員情報テーブル
社員番号氏名所属部署年齢
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の文法は基本的なものです。

ですが、これらの知識を組み合わせることにより、ある程度複雑な式も構成できますので、ぜひ色々と試してみてください。