Какой запрос я должен использовать?

#mysql

#mysql

Вопрос:

Я пытаюсь правильно изучить mysql. Когда у меня есть запрос, использующий 2 таблицы, нужно ли мне все время писать имена таблиц перед именем поля?

Это тот, который у меня есть

 SELECT 
owner.title, owner.forename, owner.surname,
pet.name, pet.breed
FROM
owner,pet
WHERE
owner.owner_id = pet.owner_id
ORDER BY
owner.surname ASC, pet.name ASC
 

если я поступлю так, это тоже нормально?

 SELECT 
title, forename, surname,
name, breed
FROM
owner,pet
WHERE
owner.owner_id = pet.owner_id
ORDER BY
surname ASC, name ASC 
 

Комментарии:

1. Я бы сказал, ничего из вышеперечисленного. ИСПОЛЬЗУЙТЕ INNER JOIN вместо whera a.id=b.id . они были a.id=b.id скрывает намерение; внутреннее соединение делает его очень четким в отношении того, к каким полям вы присоединяетесь. Это улучшает читабельность

2. неправильно. оба запроса верны

3. @baris22 Вы всегда можете использовать псевдонимы имен таблиц, если не хотите вводить длинные имена таблиц. Пример: select a.title, a.forename, a.surname, b.name, b.breed from owner a, pet b where a.owner_id = b.owner_id order by a.username, b.name

4. @PanayotisMatsinopoulos, синтаксис неявного соединения бесполезен, потому что он затрудняет отладку сложных запросов, отделяет критерии объединения от объединяемых таблиц, затрудняет переписывание внутреннего соединения во внешнее и ряд других причин, связанных со случайными перекрестными соединениями . Лучше избегать их, как чумы.

5. @PanayotisMatsinopoulos, кроме того, запрос 2 выдаст ошибку, если в таблице owner также есть поле с именем name . Таким образом, qry2 менее корректен , чем qry1.

Ответ №1:

Лучшей формой, на мой взгляд, было бы что-то вроде этого (и помните, форма в значительной степени субъективна):

 SELECT o.title, o.forename, o.surname, p.name, p.breed
FROM pet p 
INNER JOIN owner o ON o.owner_id = p.owner_id
ORDER BY o.surname ASC, p.name ASC
 

Я нахожу подобные запросы наиболее удобочитаемыми и простыми в изменении. Если у меня есть несколько таблиц в запросе, я всегда называю свои таблицы псевдонимами и всегда использую этот псевдоним при выборе поля. Запрос, который я написал, также является довольно переносимым запросом, то есть он использует довольно простые функции и синтаксис SQL, поэтому вы можете перенести его в другую СУБД, и вам, вероятно, ничего не придется менять.

Комментарии:

1. @baris: Вы научились объединять таблицы. Но используя старый, очень старый способ.

2. @baris22: если это для занятия, то делайте это так, как хочет от вас ваш инструктор. Но я по-прежнему придерживаюсь своего ответа здесь как «правильного» способа сделать то, что вы пытаетесь сделать. И помните, легко создать новые привычки, трудно изменить устоявшиеся привычки. Делайте это правильно с самого начала, и в дальнейшем вам будет гораздо легче.

3. Проработав более 10 лет в преподавании SQL, я думаю, что ваш учитель не стал бы жаловаться, если бы вы использовали JOIN синтаксис. Или иметь оба способа в качестве опций, на всякий случай, если у него был плохой день 🙂

Ответ №2:

С 1992 года этот:

 FROM
  owner,pet
WHERE
  owner.owner_id = pet.owner_id
 

(по стандартам SQL-92) записывается как:

 FROM
    owner
  JOIN                         --- or the equivalent: INNER JOIN
    pet
      ON owner.owner_id = pet.owner_id
 

Чтобы ответить на ваш вопрос, я бы предпочел первый вариант (модифицированный, как указано выше) второму, в основном для удобства чтения. Возможно, кому-то еще придется прочитать ваш код (или вам, через несколько дней или месяцев), и знание того, к какой таблице принадлежит каждый столбец, может быть полезным:

 SELECT 
  owner.title, owner.forename, owner.surname,
  pet.name, pet.breed
FROM
    owner
  JOIN
    pet
      ON owner.owner_id = pet.owner_id
ORDER BY
  owner.surname ASC, pet.name ASC
 

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


Вы также можете использовать псевдонимы, например:

 SELECT 
  o.title, o.forename, o.surname,
  p.name, p.breed
FROM
    owner AS o
  JOIN
    pet AS p
      ON o.owner_id = p.owner_id
ORDER BY
  o.surname ASC, p.name ASC
 

Ответ №3:

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

Некоторые системы БД (в частности, PostgreSQL) будут жаловаться, если не уверены, к какому столбцу вы обращаетесь.

Комментарии:

1. Все базы данных будут жаловаться, если они не могут определить, какое поле вы используете.

2. Вы правы. Оба запроса верны, но ваш ответ хорошо объясняет, почему вы должны привыкнуть использовать имена таблиц.

3. Это имеет смысл, спасибо, Марк. Я думаю, я имел в виду различное поведение при использовании SELECT * — большинство баз данных будут переименовывать повторяющиеся имена столбцов (поэтому name становится чем-то вроде name_1), тогда как PostgreSQL не использует автоматический псевдоним.

Ответ №4:

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