MySQL ПРИСОЕДИНЯЙТЕСЬ или ИСПОЛЬЗУЙТЕ?
Таблицы базы данных
Чтобы продемонстрировать, как работают предложения USING и ON, давайте предположим, что у нас есть следующие таблицы базы данных post
и post_comment
, которые формируют связь один ко многим через столбец внешнего ключа post_id
в таблице post_comment
, ссылающейся на столбец первичного ключа post_id
в таблице post
:
Родительская таблица post
имеет 3 строки:
| post_id | название | |---------|-----------| | 1 | Ява | | 2 | Спящий режим | | 3 | JPA |
и дочерняя таблица post_comment
имеет 3 записи:
| post_comment_id | обзор | post_id | |-----------------|------------|---------| | 1 | Хорошо | 1 | | 2 | Отлично | 1 | | 3 | Потрясающе | 2 |
Предложение JOIN ON с использованием пользовательской проекции
Традиционно при написании запроса INNER JOIN
или LEFT JOIN
мы используем предложение ON для определения условия соединения.
Например, чтобы получить комментарии вместе с соответствующим названием сообщения и идентификатором, мы можем использовать следующий запрос проекции SQL:
SELECT пост.post_id, заголовок, обзор ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ON post.post_id = post_comment.post_id ЗАКАЗАТЬ ПО post.post_id, post_comment_id
И мы получаем следующий набор результатов:
| post_id | название | обзор | |---------|------------|-----------| | 1 | Ява | Хорошо | | 1 | Ява | Отлично | | 2 | Спящий режим | Потрясающе |
Предложение JOIN USING с использованием пользовательской проекции
Когда столбец внешнего ключа и столбец, на который он ссылается, имеют одно и то же имя, мы можем использовать предложение USING, как в следующем примере:
SELECT post_id, заголовок, обзор ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ИСПОЛЬЗОВАНИЕ(post_id) ЗАКАЗАТЬ ПО post_id, post_comment_id
Набор результатов для этого конкретного запроса идентичен предыдущему SQL-запросу, в котором использовалось предложение ON:
| post_id | название | обзор | |---------|------------|-----------| | 1 | Ява | Хорошо | | 1 | Ява | Отлично | | 2 | Спящий режим | Потрясающе |
Предложение USING работает для Oracle, PostgreSQL, MySQL и MariaDB. SQL Server не поддерживает предложение USING, поэтому вместо него необходимо использовать предложение ON.
Предложение USING можно использовать с операторами INNER, LEFT, RIGHT и FULL JOIN.
Предложение SQL JOIN ON с
SELECT *
Теперь, если мы изменим предыдущий запрос предложения ON, чтобы выбрать все столбцы, используя SELECT *
:
SELECT * ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ON post.post_id = post_comment.post_id ЗАКАЗАТЬ ПО post.post_id, post_comment_id
Мы получим следующий результирующий набор:
| post_id | название | post_comment_id | обзор | post_id | |---------|------------|-----------------|--------- --|---------| | 1 | Ява | 1 | Хорошо | 1 | | 1 | Ява | 2 | Отлично | 1 | | 2 | Спящий режим | 3 | Потрясающе | 2 |
Как видите,
post_id
— это дубликат , потому что обе таблицыpost
иpost_comment
содержат столбецpost_id
.
Предложение SQL JOIN USING с
SELECT *
С другой стороны, если мы запустим запрос SELECT *
, содержащий предложение USING для условия JOIN:
SELECT * ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ИСПОЛЬЗОВАНИЕ(post_id) ЗАКАЗАТЬ ПО post_id, post_comment_id
Мы получим следующий результирующий набор:
| post_id | название | post_comment_id | обзор | |---------|------------|-----------------|--------- --| | 1 | Ява | 1 | Хорошо | | 1 | Ява | 2 | Отлично | | 2 | Спящий режим | 3 | Потрясающе |
Вы видите, что на этот раз столбец
post_id
дедуплицирован, поэтому в результирующий набор включен один столбецpost_id
.
Заключение
Если схема базы данных разработана таким образом, что имена столбцов внешнего ключа соответствуют столбцам, на которые они ссылаются, и условия ПРИСОЕДИНЕНИЯ проверяют только, равно ли значение столбца внешнего ключа значению его зеркального столбца в другой таблице, то вы можете использовать предложение USING.
В противном случае, если имя столбца внешнего ключа отличается от ссылочного столбца или вы хотите включить более сложное условие соединения, вместо этого следует использовать предложение ON.
Запрос на присоединение к MySQL с использованием лайка?
спросил
Изменено 3 года, 10 месяцев назад
Просмотрено 59 тысяч раз
Я уже давно пытаюсь заставить это работать, но это просто не работает, может быть, это даже невозможно, я хочу выполнить запрос на соединение MySQL, используя, например, как этот пример я нашел…
ВЫБЕРИТЕ * ИЗ Таблицы1 INNER JOIN Table2 ON Table1.col LIKE '%' + Table2.col + '%'
, но, похоже, это вообще не работает, любая помощь, которая может быть оказана, была бы блестящей, спасибо!
- mysql
- join
- sql-подобный
Попробуйте
SELECT * ИЗ Таблицы1 INNER JOIN Table2 ON Table1. col LIKE CONCAT('%', Table2.col, '%')
MySQL выполняет конкатенацию строк не так, как другие базы данных, поэтому, если вы хотите перенести свое приложение, вам нужна альтернативная версия, где
используется как оператор конкатенации, как упоминал Майкл в другом ответе. Однако этот оператор не работает в MySQL, так как он означает или
.
2
Как насчет этого вместо этого:
SELECT * FROM Table1, Table2 WHERE Table1.col LIKE '%'+Table2.col+'%';
Поскольку вы все равно выбираете все из обеих таблиц, это, вероятно, приведет вас туда.
0
ВЫБРАТЬ p.products_id, pd.products_name, p.products_model ИЗ product_description pd ПРИСОЕДИНЯЙТЕСЬ к продуктам p ON p.products_id = pd.products_id ГДЕ pd.products_name LIKE CONCAT ('%', p.products_model, '%') ПРЕДЕЛ 0 , 100
Во-первых, вы должны ограничить свой запрос (p.