11,sql 合并效果集

打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

  1. 合并结果集(垂直)
复制代码
  1. 语法:
  2.     union  #去重复行合并
  3.     union all  #不去重复合并
  4. 作用:
  5.     将多个结果集,垂直拼接,统一返回
  6.     汇总返回
  7. 注意:
  8.     合并的多个结果集之间的列数和类型要一一对应
  9.     合并结果集,是垂直数据合并,数据行之间不会有关联,不要求合并的结果表存在主外键关系
  10.     重复行,一行中的所有数据都重复
复制代码
  1. 1,创建两个表
  2. create table b1(
  3.         b_id int,
  4.         b_name varchar(20),
  5.         b_age tinyint unsigned
  6.        
  7. )
  8. create table b2(
  9.         b2_id int,
  10.         b2_name varchar(20),
  11.         b2_age tinyint unsigned
  12. )
  13. 插入数据
  14. insert into  b1 values (1,'111',20),(2,'22',3)
  15. insert into  b2 values (2,'b111',20),(2,'22',3)
复制代码
  1. 然后进行查询处理
  2. union 的意思是合并,并且去掉重复的数据
  3. select * from 表名 union select * from 表名
  4. union all 的意思是合并所有的数据
  5. select * from 表名 union all select * from 表名
  6. # 去重复合并 [将a和b的数据去重复合并成一个结果集]
  7. SELECT * FROM a
  8. UNION
  9. SELECT * FROM b;
  10. # 不去重复合并
  11. SELECT * FROM a
  12. UNION ALL
  13. SELECT * FROM b
复制代码


合并效果集(程度)
1,内连接
作用:可以查到多个表中行的所有数据
语法
select * from 表1 join 表2 on 表1.主键 = 表2.主键(标准写法是,所有数据库都可以用)
select * from 表1,表2 where 表1.主键 = 表2.主键  (非标准写法,只在Mysql中可用)
注意事项,表也可以起别名
起别名方法  一种是空格隔开,一种是as 
1,表1 表1的别名
2,表1 as 表1的别名

select * from 表1 as 表1的别名  join 表2 as 表2的别名 on 表1的别名.主键 = 表2的别名.主键(标准写法是,所有数据库都可以用)
select * from 表1,表2 where 表1.主键 = 表2.主键  (非标准写法,只在Mysql中可用)

1,查询员工编号、姓名以及所属部门的编号和部门名称
  1. 语法
  2. 标准写法
  3. select 表1.列名1,表1.列名2 表2.列表1 from 表1 join 表2 on 表1.主键 = 表2.主键
  4. 非标准写法
  5. select 表1.列名1,表1.列名2 表2.列表1 from 表1,表2 where 表1.主键 = 表2.主键
  6. select e.eid , e.ename,  d.did , d.dname from t_employee e join t_department d on e.eid = d.did
  7. select e.eid , e.ename,  d.did , d.dname from t_employee e,t_department d where e.eid = d.did
复制代码

  1. 添加额外的条件筛选
复制代码
  1. 如果有额外的条件(非主外键相等) 两种都正常添加where即可! 添加条件
复制代码
  1. 语法
  2. 标准写法
  3. 正常写完后面加上where 然后跟上条件就行
  4. select 表1.列名1,表1.列名2,表2.列名1 from 表1 join 表2 on 表1的主键 = 表2的主键 where  表1.列名2 > 5(这种条件)
  5. select e.eid , e.ename,  d.did , d.dname from t_employee e join t_department d on e.did = d.did where e.eid > 10
  6. 非标准写法直接后面使用and or就行
  7. select e.eid , e.ename,  d.did , d.dname from t_employee e, t_department d where e.did = d.did And e.eid > 10
复制代码

多个表乃至n个表内连接查询
  1. 语法
  2. select 表1.列名1,表1.列名2,表2.列名1 from 表1 join 表2 on 表1的主键 = 表2的主键 join 表3 on 表3.主键 = 表1.主键
  3. 使用 from  A   join   B on  A.主键 = B.主键    join  C   on A.主键 = C.主键
  4. select e.eid , e.ename,  d.did , d.dname,j.jid,j.jname from t_employee e join t_department d on e.did = d.did   JOIN t_job j on e.eid = j.jid
  5. 非标准语法
  6. select 表1.列名1,表1.列名2,表2.列名1 from 表1 ,表2,表3 where 表1的主键 = 表2的主键 and 表3.主键 = 表1.主键
  7. select e.eid , e.ename,  d.did , d.dname,j.jid,j.jname from t_employee e, t_department d ,t_job j where e.did = d.did and e.eid = j.jid
复制代码

多个表乃至n个表内连接查询并且添加条件
  1. 1,标准语法
  2. 标准语法在最后面添加   where   条件
  3. select e.eid , e.ename,  d.did , d.dname,j.jid,j.jname from t_employee e join t_department d on e.did = d.did   JOIN t_job j on e.eid = j.jid WHERE e.ename like '黄%'
  4. 2,非标准语法
  5. 非标准语法   and or 添加即可
  6. select e.eid , e.ename,  d.did , d.dname,j.jid,j.jname from t_employee e, t_department d ,t_job j where e.did = d.did and e.eid = j.jid and e.ename like '黄%'
复制代码

  1. 外连接查询
复制代码
  1. /*
  2.    语法:
  3.        表1 别名 left | right [outer] join 表2 别名 on 主 = 外键
  4.    作用:
  5.        连接的作用和内连接一致
  6.        外连接可以通过left或者right指定一个逻辑主表,逻辑主表的数据一定会显示全
  7.    注意:
  8.        内连接-> 必须存在主外键 主外键相等
  9.        外连接-> 指定一个逻辑主表,一定会显示全
  10.        外连接的outer可以省略  left join = left outer join
  11.        经验: 如果有逻辑主表,就将逻辑主表放在第一位, 后面全部是左外连接
  12. */
复制代码
  1. 语法
  2. 在 JOIN 前面添加 left 或者right,尽量把主逻辑表放在左边,之后直接都left 就行
  3. select e.eid,e.ename,d.did,d.dname,j.jid from t_employee e left Join t_department d on e.eid = d.did left JOIN t_job as j on j.jid  = e.eid
复制代码



内外连接总结



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表