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;
    

SQLについて一から勉強し直してみる~SQLとは何か?~

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

はじめに

 

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

今回はSQLの概要として、基本的な文法、データ型、演算子についてまとめます。

 

SQLって何?

 

SQLとは、「データベースを操作するための言語」

データベース(リレーショナルデータベース)を管理する、リレーショナル データベース管理システム(RDBMS)でDB操作のために使用するのがSQL言語です。

主要なRDBMS

SQLはISOで標準化されており、いくつかバージョンがあります。ただしRDBMS各製品には独自機能(いわゆる方言)が存在するので、使用するRDBMSに応じて若干違いはあります。

※今回、学習は基本にPostgreSQLで行っていきます。

 

SQLの概要

 

SQL文のコマンド3種類

SQL文のコマンドは、データ定義言語 (DDL: data definition language)、データ定義言語 (DDL: data definition language)、データ制御言語 (DCL: data control language)の3種類に分類されます。

データ定義言語 (DDL: data definition language)

DBやテーブルの作成、削除などを行う

  • CREATE : DBやテーブルを定義する(作成する)
  • DROP : DBやテーブルを削除する
  • ALTER : DBやテーブル定義を変更する
データ操作言語(DML: data manipulation language)

テーブルの検索、変更などを行う

  • INSERT : テーブルに新規行/データを登録する
  • UPDATE : テーブルを更新する
  • DELETE : テーブルを削除する
  • SELECT : テーブルデータを検索/取り出す ←おそらく一番よく使う
データ制御言語(DCL: data control language)

DBに対する変更を確定したり、消したりする。他にはDBのユーザ権限の変更なども行う。

  • COMMIT : DBに対する変更を確定させる
  • ROLLBACK : DBに対する変更を取り消す
  • GRANT : 特定のユーザに操作の権限を付与する
  • REVOKE : 特定のユーザから権限を剥奪する

  ※他にもありますが、あまり使わないので割愛。

SQL文の基本的な文法ルール

  • 大文字、小文字は区別されない
    ただし、登録されているデータに関してはちゃんと区別される
  • 文字列はシングルクォーテーションで囲う
  • 単語は半角スペースか改行で区切る
  • 1行コメントは "--" で、複数行コメントは "/*" と "*/" で囲う

データ型

数値データ
データ型名 説明 数値の範囲
smallint 2バイト整数 -32768から32767まで
integer 4バイト整数 -2147483648から2147483647まで
bigint 8バイト整数 -9223372036854775808から
9223372036854775807まで
real 単精度浮動小数点数 6桁(-1E+37から1E+37まで)
double precision 倍精度浮動小数点数 15桁(-1E+308から1E+308まで)

numeric(p, s)

decimal(p, s)
高精度数値 最大1000桁
文字列データ
データ型名 説明
character(n) 固定長文字列
character varying(n) 可変長文字列
text 制限なし可変長文字列
日付・時刻データ
データ型名 説明
date 日付
time(p) 時刻
timestamp(p) 日付と時刻
interval(p) 間隔

演算子

算術演算子

演算子 説明
+
-
*
/

比較演算子

演算子 説明

<

小なり
> 大なり
<= 以下
>=

以上

=

等しい

<> または !=

等しくない

BETWEEN min AND max

minとmaxの間

※BETWEEN AND は演算子ではありませんが、同じ動作をするので一緒に書いておきます。

論理演算子

演算子 説明
NOT 否定
AND かつ
OR または
 
演算の返り値NULLについて

「NULLを含む計算は全てNULLを返す」

気を付けておくべきは、比較演算もNULLを返すという点です。SQLの比較演算の結果はTRUE・FALSE・NULLの3種類で、左辺でも右辺でもNULLを含む比較は全てNULLを返します。