Использование предложения WHERE для NATURAL JOIN - PullRequest
0 голосов
/ 25 августа 2018

Я изучаю книгу «Системные понятия базы данных» 6-е изд.который использует пример университетской базы данных.Схема этой базы данных следующая.Жирным шрифтом обозначены основные ключи:

department(<b>dept_name</b>, building, budget)
course(<b>course_id</b>, title, dept_name, credits)
instructor(<b>ID</b>, name, dept_name, salary)
section(<b>course_id</b>, <b>sec_id</b>, <b>semester</b>, <b>year</b>, building, room number, time_slot_id)
teaches(<b>ID</b>, <b>course_id</b>, <b>sec_id</b>, <b>semester</b>, <b>year</b>)
prereq(<b>course_id</b>, <b>prereq_id</b>)

. В книге сформулирован следующий запрос:

«Перечислите имена преподавателей вместе с названиями курсов, которые они преподают».

Ответ, данный книгой, таков:

select name, title
from instructor natural join teaches, course
where teaches.course id = course.course id;

Кроме того, автор пишет:

"В противоположность этому следующий SQL-запрос не вычисляет тот же результат:

select name, title
from instructor natural join teaches natural join course;

Чтобы понять почему, обратите внимание, что естественное объединение инструктора и учителей содержит атрибуты (идентификатор, имя, название отдела, зарплата, идентификатор курса, идентификатор секунды), в то время как отношение курса содержит атрибуты (идентификатор курса, title, dept name, credit). В результате естественное объединение этих двух элементов потребует, чтобы значения атрибута dept name из двух входных данных были одинаковыми, в дополнение к требованию, чтобы значения идентификатора курса были одинаковыми.затем пропустил бы все пары (имя преподавателя, название курса), в которых преподаватель преподает курс в отделе, отличном от собственного отдела преподавателя.с другой стороны, правильно выводит такие пары."

Теперь я попробовал оба запроса, чтобы увидеть разницу.

mysql> select * from instructor;
+-------+------------+------------+----------+
| ID    | name       | dept_name  | salary   |
+-------+------------+------------+----------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 |
| 12121 | Wu         | Finance    | 90000.00 |
| 15151 | Mozart     | Music      | 40000.00 |
| 22222 | Einstein   | Physics    | 95000.00 |
| 32343 | El Said    | History    | 60000.00 |
| 33456 | Gold       | Physics    | 87000.00 |
| 45565 | Katz       | Comp. Sci. | 75000.00 |
| 58583 | Califieri  | History    | 62000.00 |
| 76543 | Singh      | Finance    | 80000.00 |
| 76766 | Crick      | Biology    | 72000.00 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 |
| 98345 | Kim        | Elec. Eng. | 80000.00 |
+-------+------------+------------+----------+
12 rows in set (0.00 sec)

mysql> select * from course;
+-----------+----------------------------+------------+---------+
| course_id | title                      | dept_name  | credits |
+-----------+----------------------------+------------+---------+
| BIO-101   | Intro. to Biology          | Biology    |       4 |
| BIO-301   | Genetics                   | Biology    |       4 |
| BIO-399   | Computational Biology      | Biology    |       3 |
| CS-101    | Intro. to Computer Science | Comp. Sci. |       4 |
| CS-190    | Game Design                | Comp. Sci. |       4 |
| CS-315    | Robotica                   | Comp. Sci. |       3 |
| CS-319    | Image Processing           | Comp. Sci. |       3 |
| CS-347    | Database System Concepts   | Comp. Sci. |       3 |
| EE-181    | Intro. to Digital Systems  | Elec. Eng. |       3 |
| FIN-201   | Investment Banking         | Finance    |       3 |
| HIS-351   | World History              | History    |       3 |
| MU-199    | Music Video Production     | Music      |       3 |
| PHY-101   | Physical Principles        | Physics    |       4 |
+-----------+----------------------------+------------+---------+

mysql> select * from teaches;
+-------+-----------+--------+----------+------+
| ID    | course_id | sec_id | semester | year |
+-------+-----------+--------+----------+------+
| 76766 | BIO-101   | 1      | Summer   | 2009 |
| 76766 | BIO-301   | 1      | Summer   | 2010 |
| 10101 | CS-101    | 1      | Fall     | 2009 |
| 45565 | CS-101    | 1      | Spring   | 2010 |
| 83821 | CS-190    | 1      | Spring   | 2009 |
| 83821 | CS-190    | 2      | Spring   | 2009 |
| 10101 | CS-315    | 1      | Spring   | 2010 |
| 45565 | CS-319    | 1      | Spring   | 2010 |
| 83821 | CS-319    | 2      | Spring   | 2010 |
| 10101 | CS-347    | 1      | Fall     | 2009 |
| 98345 | EE-181    | 1      | Spring   | 2009 |
| 12121 | FIN-201   | 1      | Spring   | 2010 |
| 32343 | HIS-351   | 1      | Spring   | 2010 |
| 15151 | MU-199    | 1      | Spring   | 2010 |
| 22222 | PHY-101   | 1      | Fall     | 2009 |
+-------+-----------+--------+----------+------+
15 rows in set (0.00 sec)

mysql> select name, title
-> from instructor natural join teaches, course
-> where teaches.course_id = course.course_id;
+------------+----------------------------+
| name       | title                      |
+------------+----------------------------+
| Crick      | Intro. to Biology          |
| Crick      | Genetics                   |
| Srinivasan | Intro. to Computer Science |
| Katz       | Intro. to Computer Science |
| Brandt     | Game Design                |
| Brandt     | Game Design                |
| Srinivasan | Robotica                   |
| Katz       | Image Processing           |
| Brandt     | Image Processing           |
| Srinivasan | Database System Concepts   |
| Kim        | Intro. to Digital Systems  |
| Wu         | Investment Banking         |
| El Said    | World History              |
| Mozart     | Music Video Production     |
| Einstein   | Physical Principles        |
+------------+----------------------------+
15 rows in set (0.00 sec)

mysql> select name, title
    -> from instructor natural join teaches natural join course;
+------------+----------------------------+
| name       | title                      |
+------------+----------------------------+
| Crick      | Intro. to Biology          |
| Crick      | Genetics                   |
| Srinivasan | Intro. to Computer Science |
| Katz       | Intro. to Computer Science |
| Brandt     | Game Design                |
| Brandt     | Game Design                |
| Srinivasan | Robotica                   |
| Katz       | Image Processing           |
| Brandt     | Image Processing           |
| Srinivasan | Database System Concepts   |
| Kim        | Intro. to Digital Systems  |
| Wu         | Investment Banking         |
| El Said    | World History              |
| Mozart     | Music Video Production     |
| Einstein   | Physical Principles        |
+------------+----------------------------+
15 rows in set (0.00 sec)

По результатам я не вижу разницы и, более того, я не понимаю, почему должна быть разница. В отличие от того, чтокнига состояния, естественное объединение инструктора и учит содержит атрибуты идентификатор, имя, название отдела, зарплата, идентификатор курса, идентификатор id, семестр, год .

1 Ответ

0 голосов
/ 25 августа 2018

Книга верна.Эти запросы не эквивалентны.Пример данных ( имя_детчика значения разные):

INSERT INTO course(course_id, title, dept_name, credits)
VALUES (1, 'Course_1', 'DeptX', 10);
INSERT INTO instructor(ID, name, dept_name, salary)
VALUES (1, 'Prof X', 'DeptY', 10000);
INSERT INTO teaches(ID, course_id, sec_id, semester, year)
VALUES (1, 1, 10,10,2000);

DBFiddle Demo

Лично я бы не использоваллюбой из предложенных запросов:

-- mixing natural join with old-comma syntax
select name, title
from instructor natural join teaches, course
where teaches.course_id = course.course_id;
--Output
--name      title
--Prof X    Course_1

-- natural join(potentially dangerous-depends on names of columns)
select name, title
from instructor natural join teaches natural join course;
-- 0 rows selected

и переписать его как:

SELECT i.name, c.title
FROM instructor i
JOIN teaches t
  ON t.ID = i.ID
JOIN course c
  ON t.course_id = c.course_id;

DBFiddle Demo2

...