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