SELECT文は、データベースからデータを取得する最も基本的なSQL命令です。基本構文は SELECT カラム名 FROM テーブル名; で、指定したテーブルから特定の列や全データ (*) を抽出します。WHERE句で条件絞り込み、ORDER BY句で並べ替え、LIMIT句で件数制限が可能です。

画像参照:https://itpfdoc.hitachi.co.jp/manuals/3000/30006504O0/HSQL0007.HTM
基本的なSELECT文の構成要素
- SELECT [列名]: 取得したい列を指定。複数ある場合はカンマ
,で区切る。 - FROM [テーブル名]: データを取得するテーブルを指定。
- ; (セミコロン): SQL文の終了を示す。
主な操作例
- 全列を取得:
SELECT * FROM users;(usersテーブルの全列・全行) - 特定列を取得:
SELECT name, email FROM users; - 条件で絞り込み (WHERE):
SELECT * FROM users WHERE age >= 20; - 並べ替え (ORDER BY):
SELECT * FROM users ORDER BY age DESC;(降順) - 件数制限 (LIMIT):
SELECT * FROM users LIMIT 10;(上位10件)
注意点
- 文字列データはアポストロフィ
'で囲む。 - 列名やテーブル名に予約語と同じ名前を使う場合はダブルクォーテーション
"で囲む。 - 大文字・小文字は通常区別されないが、テーブル名などが区別される環境もあるため注意。
条件式
条件式は下記のように記載します。
| 条件式 | 意味 | 条件式 | 意味 |
|---|---|---|---|
| 列名=X | 列の値=X | 列名<>X | 列の値≠X |
| 列名<X | 列の値<X | 列名<=X | 列の値≦X |
| 列名>X | 列の値>X | 列名>=X | 列の値≧X |
| 列名 IS NULL | 列の値=空値 | 列名 IS NOT NULL | 列の値≠空値 |
| 条件式 | 意味 |
|---|---|
| 列名 BETWEEN X AND Y | X≦列の値≦Y |
| 列名 IN (A,B,C) | 列の値がA,B,Cのいずれか |
| 列名 NOT IN (A,B,C) | 列の値がA,B,Cのいずれかでもない |
| 列名 LIKE パターン | 列の値がパターンに一致する |
補足
上記表のパターンの表記方法は下記の2種類です。
%・・・0字以上の任意の文字列を表します。
_・・・任意の1字を表します。
ORDER BY
ORDER BY句は、SELECT文で取得したデータを指定したカラム(列)に基づいて昇順(ASC)または降順(DESC)に並べ替える機能です。通常、WHERE句の後に記述し、数値、文字列、日付などに対応しており、複数列による並べ替えや省略時は昇順がデフォルトです。
主な特徴と使い方
- ソート方向の指定:
- 昇順 (
ASC): 小さい順、古い順、A-Z、あいうえお順(省略可能)。 - 降順 (
DESC): 大きい順、新しい順、Z-A、逆あいうえお順。
- 昇順 (
- 記述場所:
SELECT文の最後(WHERE句の後)。 - 複数列の指定:
ORDER BY 列1, 列2のようにカンマで区切ると、列1で同値の場合に列2で並べ替えます。 - 列の数値指定: 列名の代わりに
SELECTで指定した列の順番(1, 2, 3…)を数字で指定可能です。
基本的なSQL構文
sql
SELECT カラム1, カラム2
FROM テーブル名
WHERE 条件
ORDER BY カラム1 [ASC|DESC], カラム2 [ASC|DESC];
使用例
- 昇順(デフォルト):
ORDER BY age(年齢の若い順) - 降順:
ORDER BY age DESC(年齢の高い順) - 複数列:
ORDER BY score DESC, name ASC(点数が高い順、同じ場合は名前の辞書順)
注意点
ORDER BYで指定した式に集計関数は使用できません。- NULL値は一般的に、昇順の場合は一番最後、降順の場合は一番最初に配置されます。
ORDER BY句がない場合、結果の順序は保証されません。
集計関数
複数の行から合計(SUM)、平均(AVG)、件数(COUNT)、最大(MAX)、最小(MIN)などの単一の計算結果を算出する機能です。
DISTINCT
DISTINCTは、SELECT文で取得するデータから重複する行を除外し、ユニーク(一意)な結果のみを返すキーワードです。主に「種類の一覧」や「重複のないリスト」を取得する際に使用され、SELECT DISTINCT カラム名の形式で指定します。NULL値も1つの値として扱われます。

画像参照:https://z-marketing.net/sql-distinct/
特徴と主な用途
- 重複除外:
SELECT句の直後に配置し、指定したカラムの組み合わせが同じ行を1行にまとめます。 - データ確認: ある列にどのような値が存在するか(種類)を調べる際に有用です。
- 複数列の指定: カンマ区切りで複数指定でき、それらの組み合わせが異なるものを抽出します。
- COUNTとの併用:
COUNT(DISTINCT カラム名)で重複を含まないデータ数を取得できます。 - 注意点: 大規模なデータセットでは処理速度が低下する可能性があります。
基本構文
sql
SELECT DISTINCT カラム名1, カラム名2
FROM テーブル名;
使用例
顧客テーブル(customers)から、住んでいる都道府県(prefecture)のユニークなリストを取得する。
sql
SELECT DISTINCT prefecture FROM customers;
GROUP BYとの違い
- DISTINCT: 単純に重複を排除する場合に使用。
- GROUP BY: 集計関数(SUM、AVGなど)を使用する際や、特定のグループごとにデータをまとめたい場合に使用。
表の結合(JOIN):推奨
JOIN句は、共通のキー列を用いて複数のテーブルを横方向に結合し、1つのデータセットとして取得する操作です。主にINNER JOIN(内部結合:一致する行のみ)、LEFT JOIN(左外部結合:左テーブルを全表示)、RIGHT JOIN(右外部結合)の3種類が利用され、データ正規化された表を関連付けて抽出できます。

画像参照:https://www.uncovertruth.co.jp/dx-accelerator/blog/articles/sql/053/
主要なJOINの種類
- INNER JOIN(内部結合): 結合条件を満たす両方のテーブルの行のみを抽出します。一致しないデータは除外されます。
- LEFT JOIN(左外部結合): 左側(FROM句側)のテーブルの行をすべて含み、右側のテーブルで一致する行がなければNULLを返します。
- RIGHT JOIN(右外部結合): 右側のテーブルの行をすべて含み、左側で一致する行がなければNULLを返します。
- FULL OUTER JOIN(完全外部結合): 両方のテーブルのすべての行を取得し、一致しない箇所はNULLを補完します。
- CROSS JOIN(クロス結合): 2つのテーブルの全ての組み合わせ(デカルト積)を出力します。
JOINの基本文法
sql
SELECT テーブルA.列名, テーブルB.列名
FROM テーブルA
JOIN テーブルB
ON テーブルA.共通キー = テーブルB.共通キー;
3つ以上のテーブルを結合する場合
JOINを繋げて記述します。
sql
SELECT *
FROM テーブルA
INNER JOIN テーブルB ON テーブルA.id = テーブルB.a_id
INNER JOIN テーブルC ON テーブルB.id = テーブルC.b_id;
利用シーンと注意点
- 利用シーン: 正規化されたデータベースにおいて、社員テーブルと部署テーブルを結合するなど、データを分割管理している場合。
- 注意点: 内部結合はデータが欠落する可能性があり、外部結合は結果のレコード数が多くなる可能性があるため、目的(全てのデータを残すか、一致データのみか)に応じて選択する。
基本的な結合方法(INNER JOIN/LEFT JOIN)をマスターすることで、複雑なデータ分析が可能になります。
表の結合(WHERE):非推奨
前提
WHERE句は、SQLにおいてデータベースからデータを取得、更新、削除する際に、特定の条件を満たすレコード(行)だけを絞り込むために使用するキーワードです。
WHERE句でのテーブル結合は、FROM句にテーブルをカンマ区切りで列挙し、WHERE句で結合条件(キーの対比)を指定する手法です。主に内部結合(INNER JOIN)に使用され、table1.id = table2.idのように条件を記述します。現代のSQLではJOIN句が推奨されますが、この方法は古くから使用されています。
WHERE句による結合のポイント
- 記述方法:
SELECT * FROM テーブルA, テーブルB WHERE テーブルA.共通ID = テーブルB.共通ID; - 処理: テーブルのデカルト積(クロス結合)を作成した後、
WHERE句の条件で一致する行を抽出するため、大規模データでは性能が低下する場合があります。 - 用途: 内部結合(INNER JOIN)に特化しています。
- 注意点: 結合条件の記述漏れがクロス結合(全組み合わせ)になり、予期せぬ巨大な結果セットを生成するリスクがあります。
- Oracle外部結合: かつてのOracle環境では、
WHERE句で(+)演算子を用いて外部結合を行っていました。
現代的なアプローチ(推奨)JOIN句を用いた明示的な結合(INNER JOIN, LEFT JOIN)は、結合条件と絞り込み(WHERE句)が分離されるため、視認性と保守性が高いため推奨されます。

コメント