データベースと SQL:解説つき練習問題

ヒントと解説つきの無料のデータベースと SQL選択式練習問題。3 つのレベル:重要な用語と事実, 概念の応用, 事例と分析。

無料の練習問題やさしい

列が決して空(NULL)のままにならないようにする制約はどれですか?

次の問題 →
データベースと SQLを無料で練習今すぐデータベースと SQLを練習毎日 5 問まで無料。カード登録は不要です。

練習する内容

  1. やさしい重要な用語と事実
  2. ふつう概念の応用
  3. むずかしい事例と分析

データベースと SQLをゼロから学ぶ

1リレーショナルデータベースとは

リレーショナルデータベースは、データをテーブルに格納します。テーブルは表計算ソフトのようなもので、各行が 1 件のレコード、各列が 1 つの属性です。

ある店には、列が id、name、city の customers テーブルと、列が id、customer_id、total の orders テーブルがあるかもしれません。

主キーは、各行を一意に識別する列、または列の組です。重複することも、空になることもありません。ここでは各テーブルの id がそれです。

外部キーは、別のテーブルの主キーを参照する列です。orders の customer_id は、どの顧客が注文したかを示します。

これがテーブルをつなぐ方法です:1 人の顧客は多くの注文をもてますが、各注文は 1 人の顧客に属します。これが一対多の関係です。

SQL(Structured Query Language)は、テーブルを作成し、データを変更し、データについて質問するための言語です。

セルフチェック 主キーとは何か。
  1. すべてのテーブルの最初の列
  2. 別のテーブルの行を参照する列
  3. 各行を一意に識別する列、または列の組
  4. 検索を速くする索引

答え: 各行を一意に識別する列、または列の組. 主キーは一意で、NULL にならないので、ちょうど 1 つの行を特定します。別のテーブルを参照する列は外部キーです。

2SELECT によるデータの読み取り

ほとんどの問題は SELECT 文についてです。これは句から構成され、常にこの順序で書きます:

SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
  • SELECT は欲しい列を並べます。DISTINCT は重複する行を取り除きます。
  • FROM はテーブル、または結合したテーブルを指定します。
  • WHERE は条件を満たす行だけを残します。たとえば WHERE total > 20。
  • GROUP BY は、同じ値をもつ行を 1 つのグループにまとめ、グループごとに数えたり足したりできるようにします。
  • HAVING は条件を満たすグループだけを残します。集計関数を使えますが、WHERE では使えません。
  • ORDER BY は結果を並べ替えます。既定は昇順で、大きい順にするには DESC を加えます。

集計関数は、多くの行を 1 つの値にまとめます:COUNT、SUM、AVG、MIN、MAX。

データベースは、書いた順に句を実行するわけではありません。まず FROM、次に WHERE、GROUP BY、HAVING、SELECT、最後に ORDER BY を実行します。

ほかの文はデータを変更します:INSERT は行を追加し、UPDATE は行を変更し、DELETE は行を削除します。CREATE、ALTER、DROP はテーブル自体を変更します。

セルフチェック 注文が 5 件より多い顧客だけを取り出したい。COUNT(*) > 5 で絞り込む句はどれか。
  1. DISTINCT
  2. HAVING
  3. ORDER BY
  4. WHERE

答え: HAVING. 件数は、行がグループ化された後にだけ存在し、HAVING はグループを絞り込みます。WHERE はグループ化の前に実行されるので、COUNT のような集計関数は使えません。

3結合、正規化、トランザクション

結合(join)は、条件(通常は外部キー = 主キー)を使って 2 つのテーブルの行を組み合わせます:

FROM customers c JOIN orders o ON o.customer_id = c.id
  • INNER JOIN(または JOIN)は、両方のテーブルに一致する行だけを残します。
  • LEFT JOIN は、左のテーブルのすべての行を残します。一致しない場合、右のテーブルの列は NULL になります。
  • NULL は、値が欠けている、または不明であることを意味します。IS NULL で調べ、決して = NULL では調べません。

正規化は、すべての事実が一度だけ格納されるようにテーブルを分割します。同じ事実を複数の場所で更新することを避けられます。

  • 第 1 正規形:すべてのセルが 1 つの原子的な値をもち、繰り返しグループがない。
  • 第 2 正規形:第 1 正規形で、すべての非キー列が、複合キーの一部ではなくキー全体に依存する。
  • 第 3 正規形:第 2 正規形で、非キー列が別の非キー列に依存しない。

トランザクションは、複数の文を 1 つの単位にまとめます。COMMIT で確定し、ROLLBACK で取り消します。トランザクションは ACID に従います:原子性(すべてか無か)、一貫性、独立性、永続性。

セルフチェック ある顧客は、注文をしていない。customers LEFT JOIN orders で、その顧客はどうなるか。
  1. クエリはエラーで失敗する
  2. 顧客は 1 回現れ、注文の列は NULL になる
  3. 顧客は、テーブル内の注文の数だけ現れる
  4. 顧客は結果から除かれる

答え: 顧客は 1 回現れ、注文の列は NULL になる. LEFT JOIN は左のテーブルのすべての行を残し、足りない右側を NULL で埋めます。顧客を除くのは INNER JOIN がすることです。

4ステップごとの方法

クエリを書く、または与えられたクエリが何を返すかを調べるには:

  1. データをもつテーブルと、キーでどうつながっているかを見つけます。
  2. 結合を含めて FROM を書きます。一致しない行も残す必要があるときは LEFT JOIN を選びます。
  3. 1 行ごとの条件には WHERE を加えます。
  4. 問題が「〜ごとに」と述べているなら、GROUP BY と集計関数を加えます。
  5. 集計に対する条件には HAVING を加え、順序が重要なら ORDER BY を加えます。
  6. 小さな例で結果を確認します:データベースが実行する順序で、各句の後の行を列挙します。

理論の問題では、まず概念(キー、結合の種類、正規形、ACID の性質)を挙げ、次にその定義に合う選択肢を選びます。

5例題

すべてのステップをたどりましょう。開く前に次のステップを予想してみましょう。

例題

テーブル customers に行 (1, Ana)、(2, Ben)、(3, Cas) がある。テーブル orders に行 (id, customer_id) = (10, 1)、(11, 1)、(12, 2)、(13, 1) がある。このクエリは何を返すか。SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name

1

FROM と結合を実行する

各顧客は、その id をもつ注文と組み合わされます。Ana は注文 10、11、13 に一致します。Ben は注文 12 に一致します。

Cas には注文がありません。LEFT JOIN なので、Cas は結果に残り、o.id は NULL になります。

2

結合された行を列挙する

  • Ana, 10
  • Ana, 11
  • Ana, 13
  • Ben, 12
  • Cas, NULL

これで 5 行です。

3

名前でグループ化する

GROUP BY c.name で 3 つのグループができます:3 行の Ana、1 行の Ben、1 行の Cas。

4

グループごとに数える

COUNT(o.id) は NULL でない値だけを数えます。Ana は 3、Ben は 1 になります。

Cas には 1 行ありますが、その o.id は NULL なので、Cas は 0 になります。

5

答えを確認する

Ana、Ben、Cas を合わせると 3 + 1 + 0 = 4 件の注文で、orders の行数と同じです。COUNT(*) を使うと、COUNT(*) は行そのものを数えるので、Cas が誤って 1 になります。

答え

Ana 3、Ben 1、Cas 0。

6よくある間違い

  • WHERE で集計関数を使う。COUNT、SUM、AVG に対する条件は HAVING に書きます。
  • = NULL と書く。NULL との比較はすべて不明になります。IS NULL か IS NOT NULL を使います。
  • 一致しない行も残す必要があるときに INNER JOIN を使う。LEFT JOIN を使います。
  • 結合条件を忘れる。ON がないと、すべての行がすべての行と組み合わされます(直積、クロス結合)。
  • GROUP BY にも集計関数の中にもない列を選択する。
  • DELETE(行を削除する)と DROP TABLE(テーブル全体を削除する)を混同する。
  • WHERE なしで UPDATE や DELETE を実行する。テーブルのすべての行が変更されます。
セルフチェック テーブルに 10 行あり、列 col はすべての行で NULL である。SELECT COUNT(col) は何を返すか。
  1. 0
  2. 10
  3. 1
  4. NULL

答え: 0. COUNT(col) は NULL でない値だけを数えるので、0 を返します。COUNT(*) は行を数えるので、10 を返します。

7試験問題の例

  • やさしい:用語と事実。SELECT、WHERE、ORDER BY、DELETE の働き、主キーと外部キー、NULL の意味。
  • ふつう:概念の応用。課題に合うクエリ、WHERE と HAVING、内部結合と外部結合、正規形、ACID。
  • むずかしい:事例と分析。副問い合わせ、分離レベルとその異常、BCNF、ウィンドウ関数、索引とクエリの性能、SQL インジェクション。

クエリが与えられたら、FROM、WHERE、GROUP BY、HAVING、SELECT、ORDER BY の順に、いくつかの行でたどります。ほとんどの落とし穴は、3 行以内に現れます。

アプリでステップごとに学ぶアプリでステップごとに学ぶ

例題

例題 1やさしい

UNION は 2 つの SELECT クエリの結果をどうしますか?

  1. Aキーで横に並べて結合する
  2. B両方に現れる行だけを残す
  3. C1 つの結果にまとめ、重複する行を取り除く
  4. D1 つ目のクエリにあって 2 つ目にない行だけを残す
ヒントを表示
  1. 両方のクエリは、互換性のある列を同じ数だけ持っていなければなりません。
  2. 誤答を 2 つ消しました。残りの 2 つのうち 1 つが正解です。
答えと解説を表示

これが答えになる理由

UNION は両方のクエリの行を縦に積み重ね、重複を取り除きます。UNION ALL は重複を残します。

答え

C · 1 つの結果にまとめ、重複する行を取り除く
例題 2ふつう

WHERE 句に一致する行がないとき、SELECT SUM(amount) FROM orders は何を返しますか?

  1. Aエラー
  2. B0
  3. CNULL
  4. D空文字列
ヒントを表示
  1. ここで SUM は COUNT と異なります。
  2. 誤答を 2 つ消しました。残りの 2 つのうち 1 つが正解です。
答えと解説を表示

これが答えになる理由

SUM、AVG、MIN、MAX は空集合に対して NULL を返し、COUNT は 0 を返します。COALESCE(SUM(amount), 0) とすれば 0 が得られます。

答え

C · NULL
例題 3むずかしい

SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp は何を返しますか?

  1. A部署の平均より多く稼ぐ従業員だけ
  2. Bすべての従業員の行と、その部署の平均給与
  3. Cname が GROUP BY にないためエラー
  4. D部署ごとに 1 行と、その平均給与
ヒントを表示
  1. ウィンドウ関数は行をまとめません。
  2. 誤答を 2 つ消しました。残りの 2 つのうち 1 つが正解です。
答えと解説を表示

これが答えになる理由

GROUP BY と違い、ウィンドウ関数は入力のすべての行を残し、そのパーティション(ここでは部署)全体で計算した値を加えます。

答え

B · すべての従業員の行と、その部署の平均給与

質問と回答

データベースと SQLとは?

ある店には、列が id、name、city の customers テーブルと、列が id、customer_id、total の orders テーブルがあるかもしれません。

これがテーブルをつなぐ方法です:1 人の顧客は多くの注文をもてますが、各注文は 1 人の顧客に属します。これが一対多の関係です。

データベースと SQLはどう順を追って学ぶ?
  1. リレーショナルデータベースとは
  2. SELECT によるデータの読み取り
  3. 結合、正規化、トランザクション
  4. ステップごとの方法
  5. 例題
  6. よくある間違い
  7. 試験問題の例
データベースと SQLの練習では何を学ぶ?
  • やさしい: 重要な用語と事実
  • ふつう: 概念の応用
  • むずかしい: 事例と分析

どの問題にも選択肢が 4 つあり、正解は 1 つだけです。 行き詰まったら、まず小さなヒントを開き、必要なときだけ詳しい解説を見ましょう。

練習のしかた

  • どの問題にも選択肢が 4 つあり、正解は 1 つだけです。
  • 行き詰まったら、まず小さなヒントを開き、必要なときだけ詳しい解説を見ましょう。
  • 進捗、間違えた問題、保存した問題は記録されるので、試験前に復習できます。

このトピックを含む科目

コンピュータサイエンスのほかのトピック

印刷用ワークシート

データベースと SQLを無料で練習今すぐデータベースと SQLを練習毎日 5 問まで無料。カード登録は不要です。