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的最高的工资,返回的是个数,如果外面有和这个工资一样高的,那么就会打出来,所以,也要在外面加判断部门是不是20的 select * 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
阅读全文
0 0
- 多表联查 sql
- sql多表联查
- sql多表联查
- sql 典型SQL题(多表联查)
- SQL多表联查优化
- 简单的多表联查sql
- sql的多表联查语句
- sql语句多表联查
- SQL
- SQL
- SQL
- sql
- sql
- SQL
- sql
- SQL (-)
- sql
- SQL
- Linux下安装Tomcat7以及常见错误
- 2017.8.17考试
- 把图片的某种颜色改为透明
- HDU 6138 Fleet of the Eternal Throne 多校#8 AC自动机
- HDU 6138 Fleet of the Eternal Throne (2017多校8
- sql多表联查
- 第三章-3基本类型转换
- SSAS
- javaEE完整项目开发第一步------配置maven
- Hdu 6143 Killer Names【思维+斯特灵数】
- 设计模式-观察者模式(Observer)
- 生成随机IP代码
- [codevs1450] xth的旅行
- C语言笔记——处理文件03