Связывание двух и более таблиц в sql
Помогите разобраться, есть задача:
Найдите производителей самых дешевых цветных принтеров.
Вывести: maker, price
Схема БД состоит из четырех таблиц:
- Product(maker, model, type)
- PC(code, model, speed, ram, hd, cd, price)
- Laptop(code, model, speed, ram, hd, price, screen)
- Printer(code, model, color, type, price)
Решение:
SELECT DISTINCT
product.maker,
printer.price
FROM product,
printer
WHERE product.model = printer.model
AND printer.color = 'y'
AND printer.price = ( SELECT MIN(price)
FROM printer
WHERE printer.color = 'y'
)
Суть вопроса:
Для связывания двух таблиц обычно используют оператор JOIN, в решении же обходятся без него, помогите понять, почему так?
Ответы (2 шт):
В таблицах product
и printer
имеются столбцы model
, у которых имеется связь (если Вы немного погрузились в тему, то это как раз те связи 1:1, 1:n и n:n). Создание связей происходит при добавлении внешнего ключа в одну из таблиц .
Для уже существующей таблицы:
ALTER TABLE child_table_name ADD FOREIGN KEY (child_field_name)
REFERENCES parent_table_name(parent_field_name)
В древних диалектах SQL вместо JOIN
использовался оператор запятая ,
, который тогда был эквивалентен CROSS JOIN
Ваш запрос
SELECT …
FROM product, printer
WHERE product.model = printer.model
AND printer.color = 'y' AND printer.price = …
эквивалентен
SELECT …
FROM product CROSS JOIN printer
WHERE product.model = printer.model
AND printer.color = 'y' AND printer.price = …
что, в свою очередь, при наличии в WHERE
отсева по равенству полей, эквивалентно
SELECT …
FROM product INNER JOIN printer ON product.model = printer.model
WHERE printer.color = 'y' AND printer.price = …
В современных СУБД настоятельно не рекомендуется использовать этот синтаксис.