Связывание двух и более таблиц в 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 шт):

Автор решения: user674434

В таблицах 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 = …

В современных СУБД настоятельно не рекомендуется использовать этот синтаксис.

→ Ссылка