зависима table
Сега нека усложним нашите запитвания малко. Нека добавим нова table със задачи към нашата база данни със задачи за нашите служители. И нека да видим Howви записи съдържа:
SELECT * FROM task
Резултатът от такова искане:
document за самоличност | Emploee_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 | Наслаждавай се на живота | (НУЛА) |
Тази table има само 4 колони:
- id — уникален номер на задача (и редове в tableта);
- employee_id — ID на служителя от tableта на служителите, на когото е възложена задачата;
- име — име и описание на задачата;
- краен срок - времето, до което задачата трябва да бъде изпълнена.
Обърнете внимание на няколко нюанса. Задача N6 няма employee_id, нямаме чистач. Задачата е налице, но изпълнителят го няма. Случва се.
Освен това задачи 6-9 нямат определен срок. Това се случва, когато една задача трябва да се изпълнява редовно и непрекъснато. Например, офисът трябва да се почиства всеки ден, но също така трябва да се наслаждавате на живота всеки ден :)
Ако една table използва идентификатори от друга table, тогава такава table се нарича зависима .
Заявка срещу множество таблици
Тук виждаме в tableта със задачи, че има две задачи „Да се наслаждаваме на живота“. Как да разберем кои са тези късметлии?
За да направите това, в SQL можете да изпълните заявка върху две таблици наведнъж. По принцип в SQL можете да правите заявки за произволен брой таблици едновременно. Общият формат за такова искане е:
SELECT columns
FROM Table 1, table 2, tableN
важно! Ако напишете заявка към няколко таблици едновременно, тогава в резултат ще получите така наречения декартов продукт на редовете на tableта. Всеки ред от първата table ще бъде залепен към всеки ред от втората table и т.н.
Тоест, ако имате 5 реда в първата table и 10 реда във втората, тогава ще имате общо 50 реда. В Java тази заявка ще изглежда така:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Нека напишем нашата заявка към две таблици наведнъж и да видим Howво ще се случи:
SELECT * FROM employee, task
И резултатът от тази заявка:
document за самоличност | име | професия | заплата | възраст | document за самоличност | служител | _document за самоличност | име | краен срок |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanов Ivan | Програмист | 100 000 | 25 | 1 | 1 | Коригиране на грешка във фронтенда | 2022-06-01 | |
2 | Peterов Петър | Програмист | 80 000 | 23 | 1 | 1 | Коригиране на грешка във фронтенда | 2022-06-01 | |
3 | Ivanов Сергей | Тестер | 40 000 | тридесет | 1 | 1 | Коригиране на грешка във фронтенда | 2022-06-01 | |
4 | Рабинович Мойша | Директор | 200 000 | 35 | 1 | 1 | Коригиране на грешка във фронтенда | 2022-06-01 | |
5 | Кириенко Анастасия | Офис мениджър | 40 000 | 25 | 1 | 1 | Коригиране на грешка във фронтенда | 2022-06-01 | |
6 | Васка | котка | 1000 | 3 | 1 | 1 | Коригиране на грешка във фронтенда | 2022-06-01 | |
1 | Ivanов Ivan | Програмист | 100 000 | 25 | 2 | 2 | Коригиране на грешка в бекенда | 2022-06-15 | |
2 | Peterов Петър | Програмист | 80 000 | 23 | 2 | 2 | Коригиране на грешка в бекенда | 2022-06-15 | |
3 | Ivanов Сергей | Тестер | 40 000 | тридесет | 2 | 2 | Коригиране на грешка в бекенда | 2022-06-15 | |
4 | Рабинович Мойша | Директор | 200 000 | 35 | 2 | 2 | Коригиране на грешка в бекенда | 2022-06-15 | |
5 | Кириенко Анастасия | Офис мениджър | 40 000 | 25 | 2 | 2 | Коригиране на грешка в бекенда | 2022-06-15 |
Имаме общо 48 реда с резултати, но тук съм дал само 11. В противен случай просто няма да има достатъчно място.
Обърнете внимание на три неща:
- Колони със същото име: id . Това е идентификаторът от tableта на служителите и идентификаторът от tableта със задачите .
- Редовете на всяка table се повтарят. В лявата колона ID 6 е последван от ID = 1 отново.
- Имаме безсмислени редове, където например id (от tableта на служителите) е 6, а в същия ред employee_id е 1.
Премахване на безсмислени линии
Има твърде много редове в нашата получена table, която е декартово произведение на всички редове на двете таблици служител и задача .
Логично, ако редът employee_id е 3, тогава той трябва да се придържа само към реда от tableта на служителите, където id е 3. Нека се опитаме да поправим това недоразумение с WHERE.
Нека напишем заявка като тази:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
И резултатът от тази заявка:
document за самоличност | име | професия | заплата | възраст | document за самоличност | Emploee_id | име | краен срок |
---|---|---|---|---|---|---|---|---|
1 | Ivanов Ivan | Програмист | 100 000 | 25 | 1 | 1 | Коригиране на грешка във фронтенда | 2022-06-01 |
2 | Peterов Петър | Програмист | 80 000 | 23 | 2 | 2 | Коригиране на грешка в бекенда | 2022-06-15 |
4 | Рабинович Мойша | Директор | 200 000 | 35 | 7 | 4 | Наслаждавай се на живота | (НУЛА) |
5 | Кириенко Анастасия | Офис мениджър | 40 000 | 25 | 3 | 5 | Купи кафе | 2022-07-01 |
5 | Кириенко Анастасия | Офис мениджър | 40 000 | 25 | 4 | 5 | Купи кафе | 2022-08-01 |
5 | Кириенко Анастасия | Офис мениджър | 40 000 | 25 | 5 | 5 | Ще купи кафе | 2022-09-01 |
6 | Васка | котка | 1000 | 3 | 8 | 6 | Наслаждавай се на живота | (НУЛА) |
Добрата новина е, че безсмислените редове са изчезнали: id от първата колона винаги е equals на employee_id.
Лошата новина е, че задачите, които не са възложени на никого, като почистване на офиса, ги няма. Техният employee_id беше NULL, така че те бяха отхвърлени, след като WHERE беше напequalsо.