Как выглядит вывод оператора JOIN?


8

Я давно хотел использовать объединения, но у меня возникают проблемы с визуализацией вывода, поэтому я знаю, как его использовать.

Допустим, у меня есть 2 таблицы:

CREATE TABLE Cities (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    city tinyblob
);

CREATE TABLE Users (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username TINYBLOB,
    city INT UNSIGNED,
    FOREIGN KEY (city) REFERENCES Cities (id)
);

Если мое приложение должно выполнить запрос SQL для получения данных профиля пользователя, как бы я использовал объединение, чтобы связать город, связанный с записью пользователя, и как будет выглядеть выведенная запись?

Ответы:


12

Каждый результат операции SQL является функционально новой таблицей, независимо от того, хранится она на диске или в памяти.

Функция объединения состоит в том, чтобы «объединить» две таблицы в синтетическую третью таблицу, которая (обычно) существует в памяти только во время ее вывода в приложение.

Причина использования объединения состоит в том, чтобы уменьшить аномалии данных , гарантируя, что данные появляются в одном и только одном месте в базе данных.

Учтите следующее:

Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)

Здесь всякий раз, когда правительство меняет почтовые индексы (что происходит слишком часто для вкусов разработчиков баз данных *), необходимо обновлять таблицу персон, чтобы все старые почтовые индексы правильно принадлежали правильному городу и новому почтовому индексу.

В этом случае один и тот же почтовый индекс находится в нескольких кортежах таблицы, и, если таблица редактируется вручную, это приведет к серьезным аномалиям обновления, поскольку новые комбинации города / почтового индекса вводятся без обновления базы данных в целом.

Имея три таблицы вместо этого, мы получаем те же данные, но с повышенной гибкостью и надежностью (за счет некоторой производительности, хотя вопросы «соответствующей денормализации» являются темой для другой серии ответов).

Person ( PersonID Integer Primary Key, FName String, LName String)

City ( CityID Integer Primary Key, City String, State String, ZipCode String )

Address ( AddressID Integer Primary Key, AddressLine1 String, CityID Integer References City, PersonID Integer References Person)`

И мы можем получить одну «таблицу» из вышеперечисленного с помощью следующего запроса: SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

Это позволяет нам обновлять отдельные таблицы всякий раз, когда что-то конкретное в них изменяется, не повреждая остальные связанные данные.

An INNER JOINявляется типом соединения по умолчанию. Грубо говоря, он отмечает: «объединить кортежи, где эта запись из таблицы a совпадает с этой записью из таблицы b». Другие типы объединений:OUTER JOINS и так называемый a CARTESIAN PRODUCT. Внешнее объединение: «Возьмите все из левой или правой таблицы (как указано) и там, где другая таблица совпадает, соедините ее. Если она не совпадает, заполните ее нулями» И декартово произведение (без попадания в реляционную алгебру is: Возьмите все возможные комбинации кортежей в обеих таблицах и выведите их в одну таблицу, не сопоставляя ничего.

* Больше, чем когда-либо, особенно в случае перемещения границ почтовых индексов из-за Gerrymandering


6

Я думаю, что вы ищете

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)

который дал бы вам

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |

но не верьте мне на слово: попробуйте в вашей базе данных и посмотрите, что вы получите!


3

В двух словах, ваш оператор SQL будет -

SELECT FIELD1, FIELD2 .. FIELDN
FROM PARENT_TABLE 
  INNER JOIN CHILD_TABLE ON ( PARENT_TABLE.PARENT_KEY = CHILD_TABLE.FOREIGN_KEY)

Fields1 .. Fieldsn будет полями, которые вы хотите получить - из одной или обеих таблиц.


Круглые скобки не обязательны, это усложняет чтение запроса.
Spredzy

1
@Spredzy Обратный случай для меня, скобки увеличивают читаемость для меня
Сатьяджит Бхат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.