多表查询-左右连接-SQL1999:语法-分组查询

来源:互联网 发布:杜兰特里约奥运会数据 编辑:程序博客网 时间:2024/05/07 10:48

注:本文是基于Oracle提供的scott表


多表查询是通过表和表直接的关系,查询出需要的数据
例如代码为:
select count(*) from emp,dept
查询出 emp,dept两个表中的所有数据
但是这之中会出闲一些冗余的信息,emp表示14条数据 dept表是4条数据,但是查出了56条,这其中很多事冗余的数据,通过建立两个表之间的关系可以去消除这个笛卡尔积,所以代码可以写为:
select * from emp e,dept d where e.deptno=d.deptno
emp e,dept d 这里的e d 是为emp 和dept取得别名
多表查询不仅限于多张表,在一张表上也可以使用多表查询,例如:

--查询出每一位雇员的姓名,职位,领导的姓名
这里要查询的是emp表上的员工的姓名,职位,其对应领导的姓名,这就需要查询两次表,二两次之间的联系是第一次的mgr 和第二次的empno是一样的,这事就要用到 别名:
代码为:
select e1.ename,e1.job, e2.ename from emp e1,emp e2 where e1.mgr=e2.empno
左右连接
--左连接 右连接
--(+) 代表连接方向 以左表为主表,就是左连接 主表的数据可以完全查出来
--左连接 :左边的表是主表,
--如果(+)在右边,那就是左连接 (+)在左,那就是右连接
select e.ename,e.job,m.ename from emp e,emp m  where  e.mgr=m.empno(+)
SQL:1999语法
--交叉连接
select * from emp cross join dept --作用就是为了产生笛卡尔积,效果同于
select * from emp , dept
--自然连接 自动找寻表与表之间的外键关联关系 (必须要有外键关联关系)(消除笛卡尔积)
select * from emp natural join dept--不会产生笛卡尔积 等同于
select * from emp , dept where emp.deptno=dept.deptno
--JOIN USING 子句 (相同字段名称可以使用)
select * from emp join  dept using(deptno)
--JOIN ON 子句 (不相同字段名称也是可以使用)
select * from emp join dept on (emp.deptno=dept.deptno)
--外链接 (左外链接 右外链接 全连接)
select * from emp left  outer join dept on emp.deptno=dept.deptno
-- 右外链接
select * from emp right  outer join dept on emp.deptno=dept.deptno
--全连接
select * from emp full  outer join dept on emp.deptno=dept.deptno 
分组连接就是一个关键词group by 还有一个子语句 having
举个例子
统计平均工资大于两千的部门信息
select avg(e.sal),d.deptno, d.dname, d.loc, count(empno)from emp e, dept d where e.deptno=d.deptno(+) group by d.deptno, d.dname, d.loc  having avg(e.sal)>2000