美文网首页
SQL查询单表数据之组合(三)

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

作者: 早起的年轻人 | 来源:发表于2020-02-22 20:51 被阅读0次

    【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 来关联


    完结

    相关文章

      网友评论

          本文标题:SQL查询单表数据之组合(三)

          本文链接:https://www.haomeiwen.com/subject/fferqhtx.html