SQL标准在SQL UNION / EXCEPT / INTERSECT语句中对括号的说法是什么?

时间:2011-01-11 00:45:09

标签: sql mysql sqlite

我正在尝试编写一个适用于MySQL和SQLite的SQL UNION。

(select_clause_A) UNION (select_clause_B)

SQLite不喜欢这些语句的括号(参见 '复合操作员'): http://www.sqlite.org/lang_select.html

不幸的是,如果您使用的话,我认为MySQL需要使用括号 'order by'条款: http://dev.mysql.com/doc/refman/5.0/en/union.html

有没有人碰巧知道哪个数据库遵循SQL标准?我想它们都可能......

3 个答案:

答案 0 :(得分:14)

UNION语句中不需要括号/括号。

MySQL是我目前唯一知道的,它允许您定义特定于每个查询的ORDER BYLIMIT条款,只要查询括在括号中 - 标准SQL只允许ORDER BY表示最终结果。 GROUP BYHAVING子句特定于构成UNION'd语句的每个查询。

MySQL支持:

 (SELECT a.column
    FROM A_TABLE a
ORDER BY a.column DESC)
UNION
SELECT b.column
  FROM B_TABLE b

...如果你想/需要移植到其他数据库,这将不会导致悲伤。

标准SQL仅允许:

SELECT a.column
  FROM A_TABLE a
UNION
SELECT b.column
  FROM B_TABLE b
ORDER BY column DESC

答案 1 :(得分:4)

MySQL不需要parens,从我可以告诉读的规格不应该在那里。

MySQL也是非标准的,因为它在联合的每个“部分”中都支持ORDER BY,所以如果你是为非MySQL编写它,那么无论如何都不能这样做。

答案 2 :(得分:1)

您可以在SQLite中执行此操作:

 select col1, col2.. from ( select col1, col2 from T  order by col1 limit 5)
 union
 select col1, col2.. from ( select col1, col2 from T  order by col2 desc limit 10)

不确定mySQl。