解答

CHAPTER 3

001

SQL文(クエリ)

      SELECT * EXCEPT (revenue)
      , revenue * 1.1 AS revenue_with_tax
      FROM impress_sweets.sales
      ORDER BY 1
      LIMIT 3
    

結果テーブル

結果テーブル

解説

「SELECT *」で全フィールドを取得できること、EXCEPTで特定のフィールドを除外できること、「*」に続けて「,」で区切って、別のフィールドを追加できることを学びました。この3つの知識で正解にたどり着けたと思います。

002

SQL文(クエリ)

      SELECT order_id
      , quantity
      , quantity + 1 AS new_quantity
      , revenue
      , (revenue / quantity) * (quantity + 1) AS new_revenue
      FROM impress_sweets.sales
      ORDER BY 5 DESC
      LIMIT 3
    

結果テーブル

結果テーブル

解説

結果テーブルの5列目にある[new_revenue]フィールドの取得には、少し工夫が必要です。元の[sales]テーブルには単価を表すフィールドはないので、[revenue]を[quantity]で割って単価を計算し、「quantity + 1」を掛けることで「注文の個数が1個多いときの販売金額」が求められます。また、[new_revenue]を大きい順に並べ替えるORDER BYをDESCオプションとともに利用します。3レコードに絞り込むには、LIMITを利用します。

003

SQL文(クエリ)

      SELECT * FROM impress_sweets.customers
      WHERE birthday IS NOT NULL AND is_premium IS TRUE
      ORDER BY birthday DESC, register_date
      LIMIT 3
    

結果テーブル

結果テーブル

解説

レコードの絞り込みとしてIS (NOT) TRUE/FALSE、IS (NOT) NULLを学びました。この解答では、それらを組み合わせてWHERE句で利用しています。SQL文の2 行目にある「is_premium IS TRUE」は、この例では「is_premium IS NOT FALSE」でも同じ結果になりますが、[is_premium]フィールドに「null」が存在した場合には結果が変わるので、注意してください。

ORDER BYの表現は、列番号を利用して「ORDER BY 3 DESC, 6」としても構いません。なお、誕生日が同じユーザーがいるかどうかは、CHAPTER 4で学ぶテクニックを使うと確認できます。

004

SQL文(クエリ)

      SELECT *
      FROM impress_sweets.customers
      WHERE (is_premium IS TRUE OR
      birthday BETWEEN "1970-01-01" AND "1979-12-31")
      AND customer_name LIKE ("%美")
      AND gender = 2
      ORDER BY birthday
      LIMIT 3
    

結果テーブル

結果テーブル

解説

WHEREを構成する条件がポイントです。「プレミアム顧客」の条件は「is_premium IS TRUE」で表せます。「1970年代生まれ」の条件には、BETWEEN演算子を使います。

「プレミアム顧客」と「1970年代生まれ」はOR条件なので、それらを半角カッコでまとめ、「姓名の最後が"美"で終わる」と「女性」の条件は、それぞれANDでつなげます。

005

SQL文(クエリ)

      SELECT * FROM impress_sweets.customers
      WHERE prefecture NOT IN ("東京", "千葉", "神奈川","埼玉")
      AND is_premium IS TRUE
      ORDER BY birthday DESC
      LIMIT 3
    

結果テーブル

結果テーブル

解説

[prefecture]フィールドが「東京」「千葉」「埼玉」「神奈川」以外なので、WHEREでは次ページのように東京、埼玉、神奈川、千葉以外の43道府県をORでつないでも同じ結果が得られます。

      (prefecture = "北海道" OR
      prefecture = "青森" OR
      prefecture = "......" OR
      prefecture = "沖縄") AND is_premium IS TRUE
    

ただ、IN演算子を否定するNOT INを利用して、「東京、千葉、神奈川、埼玉に当てはまらない」という条件と、「is_premium IS TRUE」をANDでつなぐほうが断然スマートです。年齢が若い順は「誕生日の大きい順」と考えれば、[birthday]を降順に並べ替えればよい、と思いつくと思います。

サポートページに戻る