Как я могу получить похожие строки из разных таблиц в одном запросе? - PullRequest
2 голосов
/ 16 мая 2009

Допустим, у меня есть две или более таблицы, заполненные пользователями, и я хочу получить всех пользователей из этих таблиц в одном запросе.

Таблицы имеют общие столбцы, и я пытаюсь получить те столбцы с одинаковыми именами.

Что-то вроде:

SELECT name, age FROM users1;
SELECT name, age FROM users2;
etc.

Примечание: это всего лишь пример, а не реальная проблема. Я не могу объединить эти таблицы в одну.

Ответы [ 4 ]

7 голосов
/ 16 мая 2009

Вы можете использовать UNION :

UNION используется для объединения результатов нескольких операторов SELECT в один набор результатов.

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

Пример:

mysql> SELECT 1 as ColumnA,'a' as ColumnB
    -> UNION
    -> SELECT 2, 'b'
    -> UNION
    -> SELECT 3, 'c';
+---------+---------+
| ColumnA | ColumnB |
+---------+---------+
|       1 | a       |
|       2 | b       |
|       3 | c       |
+---------+---------+
3 rows in set (0.05 sec)

Также обратите внимание:

Поведение по умолчанию для UNION состоит в том, что повторяющиеся строки удаляются из результата. Необязательное ключевое слово DISTINCT не имеет никакого эффекта, кроме значения по умолчанию, поскольку оно также указывает удаление дублирующихся строк. При использовании необязательного ключевого слова ALL удаление повторяющихся строк не происходит, и результат включает все совпадающие строки из всех операторов SELECT.

Пример:

mysql> SELECT 1 as x
    -> UNION
    -> SELECT 1;
+---+
| x |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

mysql> SELECT 1 as x
    -> UNION ALL
    -> SELECT 1;
+---+
| x |
+---+
| 1 |
| 1 |
+---+
2 rows in set (0.00 sec)
2 голосов
/ 16 мая 2009

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

select name, age from users1
union
select name, age from users2
union
select name, age from users3

или

select name, age from users1
union all
select name, age from users2
union all
select name, age from users3

Разница в том, что union удаляет дубликаты, а union all - нет.

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

1 голос
/ 16 мая 2009

Попробуйте

SELECT name, age FROM users1
UNION
SELECT name, age FROM users2
0 голосов
/ 16 мая 2009

обратите внимание также, что 'union all' будет намного быстрее, чем 'union'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...