SQLのselect文を使ったサンプルを集めました。
以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用しています。
select文の基本的な使い方
select文の基本的な構文は以下の通りです。
select カラム名1,カラム名2… from テーブル名 where 抽出条件
例えば、以下のSQLはemployees(社員テーブル)から、hire_date(雇用日)が1990/01/01以降のレコードの全てのカラム(*)を抽出するselect文になります。
SELECT * FROM `employees` where hire_date > '1990/01/01'
実行結果はこうなります。
select文のサンプルコード集
likeであいまい検索
where節の条件にlikeを使うと、%(パーセント)記号をワイルドカードにして、あいまい検索を行うことが可能です。
以下のSQLは、employees(社員テーブル)から、first_name(姓名の名)がYで始まるレコードを全て(*)抽出します。
SELECT * FROM `employees` where first_name like 'Y%'
実行結果はこうなります。
ワイルドカード文字は「%」以外に、「_」(アンダースコア)があり、任意の1文字にマッチします。
DBMSによっては、あいまい表現指定に正規表現が使えます。例えば、MySQLのばあいはREGEXP演算子を使って、正規表現が使用可能です。
【関連記事】
▶sql likeを使ったサンプル集 likeは本当に遅いのか?
重複行を除いて抽出する distinct
select文のカラム指定の前にdistinctをつけると、重複行を除外してデータを取得します。
以下のSQLは、社員テーブル(emplyees)のfirst_name(姓名の名)を重複を除いて抽出します。
SELECT distinct first_name FROM `employees`
実行結果はこうなります。
countと組み合わせてデータの種類(重複除外後にcount)を取得したり、group byでの置き換えも可能です。distinct使用時には、暗黙のソートが発生するので、order byと組み合わせる場合には注意しましょう。
【関連記事】
▶SQLで重複データを扱うサンプルコード集 カウント、集計、最新のみ抽出、重複禁止
件数をカウントするcount
select文のカラム名指定にcount()関数を使うと、取得データの件数を取得可能です。
以下のSQLは、employees(社員テーブル)のデータ件数を取得します。
SELECT count(*) FROM `employees`
count(カラム名)と指定した場合、対象カラム名がNULLの場合はカウントされません。
countは集計関数と呼ばれ、group byと組み合わせて使うことで、データ種類ごとの件数を取得することも可能です。
【関連記事】
▶SQLで重複データを扱うサンプルコード集 カウント、集計、最新のみ抽出、重複禁止
selectした取得行を別テーブルにinsertする
既存のテーブルにselectした取得行をinsertするには以下のようにします。
insert into コピー先テーブル名 select * from コピー元テーブル名
また、selectした行で新規にテーブルを作るには、以下のようにします。
create table コピー先テーブル名 select * from コピー元テーブル名
以下のSQLは、employees(社員テーブル)から、emp_no(社員番号)が20000以下、first_name(姓名の名)がAから始まる、gender(性別)が女性(F)のデータを抽出し、新たなテーブルemployees_copyを作成するSQLです。
create table employees_copy select * from employees where emp_no < 20000 and first_name like 'A%' and gender = 'F'
実行するとemployees_copyという新しいテーブルができます。employees_copyの内容は以下のようになります。
case式を使ったselect文
case式を組み合わせると、select文に条件分岐を組み込むことが可能です。
以下のSQLは、departments(部署テーブル)から、dept_no(部署番号)と、日本語の部署名をcase文で判定して取得します。
日本語の部署名は、dept_name(部署名)がProducttionなら「製造部門」、Salesなら「営業部門」、Developmentなら「開発部門」、それ以外は「それ以外」と表示します。case式で表示するカラム名をjpnameとしています。
SELECT `dept_no`, case `dept_name` when 'Production' then '製造部門' when 'Sales' then '営業部門' when 'Development' then '開発部門' else 'それ以外' end as jpname FROM `departments`
実行結果はこうなります。
【関連記事】
▶SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ
複数行をjoin(結合)してselect
複数行を結合してデータを取得するには、select文とjoinを組み合わせます。
以下のSQLは、employees(社員テーブル)、dept_emp(社員・部署紐付けテーブル)、departments(部署テーブル)を結合して、emp_no(社員番号)、first_name(姓名の名)、last_name(姓名の姓)、dept_name(部署名)を表示します。
SELECT employees.emp_no, first_name, last_name, dept_name FROM `employees` left join dept_emp on employees.emp_no = dept_emp.emp_no left join departments on dept_emp.dept_no = departments.dept_no
実行するとこうなります。
結合方法には、inner join、outer joinなど複数の方法があります。また、joinの記述次第でパフォーマンスが大きく変わることがあるため、注意が必要です。
【関連記事】
▶SQL Joinサンプル集 Joinで遅いSQLの原因を調べる方法
order byで取得行をソートする
select文にorder byを組み合わせると、取得行をソートすることができます。
以下のSQLは、employees(社員テーブル)を、birth_date(誕生日)順にソートして取得します。
SELECT * FROM `employees` order by birth_date
実行結果はこうなります。
order by desc 指定で降順、order by asc指定で昇順ソートになります。省略してorder byのみの場合は昇順ソートになります。
order byに複数カラムを指定するには、order by カラム名1、カラム名2…と、カンマで区切って指定します。
なお、降順、昇順の指定はカラムごとに変えられます。
以下のSQLは、employees(社員テーブル)をbirth_date(誕生日)で昇順、hire_date(雇用日)で降順にソートして取得します。
SELECT * FROM `employees` order by birth_date asc ,hire_date desc
まとめ
select文の基本的な使い方を紹介しました。
- likeであいまい検索
- distinctで重複除外
- countで件数を数える
- select内容で別テーブル作成やinsertが可能
- case式でselect文の条件分岐を組み込める
- joinで、複数テーブルを結合
- order byでソート可能
上記以外にも、サブクエリやgroup byでの小計、平均、偏差値の計算など便利な応用応用方法があります。まずは、selectの基本部分を抑えておきましょう。