您的位置:首页 > 数据库

经典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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: