• SQL里各种联合查询总结


    SQL里各种联合查询总结

     
    create database mytest
    go  www.2cto.com  
    use mytest
    go
    create table t_dept
    (
     d_id int primary key identity(1,1),
     d_name varchar(20),
     d_remark varchar(20)
    )
    go
    create table t_emp
    (
     e_id int primary key identity(1,1),
     d_id int references t_dept(d_id),
     e_name varchar(20),
     e_sex varchar(4)
    )
    go  www.2cto.com  
    insert into t_dept values('一部','1111');
    insert into t_dept values('二部','2222');
    insert into t_dept values('三部','3333');
    insert into t_dept values('四部','4444');
    go
    insert into t_emp values(1,'一部A君','男');
    insert into t_emp values(1,'一部B君','男');
    insert into t_emp values(2,'二部C君','女');
    insert into t_emp values(null,'三部D君','男');
    go
    select * from t_dept;
    select * from t_emp;
    go
    --注:联接查询,哪个表在前,就以哪个表为主表
     
    --内联接(两表标识号相同的所有行)
    select * from t_dept a inner join t_emp b on a.d_id=b.d_id ;
    1 一部 1111 1 1 一部A君 男
    1 一部 1111 2 1 一部B君 男
    2 二部 2222 3 2 二部C君 女
     
    --外连接(外联接可以是左向外联接、右向外联接或完整外部联接)
     
    --(1)
    select * from t_dept a left outer join t_emp b on a.d_id=b.d_id ;--"左外连接  等同于  左连接"
    select * from t_dept a left join t_emp b on a.d_id=b.d_id ;--左连接(所有的部门显示,员工表里部门id为null的显示不出来)
     
    1 一部 1111 1 1 一部A君 男
    1 一部 1111 2 1 一部B君 男
    2 二部 2222 3 2 二部C君 女
    3 三部 3333 NULL NULL NULL NULL
    4 四部 4444 NULL NULL NULL NULL
      www.2cto.com  
    --(2)
    select * from t_dept a right outer join t_emp b on a.d_id=b.d_id ;--"右外连接  等同于  右连接"
    select * from t_dept a right join t_emp b on a.d_id=b.d_id ;--右连接,员工表所有员工显示,"三部"和"四部"没有员工的部门则该部门不显示
    1 一部 1111 1 1 一部A君 男
    1 一部 1111 2 1 一部B君 男
    2 二部 2222 3 2 二部C君 女
    NULL NULL NULL 4 NULL 三部D君 男
     
    --(3)
    --完整外部联接,返回左表和右表中的所有行
    --当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。   
    select * from t_dept a full outer join t_emp b on a.d_id=b.d_id ;
    select * from t_dept a full join t_emp b on a.d_id=b.d_id ;
     
    1 一部 1111 1 1 一部A君 男
    1 一部 1111 2 1 一部B君 男
    2 二部 2222 3 2 二部C君 女
    3 三部 3333 NULL NULL NULL NULL
    4 四部 4444 NULL NULL NULL NULL
    NULL NULL NULL 4 NULL 三部D君 男
     
    --笛卡尔积
    select * from t_emp,t_dept
    select * from t_dept,t_emp
    --返回16条数据,左表有4条,右表有4条,返回行数为4*4=16(条),产生笛卡尔积
      www.2cto.com  
    1 一部 1111 1 1 一部A君 男
    2 二部 2222 1 1 一部A君 男
    3 三部 3333 1 1 一部A君 男
    4 四部 4444 1 1 一部A君 男
    1 一部 1111 2 1 一部B君 男
    2 二部 2222 2 1 一部B君 男
    3 三部 3333 2 1 一部B君 男
    4 四部 4444 2 1 一部B君 男
    1 一部 1111 3 2 二部C君 女
    2 二部 2222 3 2 二部C君 女
    3 三部 3333 3 2 二部C君 女
    4 四部 4444 3 2 二部C君 女
    1 一部 1111 4 NULL 三部D君 男
    2 二部 2222 4 NULL 三部D君 男
    3 三部 3333 4 NULL 三部D君 男
    4 四部 4444 4 NULL 三部D君 男
  • 相关阅读:
    redis list 清空记录小技巧
    fastJson 之 JSONPath使用
    【移动开发】怎样自己定义ViewGroup
    POJ 3255 Roadblocks
    java带图片的邮件发送方法实现
    android学习二(Activity)
    OpenWRT加入 crontab开机默认运行
    ubuntu14.04启动提示set_sw_state failed
    jekyll bootstrap更改主题theme
    windows API 实现截图
  • 原文地址:https://www.cnblogs.com/langtianya/p/3015018.html
Copyright © 2020-2023  润新知