如何从同一查询中的不同表中检索类似的行?

时间:2009-05-16 17:58:59

标签: sql mysql

假设我有两个或更多表填充了用户,我想从同一查询中的那些表中检索所有用户。

表共享一些列,那些具有相同名称的列是我正在尝试检索的列。

类似的东西:

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

注意:这只是一个例子而不是真正的问题。我无法将这些表合并为一个。

4 个答案:

答案 0 :(得分:7)

您可以使用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)

答案 1 :(得分:2)

您可以使用unionunion 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,以便数据库不必进行额外的工作来尝试查找重复项。

答案 2 :(得分:1)

尝试

SELECT name, age FROM users1
UNION
SELECT name, age FROM users2

答案 3 :(得分:0)

另请注意,'union all'将比'union更快'。