mysql面试题sql语句多表联查mysqlunion详解_MySQL联合查询union详解-Fun⾔
⼀、UNION和UNION ALL的作⽤和语法
UNION ⽤于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复⾏。
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法:
SELECT column_name FROM table1
UNION
SELECT column_name FROM table2
UNION 默认会去掉重复记录值再合并成结果集,如果需要保留重复的记录值,请使⽤ UNION ALL。
当 ALL 随 UNION ⼀起使⽤时(即 UNION ALL),不消除重复⾏
SQL UNION ALL 语法
SELECT column_name FROM table1
UNION ALL
SELECT column_name FROM table2
UNION 结果集中的列名总是等于 UNION 中第⼀个 SELECT 语句中的列名。
注意:
1、UNION 结果集中的列名总是等于第⼀个 SELECT 语句中的列名
2、UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型,每条 SELECT 语句中的列的顺序必须相同
⼆、union的⽤法及注意事项
union联合的意思,即把两次或多次查询结果合并起来。
要求两次查询的列数必须⼀致
推荐:列的类型可以不⼀样,但推荐查询的每⼀列,想对应的类型以⼀样
可以来⾃多张表的数据:多次sql语句取出的列名可以不⼀致,此时以第⼀个sql语句的列名为准。
楞严咒7分钟念诵如果不同的语句中取出的⾏,有完全相同(这⾥表⽰的是每个列的值都相同),那么union会将相同的⾏合并,最终只保留⼀⾏(union默认会去掉重复的⾏)。
如果不想去掉重复的⾏,可以使⽤union all。
精通android游戏开发如果⼦句中有order by,limit,需⽤括号()包起来。推荐放到所有⼦句之后,即对最终合并的结果来排序或筛选。如:
(select * from a order by id) union (select * from b order id);
在⼦句中,order by 需要配合limit使⽤才有意义。如果不配合limit使⽤,会被语法分析器优化分析时去除。
三、学习例⼦
下⾯的例⼦中使⽤的原始表:
table1) Employees_China:
E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03
Carter, Thomas
04 Yang, Ming
table2)Employees_USA:
E_ID E_Name
01 Adams, John
02 Bush, George
03
Carter, Thomas
04 Gates, Bill
sourcemap使⽤ UNION 命令实例
列出所有在中国和美国的不同的雇员名:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
结果:
java接口练习E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill
注释:这个命令⽆法列出在中国和美国的所有雇员。
在上⾯的例⼦中,我们有两个名字相同的雇员,他们当中只有⼀个⼈被列出来了。UNION 命令只会选取不同的值。使⽤ UNION ALL 命令实例
UNION ALL 命令和 UNION 命令⼏乎是等效的,不过 UNION ALL 命令会列出所有的值。
SQL Statement 1
UNION ALL
SQL Statement 2
实例:列出在中国和美国的所有的雇员:
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
结果
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
四、项⽬使⽤例⼦
web项⽬中经常会碰到整站搜索的问题,即客户希望在⽹站的搜索框中输⼊⼀个词语,然后在整个⽹站中只要包含这个词的页⾯都要出现在搜索结果中。由于⼀个web项⽬不可能⽤⼀张表就全部搞定的,所以这⾥⼀般都是要⽤union联合搜索来解决整个问题的。
下⾯列举本次使⽤的union联合搜索的sql语句:
select * from
(SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND `subject` LIKE '%调整图⽚%' ORDER BY `add_time` DESC)输入输出模块安装高度
as t1
union all
select * from
(SELECT `id`,`class_name` AS `subject` FROM `web_class` WHERE `active`='1' AND `class_name` LIKE '%调整图⽚%' ORDER BY `class_id` DESC)
as t2
union
select * from
(SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND (`subject` LIKE '%调整%' OR `subject` LIKE '%图⽚%') ORDER BY `add_time` DESC)
as t3;
以上SQL语句的联合查询主要⽤到了union all和union,⾄于这两者的区别就是union all会列举所有符合条件的查询结果,⽽union会将所有符合条件的查询结果做⼀下去除重复结果的筛选。
对于以上SQL语句的解释就是由于article表和web_class表分属两个不同的表,所以这⾥不⽤去除重复结果。然⽽以上联合查询的第三个分⽀的sql查询语句是由分词然后组合出来的查询语句,这条sql语句查询的结果是肯定包含第⼀个分⽀sql语句的查询结果的,这⾥就显得没必要了,所以没有使⽤all⽽去掉重复的查询结果。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论