MySQL 入門

MySQL SELECT 文

SELECT ステートメントは、MySQL データベースに保存されている情報を照会(クエリ)するための主要なメカニズムです。SELECT クエリを実行すると、データベースエンジンは指定されたテーブルをスキャンし、「結果セット(result set)」を返します。これは、リクエストに一致するデータを含む仮想的なテーブルです。

1. テーブル全体の取得

テーブル内のすべての列(カラム)と行(レコード)を表示するには、アスタリスク(*)ワイルドカードを使用します。この演算子は、「テーブル構造で定義されているすべてのカラム」のプレースホルダーとして機能します。

-- city(都市)テーブルからすべてのカラムを取得
SELECT * FROM city;

SELECT * は、データの確認やデバッグには非常に効率的ですが、本番環境(プロダクション環境)で使用されることはほとんどありません。不要なデータをリクエストすると、データベースサーバーとアプリケーション間のネットワークトラフィックが増大し、メモリ使用量も増加するためです。常に、必要なカラムのみを取得するように心がけましょう。

2. 特定のカラムの指定

結果の範囲を絞り込むには、取得したいカラム名をカンマで区切って明示的に記述します。

-- 都市名(Name)と人口(Population)のみを取得
SELECT Name, Population FROM city;

特定のカラムリストを定義すると、基盤となるテーブル構造内の物理的な順序に関係なく、MySQL はクエリに記述された正確な順序でデータを返します。

3. エイリアス(別名)の活用

SELECT 文が返す結果は、データベーステーブルのカラム名を継承します。これらの名称が技術的すぎて理解しにくい場合は、AS キーワードを使用して、クエリの実行中にカラムへ一時的な「エイリアス(alias / 別名)」を割り当てることができます。

-- エイリアスを使用して出力を読みやすくする
SELECT 
    Name AS City_Name, 
    Population AS Total_Residents 
FROM city;

エイリアスはテーブルの実際の構造を変更しません。現在のウィンドウやアプリケーションにおける結果セットの表示方法を変更するだけです。

4. データ取得の論理フロー

クエリを実行すると、MySQL エンジンはリクエストされたデータを特定して返すために、一連の操作を実行します。

  1. クライアントが SELECT クエリを送信
  2. パーサー(Parser):構文の妥当性を検証
  3. オプティマイザ(Optimizer):データを取得するための最適なパス(実行計画)を決定
  4. ストレージエンジン(Storage Engine):テーブルから行を読み取る
  5. プロジェクション(Projections)の適用:リクエストされたカラムのみを選択
  6. 結果セットをクライアントに返却

5. DISTINCT による重複の除去

多くのシナリオにおいて、カラム内の一意な(ユニークな)値だけを知りたい場合があります。例えば、city テーブルにどのような国が含まれているかを知りたい場合、単純なクエリでは数千行が返される可能性があります。DISTINCT キーワードを使用すると、重複する値を 1 つのエントリにまとめることができます。

-- cityテーブルに存在する一意な国コード(CountryCode)のリストを取得
SELECT DISTINCT CountryCode FROM city;

複数のカラムに対して DISTINCT を使用する場合、MySQL はそれらのカラムの組み合わせを一意の識別子として扱います。ある行の指定されたすべてのカラムが以前の行と完全に一致する場合にのみ、その行は除外されます。