SQLは、関係データベースの定義・操作をおこなう言語です。
SQL = Structured Query Language
・Structured … 構造化
・Query … 問合せ
・Language … 言語
「データベース」とは、データを一定のルールで蓄積し、必要に応じて取り出せるようにしたものです。SQLで扱う、関係データベース(Relational Data Base)は、データを行と列の表で表します。
1. SQLの構文
データベース操作を指示する、いろんな構文がありますが、1番使うのはSELECT文です。
2. SELECT文:特定の列を表示させる
データの抽出(検索)は、SELECT文で指定します。
SELECT文は、主に 3つの句で構成されます。
SELECT 列名1,列名2,~列名n
FROM 表名(テーブル名)
WHERE 抽出条件
2-1. 計算式の列を表示する(SELECT句)
SELECT文のSELECT句では、列名のほかに計算式を記述することもできる。
演 算 | 演算子 |
---|---|
加算 | + |
減算 | – |
乗算 | * |
除算 | / |
2-2. 列に別の名前を付ける(SELECT句、AS)
列名 AS 表示させたい列名
2-3. 条件に一致した行の抽出(WHERE句)
WHERE 列名 LIKE パターン文字列
2-4. WHERE句の条件式
WHERE句の条件には、計算式を記述することができます。
WHERE 年齢 >= 19 AND 年齢<=21
WHERE 年齢 BETWEEN 19 AND 21
WHERE 年齢 IN(19,20,21)
2-5. 抽出結果を昇順または降順に並べ替える(ORDER BY句)
SELECT文の最後に ORDER BY句をつけると、並べ替え(ソート)できます。
ORDER BY 列名 ASC (デフォルト)
ORDER BY 列名 DESC
ASC | 昇順(小→大) ascend |
DESC | 降順(大→小) descend |
2-6. 重複した行をまとめる(SELECT句、DISTINCT)
結果の列に同じデータが含まれる場合に、重複を削除することができます。
SELECT DISTINCT 出身地
FROM 学籍表
3. 表の結合と内部結合
関係データベースでは、複数の表を結合して、結果を表示します。
結合方法には、内部結合と外部結合の2種類あります。
内部結合では、両方の表で一致する行だけを表示させます。2つの方法があります。
外部結合は、どちらかの表に含まれる行を表示させます。
通常は、内部結合で求める結果が得られることが多いです。
3-1. FROM句に複数の表を入力する
SELECT *
FROM 売上表,顧客表
FROMに表を複数入れると、掛けた表が返される。
WHERE句に結合条件を入力する
SELECT 列名1,列名2,~列名n ← どの列を表示させるか
FROM 表名(テーブル名) ← どの表(テーブル)から
WHERE 表名1.列名 = 表名2.列名
3-2. 表に別の名前を付ける(FROM句、AS)
FROM 表の名前 AS 表の別の名前
FROM 表の名前 表の別の名前
(ASは省略可能)
3-3. 表の自己結合
同じ表の別の列を関連付けるときには、同じ表をFROM句に2回記述します。WHERE句で条件を指定するために、表に別名を付けます。
SELECT 社員表.社員名,リーダー.社員名 AS リーダー
FROM 社員表,社員表 リーダー
WHERE 社員表.リーダー=リーダー.社員No
3-4. INNER JOINを使って表を結合する
SELECT文において複数の表を結合するときはWHERE句で結合条件を指定するほかにFROM句でINNER JOINを指定して表を結合することもできる。
INNER JOIN句で表を指定して、ON句で結合条件を指定します。
SELECT 列名1,列名2,~列名n ← どの列を表示させるか
FROM 表名1 INNER JOIN 表名2
ON 表名1.フィールド名 = 表名2.フィールド名
WHERE 抽出条件
INNER JOINのパターンでON句で結合条件を指定しています。
SELECT *
FROM 売上表 INNER JOIN 顧客表
ON 売上表.顧客CD=顧客表.顧客CD
これは、WHERE句で結合条件で指定するパターンと結果は同じです。
SELECT *
FROM 売上表, 顧客表
WHERE 売上表.顧客CD=顧客表.顧客CD
4. グループ化・集計を行う(GROUP BY句)
SELECT文にGROUP BY句を指定して、行をグループ化すると、同一グループ内における列の値の合計や平均などを計算することができようになります。
SELECT 列名1,列名2,~列名n
FROM 表名1,表名2,表名n
WHERE 抽出条件
GROUP BY 列名1,列名2
関 数 | 機能 | 記述例 |
---|---|---|
SUM | 合計を求める | SUM(列名または、計算式) |
AVG | 平均を求める | AVG(列名または、計算式) |
MAX | 最大値を求める | MAX(列名または、計算式) |
MIN | 最小値を求める | MIN(列名または、計算式) |
COUNT | 行数を求める | COUNT(列名),COUNT(*) |
4-1. グループ化されたデータを並べ替える(GROUP, ORDER)
ORDER BYの列名に、計算式を入力できます。
SELECT 売上No,SUM(単価*数量)
FROM 商品表, 売上明細
WHERE 商品表.商品CD=売上明細.商品CD←表の結合
GROUP BY 売上No ← 売上Noでグループ化をおこなう
ORDER BY SUM(単価*数量) DESC←合計金額の降順にソート
4-2. グループ化されたデータから条件にあったグループを抽出(HAVING句)
グループ毎に、条件を満たすデータが存在するか調べるには、HAVING句を使います。
SELECT 列名1,列名2, ~列名n
FROM 表名1,表名2,~表名n
WHERE 抽出条件 ← 表の結合条件を記述する
GROUP BY 列名1,列名2 ← 指定された列の値でグループ化
HAVING 抽出条件 ← 抽出条件
5. 外部結合ですべての行を表示させる
左右いずれかの表を優先させたいときに指定する。
該当するデータがない部分は、NULL(ヌルまたはナル)が表示されている。
5-1. LEFT JOINとRIGHT JOINで表を結合する
これは、表の結合したときに指定された表(左右いずれか)を優先して表示を行う指定である。
SELECT 列名1,列名2,~列名n
FROM 表名1 LEFT JOIN 表名2
ON 表名1.フィールド名 = 表名2.フィールド名
WHERE 抽出条件
6. 抽出結果を元にさらに抽出をおこなう(サブクエリー)
別の表で抽出した結果を、検索条件にしています。
(売上表の売上No=1)
→(顧客コード)
→(顧客表の顧客名)
SELECT 顧客名
FROM 顧客表
WHERE 顧客CD=(
SELECT 顧客CD
FROM 売上表
WHERE 売上No=1
)
6-1. 表の結合と副問い合わせを組み合わせた抽出
(商品表のAVG(単価))
→(単価 > AVG(単価))
→(売上明細の単価・数量)
SELECT 売上No,単価,数量,単価*数量
FROM 商品表,売上明細
WHERE 商品表.商品CD=売上明細.商品CD
AND 単価>=(
SELECT AVG(単価)
FROM 商品表
)
6-2. 副問い合わせの結果が複数になる場合(IN述語)
(売上表の”2001/06/27″)
→(売上No)
→(売上表の単価・数量)
SELECT 売上No,商品名,単価,数量,単価*数量
FROM 商品表,売上明細
WHERE 商品表.商品CD=売上明細.商品CD
AND 売上No IN(
SELECT 売上No
FROM 売上表
WHERE 日付="2001/06/27"
)
6-3. 相関副問い合わせ(EXISTS述語)
主問い合わせの表の1行ごとに、EXISTSを指定された副問い合わせを実行し、指定されたデータが存在した行だけが抽出される。
(商品表の商品コード)
→(売上明細の商品コード)
→(含まれるものだけ表示)
SELECT 商品CD,商品名
FROM 商品表
WHERE EXISTS (
SELECT *
FROM 売上明細
WHERE 売上明細.商品CD = 商品表.商品CD
)
こちらもどうぞ。