スポンサーリンク

【応用情報技術者試験】データベースを学ぼう!     ~第5章~SQL① 基本的なSELECT文

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 YX≦列の値≦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];

使用例

  1. 昇順(デフォルト)ORDER BY age (年齢の若い順)
  2. 降順ORDER BY age DESC (年齢の高い順)
  3. 複数列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 JOINLEFT JOIN)は、結合条件と絞り込み(WHERE句)が分離されるため、視認性と保守性が高いため推奨されます。

コメント