解答
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]を降順に並べ替えればよい、と思いつくと思います。







