java中组合类不需要多表联查,SQL查询单表数据之组合(三)

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

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

点击查看详情

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

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

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

表一 用户 t_user 表32d690b1f153bb4f6df3f0311bf81158.png

表二 部门 t_dep 表

d0e37b588edc08cb25b46b5578413e82.png

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

复制代码

查询结果如下2241193ec38c24281ed96220fd0b41d7.png

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

复制代码

491e5bc878f3af379d2b615fe5e81e7c.png

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

完结

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[SQL查询单表数据之组合(三)]http://www.zyiz.net/tech/detail-109694.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值