DataBase vol.12

  • 複数のテーブル結合を行う
  • 自己結合を使う

複数のテーブル結合を行う

問題3-1

テーブルSales、Products、Categoriesを連結し、SalesをCategoryIDでグループ化、
CategoryID,CategoryName,Quantityの合計を表示しなさい。

SELECT
        p.CategoryID
        ,c.CategoryName AS "カテゴリ名"
        ,SUM(s.Quantity) AS "数量合計"
FROM
        Sales AS s
           JOIN
        Products AS p
           ON s.ProductID = p.ProductID
           JOIN
        Categories AS c
           ON c.CategoryID = p.CategoryID
GROUP BY
        c.CategoryID
;        
問題4-1

テーブルCustomers、Salesを外部結合してCustomerIDごとのQuantity合計を求めて
CustomerNameと合計を表示しなさい。ただし、Salesデータが存在しないCustomerIDの合計は0を表示しなさい。

SELECT
        c.CustomerName,
        SUM(
            CASE
                WHEN s.CustomerID IS NULL THEN 0
                ELSE s.Quantity
            END
            ) AS "販売数量合計"
FROM
        Customers AS c
          LEFT JOIN
        Sales AS s
          ON c.CustomerID = s.CustomerID
GROUP BY
        c.CustomerID
;
  • SUMと(の間にスペースを入れたらエラーが出た。
問題4-3

テーブルPrefecturals、Customersを外部結合し、PrefecturalIDごとのCustomersレコード数を求め、
PrefecturalNameとレコード数を表示しなさい。ただしCustomersデータが存在しない場合は0を表示しなさい。

SELECT
        p.PrefecturalName,
        COUNT(c.CustomerID) AS "顧客数" 
FROM
        Prefecturals AS p
         LEFT JOIN
        Customers AS c
          ON p.PrefecturalID = c.PrefecturalID
GROUP BY
        p.PrefecturalID
;
  • COUNTはMySQLの場合、非NULL値をカウントする。

自己結合を使う

  • 自分自身と比較するものを自己結合と言う。
SELECT
        p1.ProductName AS "商品名1",
        p2.ProductName AS "商品名2",
        (p1.Price+p2.Price) AS "セット価格"
FROM
        Products AS p1,
        Products AS p2
WHERE
        p1.ProductID < p2.ProductID
        AND
        p1.ProductID <> p2.ProductID
        AND
        (p1.Price+p2.Price) >= 2500
;
  • 絶対に別名を付ける
  • <>はNOTイコール