【SQL从一点一滴分析系列文章】为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询

在分析 SQL 时,也会同时分析 mybatis 、Hibernate 中的相关操作

点击查看详情

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

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

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

表一 用户 t_user 表

java QueryWrapperX联表查询_java中组合类不需要多表联查

表二 部门 t_dep 表

java QueryWrapperX联表查询_Server_02

我们要显示 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

查询结果如下

java QueryWrapperX联表查询_结果集_03

我们可以看到有两条重复 张三 数据,如果要去重,我们可以使用 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

复制代码

java QueryWrapperX联表查询_结果集_04

这三个表中 分别通过 user_id 来关联

完结