データベーススペシャリスト資格|2022年10月挑戦ログ 5月4日|SQLの基本構文(後半)

高度IT・基礎知識

この記事は「データベーススペシャリスト資格に興味はあるが、どのようなものか?どう学ぶのか?」という方向けに、具体的な内容と私自身の挑戦ログをお伝えする。学び中の方や、これから学ぼうとされる方の参考になれば幸いだ。

今回はSQLの基本構文(後半)について書く。

行の絞り込み(limit,where)

前回のおさらい

  • 基本かつ王道の命令「select from」について、フィールド(表テーブルにおける列単位のデータ)の操作を試した。
  • 具体的にはフィールドの参照・結果の並び替えや、フィールドの作成・計算・別名付与など。

表示行数を制限する

  • テーブルのプレビュー機能(エクスプローラから対象のテーブルを選んで、プレビュータブを押すだけ)を使えば、直感的にテーブルの全量を確認できる。
  • ただし、何らかの演算や処理の結果が正しいかを部分(例えば2~3行)で確認したいときがある。そのようなときは命令「limit」を使う。(なお、limitは結果を後から絞り込むので、結果テーブルのデータ量は変わらない。データ量を節約したいならフィールドを絞ると良い。ご参考)
  • 使い方は末尾に入れればよい。「select フィールド名 from データセット名.テーブル名 limit 行数」のような感じ。「このテーブルから、この列のデータをください。○行以内で」のように言葉を話すように考えると覚えやすい
  • また、命令「order by」や「offset」と組み合わせると「降順に並べたうえで最初の数行を取得」や「100番目から数えて最初の数行を取得」などが可能。
  • 以下はdate_timeが新しい順(降順)に並び替えたうえで、100番目から取得する例。

条件にあったレコードのみを取得する

  • 条件に合ったレコード(行)の取得は「where」
  • whereはfromの直後。「~から」のあとに「~という場所で」がセットになると覚える。
  • 試験対策。このような操作を「選択(または制限)」と言う。「ある関係(テーブル)から、指定した特定のタプル(行)だけを抽出する演算」のこと。
  • 以下は「customers」テーブルにおいて、性別が女性のレコードのみ、5行分抽出する例。
  • whereをorder by,limitと組み合わせる場合、where,order by,limitの順に使う。
  • 条件式に利用できる記号。「=は等しい、<>または!=は等しくない、>はより大きい、<はより小さい、>=は以上、<=は以下」
  • 日付型、日時型、文字列方のデータは「”」で囲む。整数型、数値型、浮動小数点方のデータは半角で記述し、「”」で囲まない。つまり、数字型以外は「”」で囲む
  • 日付型、日時型は新しいものほど大きい扱いとなる。
  • boolen型の場合は「列 is true」のように記述する。(逆はis falseまたはis not true。なお、is not trueだとnullも含んでしまうので注意)
  • データにはnull(空白)が含まれることがあり、その存在を忘れると間違った分析をするリスクがある。適宜「where フィールド名 is null(またはis not null)」を使い確認すること。
  • データを分析するときは「○年だけの売り上げ」や「消費○だけの利益率」や「○歳以上の顧客」など絞り込むことが多い。つまりデータ分析実務でwhereは非常によく使われる

行の絞り込み(and,or,その他演算子)

複数の条件を組み合わせる

  • where条件式で複数条件を組み合わせるときは、andまたはorでつなげる。2つ以上繋げても良い優先度は()で指定する。
  • 例えば以下は、customersテーブルにおいて、「性別が女性」かつ「プレミアム顧客」かつ「顧客の会員登録日が2019年以降 または 顧客の誕生日が1980年以前」の抽出。

その他演算子(in,not in)

  • inは「いずれかの値にあてはまる」、not inは「いずれの値にもあてはまらない」に使う。
  • 構文は「フィールド名 in(”値1″,”値2″…)」
  • 例えば以下は「都道府県が東京、埼玉、神奈川のどれか」という時。
  • orで繋げてもよいが冗長…という時にはinが便利。

その他演算子(like,not like)

  • 英語のlikeと同じく「~のような」の意味。
  • 組み合わせる記号は「%は任意数の任意文字、_は一つの任意の文字、バックスラッシュはエスケープ処理」
  • 構文は「フィールド名 like(”条件”)」
  • 例えば以下は「木から始まる氏名」で「name like “木%”」と抽出。文字列型なので「”」で括る。
  • また例えば「○○子で終わる氏名」なら「”%__子”」となる。

その他演算子(between)

  • 主に数値や日付など、指定した2つの値の範囲内を指定するときは「between」
  • 構文は「フィールド名 between “値1” and “値2″」。のように使う。値1<値2であること、文字列比較は英語しかできないことなどに注意。
  • 例えば以下は「誕生日が1999年1月1日から1999年12月31日までの間」の例。

復習

問題001

  • [sales]テーブルのすべてのフィールドから[revenue]だけを取得せず、代わりに[revenue]に「1.1」を掛けた値を[revenue_with_tax]に格納してください。ただし、selectには「*」を使用し、結果テーブルは[order_id]の小さい順に3レコードに絞り込んでください。
  • 以下のとおり。前回のおさらい(複数フィールド、全フィールド、order by、as)に加え、今回のおさらい(limit)を組み込んだもの。

問題002

  • [sales]テーブルを対象に、[order_id][quantity][revenue]フィールドに加えて、[quantity]を「1」増やした個数のフィールド(new_qty)と、[quantity]を「1」増やしたときの販売金額のフィールド(new_revenue)を取得してください。なお、結果テーブルは[new_revenue]の大きい順に3レコードに絞り込んでください。
  • 以下のとおり。属性[revenue]の内容を正しく把握している必要があるので、テーブルのスキーマ情報を適宜参照すること。

問題003

  • [customers]テーブルから、[birthday]フィールドの値が[null]でなく、[is_premium]が[true]のレコードの全フィールドを取得してください。結果テーブルは年齢の若い順に並び替え、誕生日が同じ場合は[register_date]の古い順に並べてください。また、3レコードに絞り込んでください。
  • 以下のとおり。not nullやboolen属性は「is」で条件を表記することがポイントか。

問題004

  • [customers]テーブルから『「プレミアム顧客」または「1970年代生まれの顧客」』で「名前の最後が”美”で終わる女性」の全フィールドを取得してください。結果テーブルは年齢が高い順の3レコードに絞り込みます。
  • 以下のとおり。「between フィールド名 “条件” and “条件”」のようにフィールド名や「”」の入れ忘れに注意。likeも同様で「フィールド名 like (“%美”)」のように。話すような自然さを意識すると覚えやすい。例えば”between 1970-01-01 and 1970-12-31″では何がその範囲なのか分からない。また例えば”like name ken”では順序が変、など。あとは「女性」など条件の見漏らしに注意。

問題005

  • [customers]テーブルから、[prefecture]フィールドが「東京」「千葉」「埼玉」「神奈川」以外のプレミアム顧客の全フィールドを取得してください。結果テーブルは年齢が若い順に並べ替えて、3レコードだけ表示します。
  • 以下のとおり。「not in」を使うとスマートに書ける。

考察

  • SQLの基本構文(後半)について。基本の命令「select from」について、レコード(表テーブルにおける行単位のデータ)の絞り込み操作を試した。具体的にはlimit(○行まで),where(条件で絞り込み),その他条件(and,or,in,like,between)など。
  • SQLは言語なので、実際に使わないと身につかないし、使い続けないと忘れる。5月12日以降はデータベーススペシャリスト資格について過去問ベースの学習予定だが、SQLも書籍「集中演習SQL」の演習ドリル(約200問)を毎日1問は実施し、定着を図りたい。

参考書籍

  • 集中演習 SQL入門/木田和廣/株式会社インプレス
  • データベーススペシャリスト2022年版/三好康之/翔泳社
  • おうちで学べるデータベースのきほん/ミック,木村明治/翔泳社

コメント

タイトルとURLをコピーしました