Hatena::ブログ(Diary)

crazyuplog このページをアンテナに追加 RSSフィード

2009-05-15

DataBase vol.11

  • 複数のテーブルの結合を行う(1)続き
  • 外部結合を使う

複数のテーブルの結合を行う(1)続き

問題2-1

テーブルSalaryとEmployeesを結合してEmployeeName、PayDate、Amountを

EmployeeID昇順で表示しなさい。

SELECT
        e.EmployeeID
        ,e.EmployeeName
        ,PayDate
        ,Amount
FROM
        Salary AS s
        ,Employees AS e
WHERE
        s.EmployeeID = e.EmployeeID
ORDER BY
        e.EmployeeID
        ,PayDate
;

問題2-3

テーブルSalesとProductsを結合し、SalesをProductIDでグループ化、Quantityの合計が

300以上のデータについてQuantity合計、ProductID、ProductNameを表示しなさい。

SELECT
        p.ProductID
        ,p.ProductName
        ,SUM(s.Quantity) AS "数量合計"
FROM
        Sales AS s
        ,Products AS p
WHERE
        s.ProductID = p.ProductID
GROUP BY
        s.ProductID
HAVING
        SUM(s.Quantity) >= 300
;

問題3-3

テーブルSales、Customers、CustomerClassesを結合し、CustomerClassIDでグループ化、

Quantityの最大値、CustomerClassID、CustomerClassNameを表示しなさい。

  • 翻訳:法人と個人毎に売り上げた最大数量を求めなさい。
SELECT
        MAX(s.Quantity) AS "最大数量"
        ,cc.CustomerClassID
        ,cc.CustomerClassName AS "顧客クラス名"
FROM
        Sales AS s
        ,Customers AS c
        ,CustomerClasses AS cc
WHERE
        c.CustomerClassID = cc.CustomerClassID
        AND
        s.CustomerID = c.CustomerID
GROUP BY
        cc.CustomerClassID
;
  • 何を出したいかを意識して描くこと。
  • 命名規則を意識する。

外部結合を使う

片方にしか値が入っていないものがある場合に結合を行いたい場合に使う。

  • 先ほどの結合方法だと双方に値がないものはスルーされる。

LEFT OUTER JOIN

  • OUTERがあってもなくてもよい。
  • あってもなくてもくっつける
  • 結合相手が居ない場合はNULLがでる。
    • 数値を演算するものの場合、NULLを0として扱う処理が必要。
  • 絶対に出さなければならない部分を大元にする。
Products //大元
LEFT JOIN
Sales //子
ON (条件)

User

IDName
1obt
2araki
3enomoto
4fukata

User_Mail

IDUser_IDMail_Add
11obt@example.com
21obata@example.com
32araki@example.com
42ark@example.com
54fukata@example.com
64fkt@example.com

の場合(LEFT JOIN部分のみ)

User AS U
LEFT JOIN
User_Mail AS UM
ON (U.ID = UM.User_ID)
Copyright © crazyup. All rights reserved.