mysql语法之union

UNION的语法结构:html

SELECT ...mysql

UNION [ ALL | DISTINCT ]  SELECT ....sql

[ UNION [ ALL | DISTINCT ] SELECT .....]优化

UNION 用于将多个SELECT语句中的结果组合到单个结果集中。spa

1 第一个SELECT语句用的列名称用做返回结果的列名称code

其中第一个select中查询的列名为user_name,第二个select中查询的列名为password,但显示的结果列名称只有user_namehtm

在多个select语句中,对应的列应该具备相同的数据类型,若是相应的select猎德数据类型不匹配,则union结果中列的类型和长度会考虑全部的select语句检索的值blog

UNION DISTINCT   和 UNION ALL 排序

UNION DISTINCT 组合俩个输入,并应用DISTINCT过滤重复的行,通常DISTINCT能够省略,由于UNION默认是删除结果中重复的行。UNION ALL不会删除重复的行,结果包括全部SELECT语句中全部的匹配行token

SELECT * FROM T1 WHERE   = 10 UNION ALL SELECT * FROM T1 WHERE a = 10;

查询出来的结果会有俩分相同的数据(这里就不作实际例子了)

UNION 中使用  ORDER BY 和 LIMIT 

要对单个select语句应用ORDER BY 或 LIMIT ,请将子句放在括号括住的select语句中:

(select a from t1 where a = 10 order by a limit 10) 

union

(select * from t2 where a = 11 order by a limit 10);

但要注意的是,ORDER BY 对于单个SELECT 语句的使用并不意味着在最终结果中进行排序,由于UNION默认状况下会生成一组无序的结果集。所以这里要使用ORDER BY 一般会结合LIMIT使用,来肯定要取出的行的数量,若是只用了ORDER BY 没有配合使用LIMIT,那么ORDER BY 会被优化掉,由于它不会有任何效果

若是想整个结果集使用ORDER BY 或 LIMIT 进行排序或限制,请将各个SELECT语句括起来并把ORDER BY 或 LIMIT  放在最后:

(select a from t1 where a = 10 )

union 

(select a from t2 where a = 11)

order by a limit 10;

但要注意上面的这种状况ORDER BY引用的列名不能包含表名(例如:table_name.col_name)

此外,若是要排序的列是别名,则该ORDER BY子句必须引用别名,而不是列名。如下第一个语句将起做用,但第二个语句将失败并显示 Unknown column 'a' in 'order clause'错误:

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;

若是相在整个结果集中对每一个SELECT的结果集排序,请在每一个SELECT中选择一个附加列用以排序,并ORDER BY在最后添加一下内容:

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)

UNION

(SELECT 2 AS sort_col,col2a, col2b, ... FROM t2) ORDER BY sort_col;

要在单个SELECT结果中另外维护排序顺序 ,请在ORDER BY子句中添加辅助列

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)

UNION

(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;

相关文章
相关标签/搜索