SQLのSELECT文とは?データを抽出するSELECT文の基本的な使い方
SQLの中のDML(Data Manipulation Language:データ操作言語)には、SELECT(抽出)・INSERT(挿入)・UPDATE(更新)・DELETE(削除)がありますが、その中のSELECT文について説明します。
実際SELECT文を使うときは、色々加工する必要がありますが、まずは、SELECT文の基本的な使い方を覚えていきましょう。
1.SELECT文
SELECT文は、テーブルからデータを抽出するときに使います。
とあるテーブル(データの集合体)からどのような条件でデータを抽出してほしいのかを表した命令文です。
1-1.SELECTの基本的な構文
基本的な構文は以下の通りです。
★構文
SELECT列名
FROM テーブル名;
SELECT文の終わりは、「;(セミコロン)」を付けます。
この構文に
- 複数のテーブルを結合
- 列と列を結合
- 演算子を使用して計算
- 列の値をExcelの関数と同じように使用(例えば、何桁目から何桁目の文字を取得など)
- どのような条件でデータを絞りこむのか
- どの順番にデータを並べるか
などさまざまに加工をしてSELECT文を作成することができます。
イメージは、ExcelやWordなどで作成する「マトリック表」です。
【例】社員表
社員番号 | 名前 | 部署名 | 性別 |
00001 | 名前1 | A部署 | 男性 |
00002 | 名前2 | A部署 | 女性 |
00003 | 名前3 | B部署 | 男性 |
00004 | 名前4 | A部署 | 男性 |
00005 | 名前5 | A部署 | 女性 |
00006 | 名前6 | B部署 | 男性 |
「列名」が、縦方向の「列」(社員番号・名前・部署名・性別)
「テーブル」が、「マトリックス表」(社員表)
「レコード」が、横方向の「行」(例えば、00001・名前1・A部署・男性)
1-2.SELECTの使用例
まずは、実際のテーブルとは違いますが、例文を通してSELECT文をイメージしてみましょう。
【例1】テーブルの列名:「社員番号」、「名前」を全データ表示
★構文
SELECT 列名1,列名2, 列名3・・・
FROM テーブル名;
複数の列名を指定する場合は、列名間を「,(カンマ)」で区切ります。
SELECT社員番号,名前 FROM社員表;
出力結果
社員番号 名前 ---------------------------------------------------- 00001 名前1 00002 名前2 00003 名前3 00004 名前4 00005 名前5 00006 名前6
【例2】テーブルの全列名、全データを表示
★構文
SELECT *
FROM テーブル名;
または
SELECT 列名1,列名2,列名3・・・
FROM テーブル名;
全項目を指定する場合は、全列名を一つずつ指定でも「*(アスタリスク)」を指定でも同じ意味になります。
●全列名を一つずつ指定した場合
SELECT社員番号,名前,部署名,性別 FROM社員表;
●*(アスタリスク)を使用した場合
SELECT * FROM 社員表;
出力結果
社員番号 名前 部署名 性別 ---------------------------------------------------- 00001 名前1 A部署 男性 00002 名前2 A部署 女性 00003 名前3 B部署 男性 00004 名前4 A部署 男性 00005 名前5 A部署 女性 00006 名前6 B部署 男性
【例3】テーブルの全列名、「A部署」だけのデータを表示
★構文
SELECT *
FROM テーブル名
WHERE列名 比較演算子 条件値;
または
SELECT 列名1,列名2,列名3・・・
FROM テーブル名
WHERE列名 比較演算子 条件値;
列名の値が文字の場合は、文字を「’(シングルクォーテーション)」で囲みます。
列名の値が数字の場合は、数字をそのまま「’(シングルクォーテーション)」で囲みは不要です。
※この例では、‘A部署‘になります。
【参考】WHERE句で使用できる比較演算子
比較演算子 | 説明 |
= | 等しい |
< | 小さい |
> | 大きい |
<= | 以下 |
>= | 以上 |
<> または != | 等しくない |
SELECT * FROM社員表WHERE 部署名 = 'A部署';
出力結果
社員番号 名前 部署名 性別 ---------------------------------------------------- 00001 名前1 A部署 男性 00002 名前2 A部署 女性 00003 名前3 B部署 男性 00004 名前4 A部署 男性 00005 名前5 A部署 女性 00006 名前6 B部署 男性
【例4】テーブルの全列名、「A部署」だけのデータで、「社員番号」で昇順(多い順)・降順(少ない順)に表示
★構文(昇順)
SELECT *
FROM テーブル名
WHERE列名 比較演算子 条件値
ORDER BY 列名;
または
SELECT 列名1,列名2,列名3・・・
FROM テーブル名
WHERE 列名 比較演算子 条件値
ORDER BY 列名;
★構文(降順)
SELECT *
FROM テーブル名
WHERE 列名 比較演算子 条件値
ORDER BY 列名 DESC;
または
SELECT 列名1,列名2,列名3・・・
FROM テーブル名
WHERE 列名 比較演算子 条件値
ORDER BY 列名 DESC;
●全列名を一つずつ指定した場合(昇順)
SELECT社員番号,名前,部署名,性別 FROM社員表 WHERE 部署名 = 'A部署' ORDER BY社員番号;
●*(アスタリスク)を使用した場合(昇順)
SELECT * FROM 社員表 WHERE 部署名 = 'A部署' ORDER BY社員番号;
出力結果
社員番号 名前 部署名 性別 ---------------------------------------------------- 00001 名前1 A部署 男性 00002 名前2 A部署 女性 00004 名前4 A部署 男性 00005 名前5 A部署 女性
●全列名を一つずつ指定した場合(降順)
SELECT社員番号,名前,部署名,性別 FROM社員表 WHERE 部署名 = 'A部署' ORDER BY社員番号 DESC;
●*(アスタリスク)を使用した場合(降順)
SELECT * FROM社員表 WHERE 部署名 = 'A部署' ORDER BY社員番号 DESC;
出力結果
社員番号 名前 部署名 性別 ---------------------------------------------------- 00005 名前5 A部署 女性 00004 名前4 A部署 男性 00002 名前2 A部署 女性 00001 名前1 A部署 男性
2.実際の列名の値の加工内容を確認 ~覚えておくと便利なDUAL表~
ある程度、SELECT文を作成に慣れてくると、列名の値を加工して出力することが多くなります。
列名の値の加工内容を確認するのに「DUAL表」を覚えておくと便利です。
【例】SELECT文で出力するときの日付の表示形式を「YYYY/MM/DD」の表示にしたい
●ORACLEの場合、日付の表示形式の確認方法
SELECT SYSDATE FROM DUAL;
●DB2の場合、日付の表示形式の確認方法
SELECT SYSDATE FROM SYSIBM.DUAL;
出力結果
SYSDATE ------------------- 2018-12-09 00:00:00
実際そのまま使用しようした場合、表示したい形式と違うことがわかった場合、SELECT文の日付の表示形式を加工します。
●ORACLEの場合
SELECT TO_CHAR(SYSDATE,’YYYY/MM/DD’) FROM DUAL;
●DB2の場合
SELECT TO_CHAR(SYSDATE,’YYYY/MM/DD’) FROM SYSIBM.DUAL;
出力結果
SYSDATE ------------------- 2018/12/10
※ご使用のRDBにより、「DUAL表」、日付の表示なども異なりますので、ご利用する前に環境のご確認をお願い致します。
3.さいごに
以上、SQL SELECTについての基本的な使い方をまとめました。
本来ならキーワードや文字列や計算など加工して表示するときに使用する関数などがありますが、さまざまな加工方法は、応用になりますので、まずは、基本的な構文をしっかり理解した方がよいかもしれません。
初めてSELECT文を使う方には、抵抗があるかもしれませんが、この記事を読んで、参考になるところがあれば光栄です。
コメント