SQL查询单表数据之组合(三)

1,970 阅读3分钟

【SQL从一点一滴分析系列文章】为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis 、Hibernate 中的相关操作 点击查看详情

本节讲述 基本的 select 查询单表数据语句

1 对查询数据结果集的组合(并集)

有这样的需求,要交来自多个表的数据组织到一起,就像是一个结果集叠加到另一个上页面一样,例如有两个表

表一 用户 t_user 表

在这里插入图片描述
表二 部门 t_dep 表
在这里插入图片描述
我们要显示 t_user 表中的用户的 名字和年龄以及 t_dep 表中用户的名字年龄,我们可以使用 union all 来把多个表中的行组合到一起


select user_name,user_age 
    from t_user 
    union all 
select dep_user_name,dep_user_age 
    from t_dep

查询结果如下

在这里插入图片描述
我们可以看到有两条重复 张三 数据,如果要去重,我们可以使用 union 运算符

select user_name,user_age 
    from t_user 
    union  
select dep_user_name,dep_user_age 
    from t_dep

UNION 操作符用于合并两个或多个 SELECT 语句的结果集 UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

2 组合两个表中相关的行

例如这种情况,要显示用户表中所有用户的姓名,以及每个员工的心情日志,这些数据存储在两个独立的表中


select u.user_name,d.dep_user_flag
     from t_user u,t_dep d
where u.user_id = d.dep_user_id

这两个表中通过 用户的 id 来关联,用户表中 user_id ,部门表中,dep_user_id 为用户在用户表中对应的id.

3 对查询数据结果集的组合(交集)

需要查找两个表中共同的行,但是有多个列可以用来联接这两个表,如下

在 MySql 和 SQL Server 中,可使用多个联接条件,将 user 表 与 dep 表中联接起来

select u.user_name as userName,d.dep_user_flag userFlag,d.dep_user_age as age
    from t_user u,t_dep d
where 
    u.user_name = d.dep_user_name 
    and 
    u.user_age = d.dep_user_age

或者使用 join on 子句联接

select u.user_name as userName,d.dep_user_flag userFlag,d.dep_user_age as age
    from t_user u 
	join t_dep d
	on  (
		u.user_name = d.dep_user_name 
		and 
		u.user_age = d.dep_user_age)
4 从一个表中查询另一个表没有的值(两个表的补集)

MySQL 和 SQL Server 中

select u.user_name as userName,u.user_age as age
    from t_user u
where  u.user_name not in (select dep_user_name from t_dep)

使用子名查出 dep 表中所有的 user_name,然后外层查询则从 user 表中查找 子查询结果中没有的行

Oracle 中

select u.user_name from t_user u
minus 
select d.dep_user_name from t_dep d

minus指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现

DB2 和 PostgreSQL 中使用集合操作 except

select u.user_name from t_user u
except 
select d.dep_user_name from t_dep d
5 向查询中增加联接而不影响其他联接

例如 用户信息表 user ,部门信息工作表 dep ,员工奖励表 bonus 表,我们需要返回所有的员工信息、他们工作部门的心情信息、以及所获得的奖励,在这里,并不是每个员工都有部门心情信息,也并不是每个员工有奖励信息,但是我们希望把所有的信息查询出来,这时我们可以这样来写

在 MySQL 、DB2、 PostgreSQL 和SQL Server 中


select u.user_name,u.user_age,d.dep_user_flag,b.bonus_count
from t_user u 

left join t_dep d on d.dep_user_id = u.user_id 
left join t_bonus b on b.bonus_user_id = u.user_id 


在这里插入图片描述
这三个表中 分别通过 user_id 来关联


完结