依存テーブル

次に、クエリを少し複雑にしてみましょう。従業員のタスクを含む新しいタスクテーブルをデータベースに追加してみましょう。そして、それに含まれるエントリを見てみましょう:

SELECT * FROM task

このようなリクエストの結果は次のようになります。

ID 従業員ID 名前 締め切り
1 1 フロントエンドのバグを修正 2022-06-01
2 2 バックエンドのバグを修正 2022-06-15
3 5 コーヒーを買う 2022-07-01
4 5 コーヒーを買う 2022-08-01
5 5 コーヒーを買います 2022-09-01
6 (ヌル) オフィスを掃除する (ヌル)
7 4 人生を楽しむ (ヌル)
8 6 人生を楽しむ (ヌル)

このテーブルには 4 つの列しかありません。

  • id — 一意のタスク番号 (およびテーブル内の行)。
  • employee_id — タスクが割り当てられている従業員テーブルの従業員の ID。
  • name — タスクの名前と説明。
  • 期限- タスクを完了しなければならない時間。

いくつかのニュアンスに注意してください。タスク N6 には従業員 ID がありません。清掃員もいません。タスクはそこにありますが、実行者は存在しません。それは起こります。

また、タスク 6 ~ 9 には期限が設定されていません。これは、タスクを定期的かつ継続的に実行する必要がある場合に発生します。たとえば、オフィスは毎日掃除する必要がありますが、毎日の生活を楽しむ必要もあります:)

あるテーブルが別のテーブルの ID を使用している場合、そのようなテーブルは依存関係と呼ばれます。

複数のテーブルに対するクエリ

ここでは、タスク テーブルに「人生を楽しむ」という 2 つのタスクがあることがわかります。これらの幸運な人が誰であるかをどうやって知ることができるでしょうか?

これを行うには、SQL で 2 つのテーブルに対してクエリを同時に実行します。一般に、SQL では、同時に任意の数のテーブルをクエリできます。このようなリクエストの一般的な形式は次のとおりです。

SELECT columns
FROM Table 1, table 2, tableN

重要!複数のテーブルに同時にクエリを作成すると、結果としてテーブル行のいわゆるデカルト積が得られます。最初のテーブルの各行は 2 番目のテーブルの各行に接着され、以下同様に続きます。

つまり、最初のテーブルに 5 行、2 番目のテーブルに 10 行がある場合、合計 50 行になります。Java では、このクエリは次のようになります。

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

一度に 2 つのテーブルにクエリを書き込んで、何が起こるかを見てみましょう。

SELECT * FROM employee, task

そして、このクエリの結果は次のようになります。

ID 名前 職業 給料 ID 従業員 _id 名前 締め切り
1 イワノフ・イワン プログラマー 100000 25 1 1 フロントエンドのバグを修正 2022-06-01
2 ペトロフ・ペトル プログラマー 80000 23 1 1 フロントエンドのバグを修正 2022-06-01
3 イワノフ・セルゲイ テスター 40000 30 1 1 フロントエンドのバグを修正 2022-06-01
4 ラビノビッチ・モイシャ 監督 200000 35 1 1 フロントエンドのバグを修正 2022-06-01
5 キリエンコ・アナスタシア 事務長 40000 25 1 1 フロントエンドのバグを修正 2022-06-01
6 バスカ 1000 3 1 1 フロントエンドのバグを修正 2022-06-01
1 イワノフ・イワン プログラマー 100000 25 2 2 バックエンドのバグを修正 2022-06-15
2 ペトロフ・ペトル プログラマー 80000 23 2 2 バックエンドのバグを修正 2022-06-15
3 イワノフ・セルゲイ テスター 40000 30 2 2 バックエンドのバグを修正 2022-06-15
4 ラビノビッチ・モイシャ 監督 200000 35 2 2 バックエンドのバグを修正 2022-06-15
5 キリエンコ・アナスタシア 事務長 40000 25 2 2 バックエンドのバグを修正 2022-06-15

結果行は合計 48 行ありますが、ここでは 11 行だけを指定しています。そうしないと、十分なスペースがありません。

次の 3 つのことに注意してください。

  • 同じ名前の列: idこれは、従業員テーブルの IDとタスクテーブルの IDです。
  • 各テーブルの行が繰り返されます。左側の列では、ID 6 の後に再び ID = 1 が続きます。
  • たとえば、(employee テーブルからの) id が 6 で、同じ行のemployee_id が 1 である無意味な行があります。

意味のない行を削除する

結果のテーブルには行が多すぎます 。これは、2 つのテーブルemployeetaskのすべての行のデカルト積です。

論理的には、行employee_idが3の場合、その行はIDが3である従業員テーブルの行のみに固定されるはずです。この誤解をWHEREで修正してみましょう。

次のようなクエリを書いてみましょう。

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

そして、このクエリの結果は次のようになります。

ID 名前 職業 給料 ID 従業員ID 名前 締め切り
1 イワノフ・イワン プログラマー 100000 25 1 1 フロントエンドのバグを修正 2022-06-01
2 ペトロフ・ペトル プログラマー 80000 23 2 2 バックエンドのバグを修正 2022-06-15
4 ラビノビッチ・モイシャ 監督 200000 35 7 4 人生を楽しむ (ヌル)
5 キリエンコ・アナスタシア 事務長 40000 25 3 5 コーヒーを買う 2022-07-01
5 キリエンコ・アナスタシア 事務長 40000 25 4 5 コーヒーを買う 2022-08-01
5 キリエンコ・アナスタシア 事務長 40000 25 5 5 コーヒーを買います 2022-09-01
6 バスカ 1000 3 8 6 人生を楽しむ (ヌル)

良いニュースは、意味のない行が消えたことです。最初の列の ID は常にemployee_idと等しくなります。

悪いニュースは、オフィスの清掃など、誰にも割り当てられていないタスクがなくなったことです。彼らのemployee_idはNULLだったので、WHEREが完了した後に破棄されました。