sql多表联查

来源:互联网 发布:网络创业与实践课答案 编辑:程序博客网 时间:2024/06/06 00:52

执行过程
from–>where–>group by –>having–>select–>order by

**select * from emp;    --92连表查询    select * from dept;    select * from emp a, dept b where a.deptno=b.deptno;    --查询员工姓名,部门名称    select e.ename,d.dname from emp e, dept d where e.deptno= d.deptno;    --查询工资大于3000的员工的姓名,工资和部门名称    select e.ename,e.mgr,d.dname from emp e, dept d where e.deptno=d.deptno and e.sal>3000;    --非等值查询    --查询员工的工资等级    select * from emp e ,salgrade s where e.sal<=s.hisal and e.sal>=losal;    select * from salgrade;    select * from emp;    update emp set deptno =15 where job ='管工';    --update emp set ename = '李四',job = '管工',mgr = 002,hiredate = sysdate,sal = 2000,comm = 200,deptno = 10 where empno=21;    --外连接    --左外链接 (+)加在右边,让左边全部显示,以左边为主    select * from emp e ,dept d    where e.deptno=d.deptno(+);    --右外联,(+)在左边,以右边为主,让右边全部显示,以右边为主    select * from emp e , dept d    where e.deptno(+)=d.deptno    select * from emp;    --自连接自己连自己    --查询员工姓名和员工的经理的姓名    select * from emp e1,emp e2    where e1.mgr = e2.empno;    ----查询员工姓名和员工的经理的姓名及经理的姓名的姓名    select e1.ename,e2.ename,e3.ename from emp e1,emp e2,emp e3    where e1.mgr=e2.empno and e2.mgr = e3.empno    /*    这是了解就好了    */    --cross join 交叉连接(笛卡尔级)    select * from emp e cross join dept d;    --natural join 自然连接    select * emp natural join dept;    --using    select e.ename,deptno from emp e join dept d using(depton);

上面了解用

/*下面是重点*/--on 自定义连接条件--这个是指定的emp和dept连,用的是dept的deptno和emp的deptno来连的select * from emp e join dept d on e.deptno = d.deptno;--内连select * from emp e1 join emp e2 on e1.mgr = e2.empno--三重连接,多用于连接省,市,县,街道,这种的select e1.ename,e2.ename,e3.ename from emp e1 join emp e2 on e1.mgr = e2.empno join emp e3 on e2.mgr = e3.empno --inner join 内连 以右边为主,返回两个表都对应的数据select * from emp e inner join dept d on e.empno=e.empno--left join 左连  以左边为主,右边与其对应select * from emp e left join dept d on e.empno=d.deptno--right join 右连 以右边为主,左边与其对应select * from emp e right join dept d on e.empno=d.deptno--full join 全连 只要对不上的都出来,左右边只要有数据都会显示出来select * from emp e full join dept d on e.empno=d.deptno4个中最常用的是内连和左连,4个连接可以混搭使用,如果不知道用什么的话, 就用左连,左连(left join)是最好的,inner是最完美的--查询员工姓名和部门姓名,经理的名称和经理的部门名称 select e1.ename, d1.dname, e2.ename, d2.dname  from emp e1  left join dept d1    on e1.empno = d1.deptno  left join emp e2    on e2.mgr = e2.empno  left join dept d2    on e2.deptno = d2.deptno-- 子查询一个查询的结果,作为另一个查询的条件

子查询的值不知道是什么的时候用子查询
子查询放在括号内,子查询一般都放在右边
子查询内一般不排序(order by),进来放外面

-- 思考:查询工资高于平均工资的雇员名字和工资。        select e.ename,e.sal from emp e where sal>(select avg(sal) from emp);        -- 思考:查询和SCOTT同一部门且比他工资低的雇员名字和工资。        select ename, sal          from emp         where deptno = (select deptno from emp where ename = 'SCOTT')           and sal < (select sal from emp where ename = 'SCOTT')        -- 多行子查询 查询和s,a,c在同一个部门的员工信息并不包含s,a,c;        --先查询 SCOTT BLAKE SMITH三个的所属的部门        select * from emp where                deptno in (                      select distinct deptno from emp where ename in ('SCOTT', 'BLAKE', 'SMITH'))                             and ename not in('SCOTT', 'BLAKE', 'SMITH')        --思考:查询工资最高的雇员名字和工资。        select ename,sal from emp where sal =(select max(sal) from emp)        select *from emp        --查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息        select *          from emp         where hiredate < (select hiredate from emp where ename = 'SCOTT')           and job = (select job from emp where ename = 'SCOTT')        -- 多行查询        --查询工资低于任何一个“CLERK”的工资的雇员信息。        --用到了any方法,这个方法是和子查询中的任何一个值做比较,如果满足就打印(满足一个就好了)        select * from emp where sal< ANY(select sal from emp where JOB = 'CLERK')        --all方法 和子查询返回的所有值进行比较,都满足了才会打印,只要有一个不满足,就不打印        --查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。        select  empno ,ename,sal from emp where sal> all(select sal from emp where job ='SALESMAN')        --in方法 是判断里面的值是否是返回的集合中的一个        --查询部门20  中职务 同  部门10 的雇员 一样的 雇员信息        select * from emp where job in(select job from emp where deptno = 10) and deptno=20;        --查询在雇员中有哪些人是经理人        select * from emp where empno in (select distinct mgr from emp where mgr is not null or mgr ='')        --找出部门编号为20的所有员工中收入最高的职员        --注意这个里面是判断的部门为20的最高的工资,返回的是个数,如果外面有和这个工资一样高的,那么就会打出来,所以,也要在外面加判断部门是不是20select * from emp where sal = (select max(sal) from emp where deptno = 20) and deptno=20;        --查询每个部门平均薪水的等级        --(select deptno, avg(sal) b from emp group by deptno)  这个求的是平均的工资和他的所属的部门        --把上面这个看成一个整体 写个小名,后面判断区间的,用的是平均值判断的,所以要用小名调这个方法中的平均值方法。然后用来判断区间        --用到了区间的那个表格,和写的那个表格        select a.deptno, grade          from salgrade, (select deptno, avg(sal) b from emp group by deptno) a         where losal < a.b           and hisal >= a.b
原创粉丝点击