经典SQL学习笔记 (三)-多表查询
2015-03-12 14:39
323 查看
多表查询
–1.多表查询时两张表之间必然存在着某种关系–2.注:当字段唯一时可以不指定表名作为前缀
–3.在Oracle中,起别名时,要么为别名加上双引号,要么什么都不加,一般不加
–4.在MySQL中,起别名时,要加上单引号
–5.左连接、右连接 分类:内连接(等值连接、非等值连接、自身连接)、外连接(左外连接、右外连接)
–6. 注:(+)在=左边,表示右连接 (+)在=右边,表示左连接
笛卡尔积
1.将emp表和dept表进行多表查询(笛卡尔积) SELECT * FROM EMP,DEPT; 2.查询雇员编号、雇员姓名、工资、所在部门名称及位置 SELECT E.EMPNO, E.ENAME,E.SAL ,D.DNAME,D.LOC FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO;
自身关联
3.查询雇员姓名、雇员工资、领导姓名、领导的工资 SELECT E.ENAME 雇员姓名,E.SAL 雇员工资,M.ENAME 领导姓名, M.SAL 领导工资 FROM EMP E, EMP M WHERE E.MGR=M.EMPNO; 4.查询雇员姓名、雇员工资、所在部门名称、领导姓名、领导工资 SELECT E.ENAME,E.SAL,D.DNAME,M.ENAME,M.SAL FROM EMP E,EMP M,DEPT D WHERE E.MGR=M.EMPNO AND E.DEPTNO=D.DEPTNO; 5.查询雇员姓名、雇员工资、所在部门名称、领导姓名、领导工资、领导所在部门 SELECT E.ENAME 雇员姓名,E.SAL 雇员工资,D.DNAME 所在部门,M.ENAME 领导姓名,M.SAL 领导工资,MD.DNAME 领导所有部门 FROM EMP E, EMP M, DEPT D,DEPT MD WHERE E.MGR=M.EMPNO AND E.DEPTNO=D.DEPTNO AND M.DEPTNO=MD.DEPTNO;
非等级关联
6.查询雇员姓名、雇员工资、部门名称、工资的等级 SELECT E.ENAME 雇员姓名,E.SAL 雇员工资, D.DNAME 部门名称,S.GRADE 工资等级 FROM EMP E,DEPT D, SALGRADE S WHERE E.DEPTNO=D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL; 7.查询雇员姓名、雇员工资、部门名称、雇员工资等级、领导姓名、领导工资、领导工资等级 SELECT E.ENAME 雇员姓名,E.SAL 雇员工资,D.DNAME 部门名称,S.GRADE 雇员工资等级, M.ENAME 领导姓名,M.SAL 领导工资,MS.GRADE 领导工资等级 FROM EMP E,EMP M,DEPT D,SALGRADE S ,SALGRADE MS WHERE E.DEPTNO=D.DEPTNO AND E.MGR=M.EMPNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL AND M.SAL BETWEEN MS.LOSAL AND MS.HISAL; 8.查询雇员姓名、雇员工资、部门名称、雇员工资等级、领导姓名、领导工资、领导工资等级,并用等级表示 SELECT E.ENAME 雇员姓名,E.SAL 雇员工资,D.DNAME 部门名称,DECODE(S.GRADE,1,'第五等级',2,'第四等级',3,'第三等级',4,'第二等级','第一等级') 雇员工资等级, M.ENAME 领导姓名,M.SAL 领导工资,DECODE(MS.GRADE,1,'第五等级',2,'第四等级',3,'第三等级',4,'第二等级','第一等级') 领导工资等级 FROM EMP E,EMP M,DEPT D,SALGRADE S ,SALGRADE MS WHERE E.DEPTNO=D.DEPTNO AND E.MGR=M.EMPNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL AND M.SAL BETWEEN MS.LOSAL AND MS.HISAL;
左连接、右连接
9.查询所有部门的雇员姓名、部门编号及部门名称 SELECT E.ENAME,D.DEPTNO,D.DNAME FROM EMP E,DEPT D WHERE E.DEPTNO(+)=D.DEPTNO;--(+)在=左边,表示右连接 SELECT E.ENAME,D.DEPTNO,D.DNAME FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO(+);--(+)在=右边,表示左连接 10.查询雇员编号、姓名、领导编号、领导姓名(有的雇员没有领导) SELECT E.EMPNO,E.ENAME,M.EMPNO,M.ENAME FROM EMP E,EMP M WHERE E.MGR=M.EMPNO(+);
SQL 1999语句(了解)
语法: -- cross join:交叉连接 select *from table1 [cross join table2] 笛卡尔乘积 -- natural join:自然连接:就是将两个表按照同名的列表示相同意义,建立起一个等值内连接,返回结果的时候去掉重复的列 [natural join table2] -- join...using(字段) [join table2 using(字段名)] [join table2 on(连接条件)] --左外连接 [left outer join table2 on(连接条件)] --右外连接 [right outer join table2 on(连接条件)] 1)交叉连接cross join,专门产生笛卡尔积 SELECT * FROM EMP CROSS JOIN DEPT; --交叉连接 2)自然连接natural join SELECT * FROM EMP NATURAL JOIN DEPT; --自然连接 3)using子句,直接指定关联字段 SELECT * FROM EMP E JOIN DEPT D USING(DEPTNO); 4)on子句,由用户自己指定关联字段 SELECT * FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO; 5)左连接、右连接 SELECT * FROM DEPT D LEFT JOIN EMP E ON D.DEPTNO=E.DEPTNO; --左连接 SELECT * FROM EMP E RIGHT JOIN DEPT D ON D.DEPTNO=E.DEPTNO; --右连接 6)全连接 SELECT * FROM EMP FULL OUTER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO; --全连接
分组函数
2、分组函数(统计函数)、分组统计 --1.分组函数 sum()求和 avg()求平均值 max()求最大值 min()求最小值 count()求记录数量 --2.注:分组函数统计时忽略空值 当使用分组函数时,查询结果中只能包含分组函数 --3.分组统计格式:SELECT * FROM * WHERE * GROUP BY * H***ING * ORDER BY *; --4.注:在分组统计时,查询结果中只能出现分组函数和分组的字段 --5.注:where是对分组前的数据进行筛选 having是对分组后的数据进行筛选 --6.注:分组函数可以嵌套,但嵌套之后查询结果中只能出现分组函数,不能再出现分组的字段 11.查询部门30的总人数 SELECT COUNT(*) FROM EMP WHERE DEPTNO=30; 12.查询部门20的最高工资,最低工资和平均工资 SELECT MAX(SAL),MIN(SAL),***G(SAL) FROM EMP; 13.查询每个部门的平均工资,按平均工资由高到低排序 SELECT DEPTNO 部门编号,***G(SAL) 平均工资 FROM EMP GROUP BY DEPTNO ORDER BY 平均工资 DESC; 14.按部门分组,查询部门的名称及每个部门的员工数 SELECT D.DNAME,COUNT(EMPNO) FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO GROUP BY D.DNAME; 15.查询出非销售人员工作名称,以及从事同一工作的雇员的月工资总和 并且要满足月工资总和大于5000,查询结果按月工资总和升序排列 SELECT JOB,SUM(SAL) FROM EMP WHERE JOB!='SALESMAN' GROUP BY JOB H***ING SUM(SAL)>5000 ORDER BY SUM(SAL); 16.查询平均工资最高的部门 SELECT MAX(***G(SAL)) FROM EMP GROUP BY DEPTNO;
小试牛刀
多表查询1、列出至少有4个员工的部门名称 SELECT D.DNAME,COUNT(E.EMPNO) FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO GROUP BY D.DNAME H***ING COUNT(E.EMPNO)>4; 2、列出薪金比"SMITH"多的所有员工 SELECT * FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE ENAME='SMITH'); 3、列出所有员工的姓名以及其直接上级的姓名 SELECT E.ENAME,M.ENAME FROM EMP E,EMP M WHERE E.MGR=M.EMPNO; 4、列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称 SELECT E.EMPNO,E.ENAME,D.DNAME FROM EMP E,EMP M ,DEPT D WHERE E.MGR=M.EMPNO AND E.DEPTNO=D.DEPTNO AND E.HIREDATE <M.HIREDATE; 5、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门 SELECT D.DNAME,E.* FROM EMP E,DEPT D WHERE E.DEPTNO(+)=D.DEPTNO; --右连接 6、列出所有从事"CLERK"工作的雇员姓名及其部门名称、部门人数 SELECT E.ENAME,D.DNAME,TEMP.COUNT FROM EMP E,DEPT D,(SELECT DEPTNO,COUNT(EMPNO) COUNT FROM EMP GROUP BY DEPTNO) TEMP WHERE E.DEPTNO=D.DEPTNO AND E.JOB='CLERK'; 7、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数 SELECT JOB,COUNT(EMPNO) FROM EMP WHERE SAL>1500 GROUP BY JOB; 8、列出在部门"sales"(销售部)工作的员工的姓名,假定不知道销售部的部门编号 SELECT ENAME FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES'); 9、列出薪金高于公司平均薪金的雇员姓名、所在部门名称、领导姓名、雇员的工资等级 SELECT E.ENAME,D.DNAME,M.ENAME,G.GRADE FROM EMP E,EMP M,DEPT D,SALGRADE G WHERE E.MGR=M.EMPNO AND E.SAL>(SELECT ***G(SAL) FROM EMP) AND E.DEPTNO=D.DEPTNO AND E.SAL BETWEEN G.LOSAL AND G.HISAL; 10、列出与"SMITH"从事相同工作的所有员工及部门名称 SELECT E.*,D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO AND JOB IN (SELECT JOB FROM EMP WHERE ENAME='SMITH'); 11、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金 SELECT ENAME,SAL FROM EMP WHERE SAL IN(SELECT SAL FROM EMP WHERE DEPTNO=30); 12、列出薪金高于部门30所有员工薪金的员工姓名、薪金及部门名称 SELECT E.ENAME,E.SAL,D.DNAME FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO AND E.SAL> (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=30); 13、列出在每个部门工作的员工数量、平均工资和平均服务年限 SELECT COUNT(EMPNO),ROUND(***G(SAL)),ROUND(***G(MONTHS_BETWEEN(SYSDATE,HIREDATE))/12) FROM EMP GROUP BY DEPTNO; 14、列出所有员工的姓名、部门名称和工资 SELECT E.ENAME,D.DNAME,E.SAL FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO; 15、列出所有部门的详细信息和部门人数 SELECT D.*,TEMP.COUNT FROM DEPT D,(SELECT DEPTNO,COUNT(EMPNO) COUNT FROM EMP GROUP BY DEPTNO) TEMP WHERE D.DEPTNO=TEMP.DEPTNO(+); 16、列出每种工作的最低工资以及从事此工作的最低工资的雇员姓名 SELECT E.ENAME,TEMP.JOB,E.SAL FROM EMP E,(SELECT JOB ,MIN(SAL) MIN FROM EMP GROUP BY JOB)TEMP WHERE E.JOB=TEMP.JOB AND E.SAL=TEMP.MIN; 17、列出各个部门的经理的最低薪金 SELECT DEPTNO,MIN(SAL) FROM EMP WHERE JOB='MANAGER' GROUP BY DEPTNO; 18、列出所有员工的年工资,按年薪从低到高排序 SELECT ENAME,(SAL+NVL(COMM,0))*12 年薪 FROM EMP ORDER BY 年薪; 19、查询雇员的领导信息,要求领导的薪水要超过3000 SELECT DISTINCT M.* FROM EMP E,EMP M WHERE E.MGR=M.EMPNO AND M.SAL>3000; 20、求出部门名称中,带'S'字符的部门员工的工资总和 、部门人数 SELECT D.DNAME,SUM(SAL),COUNT(EMPNO) FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO AND D.DNAME LIKE '%S%' GROUP BY D.DNAME;
相关文章推荐
- sql 入门经典(第五版) Ryan Stephens 学习笔记 第四部分:建立复杂的数据库查询/
- sql语句学习笔记(9)-使用top查询指定行数(从30行至40行)
- 黑马程序员 学习笔记——SQL查询语句大全
- SQL:查询学习笔记
- 经典SQL学习笔记 (二)-单行函数
- SQL Server 全文索引查询T-SQL学习笔记之一(Full-text index)
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- JAVA学习笔记(四)substring、System.exit(1)、java.text.SimpleDateFormat、==、equals、StringBuffer、SQl动态查询
- 经典SQL语句大全--------------学习笔记
- SQL学习笔记——SQL中的数据查询语句汇总
- 经典SQL学习笔记 (一)-简单、限定、模糊、排序
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- PL/SQL 学习笔记(一)----- pl/sql 基本查询与排序
- SQL查询语句学习笔记
- SQL学习笔记八 索引,表连接,子查询,ROW_NUMBER
- java 从零开始,学习笔记之基础入门<SQL_Server_常用查询>(二十二)
- Sql语句学习笔记(4)-查询1
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- MyBatis学习笔记-注解SQL多个参数查询异常处理
- SQL Server 全文索引查询T-SQL学习笔记