SQLについて一から勉強し直してみる~SELECT文で何ができる?~

最終更新日(2023/11/14)

はじめに

 

業務でSQLを使うことになりました。大学で講義を受けて以来なので、学習を兼ねてアウトプットしていく記事です。

↓この記事の第2弾です。

 

houjichan.hatenablog.jp

 

今回はデータ抽出を行うSELECT文の使い方や、良く使うコマンドについてまとめていきます。

※学習や記述しているSQLは基本的にPostgreSQLです。

 

SELECTで何ができるか?

 

SELECT は指定したデータを取得することができます。


    SELECT 取得したいもの;
  

例えば、「100 * 100」の値が知りたければ以下のように記述します。


    SELECT 100 * 100;
    

データベースのテーブルの中身を取得したい場合は、以下のような記述になります。


    SELECT col_name1 [, col_name2 ...] FROM table_name;
    

ここで、FROM は、DBから検索元となるテーブルを指定することができます。
DBの操作では、この FROM を使った書き方を多用します。

また、SQLではワイルドカード( * )が使えるので、テーブルのすべてのデータを取得したい場合は以下のように記述できます。


    SELECT * FROM table_name;
    

よく見る基本のSELECT文ですね。

 

SELECT文の処理経

 

FROM句:テーブルの指定

JOIN句:指定したテーブルを結合

WHERE句:条件指定

GROUP BY句:集計関数のためのグループ化

HAVING句:集計関数のためのグループ化

SELECT句:取得

ORDER BY句:ソート

LIMIT句:取得するデータの行数を指定

 

これらのコマンドを組み合わせることで、目的に合わせたデータを取得することができます。

以下でそれぞれのコマンドでできることや使い方をまとめていきます。

 

FROM:テーブルの指定

先ほども述べた通り、FROM は取得元のテーブルを指定することができます。


    SELECT col_name1 [, col_name2 ...] FROM table_name;
    

 

JOIN:テーブルの結合

FROM で指定したテーブルを結合することができます。


    SELECT table_name1.col_name [, table_name2.col_name ...] FROM table_name1 JOIN table_name2;
    

結合の方法は、CROSS JOIN:クロス結合、INNER JOIN:内部結合、OUTER JOIN:外部結合の3種類があります。

また、取得するカラムを指定する際、table_name1 と table_name2 に同じカラム名がある場合は table_name1.col_name のように取得元テーブルを指定することができます。

 

WHERE:絞り込み

FROM で指定したテーブルに対して、行の絞り込みをすることができます。


    SELECT col_name FROM table_name WHERE 条件式;
    

条件式の部分は、演算子を使った検索条件を記述します。

演算子を使用するので、返り値がBool型になるような式を記述する、といった感じです。


    -- col_nameの値がAと等しい
    WHERE col_name = A
    -- col_nameの値がA以上B以下
    WHERE col_name >= A AND col_name <= B
    WHERE col_name BETWEEN A AND B
    -- col_nameの値がA,B,Cのどれか
    WHERE col_name IN (A, B, C)
    
条件式と検索方法について

条件式の書き方次第で検索方法が異なります(シーケンススキャンとインデックススキャンとか)。パフォーマンスに影響する部分なのでこれも別の機会にしっかり理解しておきたいところ。

 

GROUP BY:集計関数のためのグループ化(抽出条件指定)

SELECT に GROUP BY を付けることで、グルーピングしたいカラムをもとに、集約関数を使って合計や平均、最小値や最大値、カウントなどができるようになります


    SELECT category_name, SUM(numeric_data) FROM table_name GROUP BY category_name;
    

上のコードでは、category_name でグループ化した numeric_data の合計値を集計して取得しています。

 

HAVING句:グループ化の後のグループ化(抽出条件指定)

GROUP BY と同じく、グループ化をすることができます。GROUP BY との違いは、呼び出される順番です。

WHERE:グループ化をされる前データ(元々のデータ)での抽出条件を指定できる
HAVING:グループ化した後のデータでの抽出条件を指定できる

使い方は GROUP BY と同じです。


    SELECT category_name, SUM(numeric_data) FROM table_name HAVING category_name;
    

 

ORDER BY:ソート

データを指定した列の値でソートすることができます。

昇順はASC、降順はDESCを最後に付けます。


    SELECT col_name FROM table_name ORDER BY sort_col_name ASC|DESC;
    

 

LIMIT:取得するデータの行数を指定

データを取得する時に、取得するデータの行数の上限を設定することができます。


    SELECT col_name1 [, col_name2 ...] FROM table_name LIMIT [offset,] row_count;
    

row_count に取得するデータの最大行数を設定できます。 offset は何番目からのデータを取得するのかを設定でき、省略可能です(省略した場合は 0 となります)。offset が n だった場合は n+1 番目のデータから取得します。


    -- 最大で5行取得する
    SELECT col_name1 [, col_name2 ...] FROM table_name LIMIT 5;
    -- 3行目から最大で5行取得する
    SELECT col_name1 [, col_name2 ...] FROM table_name LIMIT 2, 5;
    

 

その他(AS, DISTINCT)

ここからはその他の良く使うコマンドをいくつか紹介します。

 

AS:データに別名を付ける

データ(列名やテーブル)に任意の別名を付けることができます。


    SELECT column_name AS new_column_name FROM table_name;
    

DISTINCT:重複の削除

取得したデータから重複する行を削除することができます。

以下のSQL文では、列 column_name の中から重複しないデータのみを取得できます。


    SELECT DISTINCT column_name FROM table_name;