スポンサーリンク
スポンサーリンク

SQLって何? SELECT文の使い方をまとめた

SQLは、関係データベースの定義・操作をおこなう言語です。

SQL = Structured Query Language

・Structured … 構造化
・Query … 問合せ
・Language … 言語

「データベース」とは、データを一定のルールで蓄積し、必要に応じて取り出せるようにしたものです。SQLで扱う、関係データベース(Relational Data Base)は、データを行と列の表で表します。

データベースの分類
  • 階層型データベース
  • 網型データベース
  • 関係データベース
    …データをの組み合わせで表す。
スポンサーリンク

SQLの構文

データベース操作を指示する、いろんな構文がありますが、1番使うのはSELECT文です。

SQLの構成
  • データ定義言語(DDL:data description language)
    • CREATE TABLE 表の定義
    • CREATE VIEW 仮想表(ビュー)の定義
    • GRANT アクセス権の設定
  • データ操作言語(DML:data manipulation language)
    • SELECT データの抽出(検索)
    • UPDATE データの更新
    • INSERT データの追加
    • DELETE データの削除

SELECT文:特定の列を表示させる

データの抽出(検索)は、SELECT文で指定します。

SELECT文でできること
  • データを抽出(検索)する
  • データを並べ替える(ソート)
  • 計算や集計をおこなう

SELECT文は、主に 3つの句で構成されます。

SELECT 列名1,列名2,~列名n 
FROM 表名(テーブル名)
WHERE 抽出条件
SELECT文の3つの句
  • SELECT句 … 結果を返すを指定する。
  • FROM句 … 利用するを指定する。
  • WHERE句 … 結果を返すの条件を指定する。

計算式の列を表示する(SELECT句)

SELECT文のSELECT句では、列名のほかに計算式を記述することもできる。

演 算演算子
加算+
減算
乗算*
除算/

列に別の名前を付ける(SELECT句、AS)

列名 AS 表示させたい列名

条件に一致した行の抽出(WHERE句)

WHERE句の条件
  • LIKE:指定した文字または文字列と一致するものを抽出する(パターンマッチング)。
  • AND, OR, NOT:複合条件で行を抽出する
  • BETWEEN:数値の範囲を指定して抽出する
  • IN(値リスト):値リストで指定された値と一致する値を抽出する
  WHERE 列名 LIKE パターン文字列

WHERE句の条件式

WHERE句の条件には、計算式を記述することができます。

  • 比較演算子
  • BETWEEN 〜 AND 〜
  • IN(〜, 〜, …)
  WHERE 年齢 >= 19 AND 年齢<=21
  WHERE 年齢 BETWEEN 19 AND 21
  WHERE 年齢 IN(19,20,21)

抽出結果を昇順または降順に並べ替える(ORDER BY句)

SELECT文の最後に ORDER BY句をつけると、並べ替え(ソート)できます。

  ORDER BY 列名 ASC  (デフォルト)
  ORDER BY 列名 DESC
ASC昇順(小→大) ascend
DESC降順(大→小) descend

重複した行をまとめる(SELECT句、DISTINCT)

結果の列に同じデータが含まれる場合に、重複を削除することができます。

SELECT DISTINCT 出身地
FROM 学籍表

表の結合と内部結合

関係データベースでは、複数の表を結合して、結果を表示します。

結合方法には、内部結合と外部結合の2種類あります。

内部結合では、両方の表で一致する行だけを表示させます。2つの方法があります。

内部結合の結合条件
  • WHERE句で指定する
  • FROM句のINNER JOINで指定する

外部結合は、どちらかの表に含まれる行を表示させます。

外部結合の結合条件
  • FROM句のLEFT JOIN
  • FROM句のRIGHT JOIN

通常は、内部結合で求める結果が得られることが多いです。

FROM句に複数の表を入力する

SELECT *
  FROM 売上表,顧客表

FROMに表を複数入れると、掛けた表が返される。

WHERE句に結合条件を入力する

SELECT 列名1,列名2,~列名n ← どの列を表示させるか
FROM 表名(テーブル名) ← どの表(テーブル)から
WHERE 表名1.列名 = 表名2.列名

表に別の名前を付ける(FROM句、AS)

FROM 表の名前 AS 表の別の名前
FROM 表の名前 表の別の名前
(ASは省略可能)
表に別の名前を付けると
  • SQL文を簡潔に記述できる。
  • 同じ表を結合する自己結合などができる。

表の自己結合

同じ表の別の列を関連付けるときには、同じ表をFROM句に2回記述します。WHERE句で条件を指定するために、表に別名を付けます。

SELECT 社員表.社員名,リーダー.社員名 AS リーダー
FROM 社員表,社員表 リーダー
WHERE 社員表.リーダー=リーダー.社員No

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

グループ化・集計を行う(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(*)

グループ化されたデータを並べ替える(GROUP, ORDER)

ORDER BYの列名に、計算式を入力できます。

SELECT 売上No,SUM(単価*数量)
FROM 商品表, 売上明細
WHERE 商品表.商品CD=売上明細.商品CD←表の結合
GROUP BY 売上No ← 売上Noでグループ化をおこなう
ORDER BY SUM(単価*数量) DESC←合計金額の降順にソート

グループ化されたデータから条件にあったグループを抽出(HAVING句)

グループ毎に、条件を満たすデータが存在するか調べるには、HAVING句を使います。

SELECT 列名1,列名2, ~列名n
FROM 表名1,表名2,~表名n
WHERE 抽出条件 ← 表の結合条件を記述する
GROUP BY 列名1,列名2 ← 指定された列の値でグループ化
HAVING 抽出条件 ← 抽出条件

外部結合ですべての行を表示させる

左右いずれかの表を優先させたいときに指定する。

該当するデータがない部分は、NULL(ヌルまたはナル)が表示されている。

外部結合の結合条件
  • LEFT JOIN
    左側に指定された表のすべての行が表示される
  • RIGHT JOIN
    右側に指定された表のすべての行が表示される

LEFT JOINとRIGHT JOINで表を結合する

これは、表の結合したときに指定された表(左右いずれか)を優先して表示を行う指定である。

SELECT 列名1,列名2,~列名n
FROM 表名1 LEFT JOIN 表名2
  ON 表名1.フィールド名 = 表名2.フィールド名
WHERE 抽出条件

抽出結果を元にさらに抽出をおこなう(サブクエリー)

別の表で抽出した結果を、検索条件にしています。

(売上表の売上No=1)
→(顧客コード)
→(顧客表の顧客名)

SELECT 顧客名
FROM 顧客表
WHERE 顧客CD=(
  SELECT 顧客CD 
  FROM 売上表 
  WHERE 売上No=1
)

表の結合と副問い合わせを組み合わせた抽出

(商品表のAVG(単価))
→(単価 > AVG(単価))
→(売上明細の単価・数量)

SELECT 売上No,単価,数量,単価*数量
FROM 商品表,売上明細
WHERE 商品表.商品CD=売上明細.商品CD
  AND 単価>=(
    SELECT AVG(単価) 
    FROM 商品表
  )

副問い合わせの結果が複数になる場合(IN述語)

(売上表の”2001/06/27″)
→(売上No)
→(売上表の単価・数量)

SELECT 売上No,商品名,単価,数量,単価*数量
FROM 商品表,売上明細
WHERE 商品表.商品CD=売上明細.商品CD
  AND 売上No IN(
    SELECT 売上No 
    FROM 売上表 
    WHERE 日付="2001/06/27"
  )

相関副問い合わせ(EXISTS述語)

主問い合わせの表の1行ごとに、EXISTSを指定された副問い合わせを実行し、指定されたデータが存在した行だけが抽出される。

(商品表の商品コード)
→(売上明細の商品コード)
→(含まれるものだけ表示)

SELECT 商品CD,商品名
FROM 商品表
WHERE EXISTS (
  SELECT * 
  FROM 売上明細 
  WHERE 売上明細.商品CD = 商品表.商品CD
)
QRコードを読み込むと、関連記事を確認できます。
タイトルとURLをコピーしました