关联查询-高级查询
关联查询:表与表之间想要关联查询,关键点是连接条件。
连接条件也就是两张表中都有的字段。一般若有n张表,连接条件至少有n-1个。
实验中:SELECT DISTINCT E.ENAME,
D.DNAME,D.DEPTNO FROM EMP E,
DEPT D WHERE E.DEPTNO=D.DEPTNO;实验中emp表和dept表的连接条件就是DEPTNO,所以两张表可以建立连接;
关联查询主要分为三种查询
1.内连接 2.外链接 3.自连接
1.内连接
特点:表中不满足连接条件的是不会被显示的。
select DISTINCT E.ENAME,
D.DEPTNO,D.DNAME,D.LOC,E.SAL FROM EMP E JOIN DEPT D ON E.DEPTNO
=D.DEPTNO WHERE E.SAL>1000;
JOIN 表名 ON 连接条件 :用于表的连接 2.外连接
特点:除了会将满足条件的数据显示出来,也会将不满足的条件显示出来
A.左外连接(以左边的表为驱动表)若该表中某条记录不满足连接,右侧表中的字段为null
关键字:LEFT OUTER
案例:SELECT DISTINCT E.ENAME,
D.DNAME FROM EMP E LEFT OUTER JOIN DEPT D
ON E.DEPTNO=D.DEPTNO;
B:右外连接(与左外连接相反)
关键字 RIGHT OUTER
案例:SELECT DISTINCT E.ENAME
,D.DNAME FROM EMP E RIGHT OUTER JOIN DEPT D ON
E.DEPTNO=D.DEPTNO;
C.全外连接(那边不满足那边null)
关键字: FULL OUTER
案例:SELECT DISTINCT E.ENAME,
D.DNAME FROM EMP E FULL OUTER JOIN DEPT D ON
E.DEPTNO=D.DEPTNO;
D.自连接
当前表的一条记录可以对应当前表自己的多条记录 在一个表中有上下级关系的时候使用!!!
作业:--查看史密斯的上司在哪个城市工作
SELECT DISTINCT E.ENAME,D.ENAME
,D.DEPTNO,DE.LOC FROM EMP E, EMP D,
DEPT DE WHERE E.EMPNO=D.MGR AND E.DEPTNO
=DE.DEPTNO AND D.ENAME='SMITH';
--左外连接 右外链接 简写 +
SELECT DISTINCT E.ENAME,
D.DNAME FROM EMP E JOIN DEPT D ON E.DEPTNO(+)=D.DEPTNO;
那边有+号 就是那边外连接 全外连接不可以的
高级查询
1.子查询 (子查询其实就是一条SELECT查询语句,嵌在其他的SQL语句中)
案例; 查询工资比 clark高的员工 SAL 后面就是子查询
子查询必须用()包住
SELECT ENAME,SAL FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE ENAME='CLARK' );
子查询在各个位置的使用情况
A.在DDL中使用子查询 可以创建一张新表 在这其中 字段出现函数和表达式 要用AS 改别名
案例: CREATE TABLE EMPLAYE AS SELECT DISTINCT E.ENAME AS 名字,E.EMPNO ,E.JOB AS 工作,E.SAL*12 AS 年薪, //这里记住有函数表达式需要改别名
E.DEPTNO,D.DNAME,D.LOC FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO;
SELECT * FROM EMPLAYE; //查看新创建表的各个字段及内容
B.在DML中使用子查询
DELETE FROM EMPLAYE WHERE DEPTNO=(SELECT DEPTNO FROM EMPLAYE WHERE NAME='CLARK' )
C.子查询在where字句中 子查询根据查询结果分为:
c1.单行单列子查询。常用于过滤条件,可以配合= >符号使用
案例;--查询薪水比平均工资高的人 SELECT ENAME,SAL FROM EMP WHERE SAL>( SELECT AVG(SAL) FROM EMP //单行单列指的是子查询结果是单行单列 )
C2.多行单列子查询 由于查询出多个值在判断条件时要用IN,判断>等符号时配合any all使用
案列 : --查询同部门的其他员工 子查询 多行单列子查询 查询出多个值 要用in any all 这些代替掉
SELECT ENAME,JOB,DEPTNO FROM EMP WHERE DEPTNO IN(SELECT DEPTNO FROM EMP WHERE JOB='SALESMAN') AND JOB<>'SALESMAN';
C3.多行多列子查询:常常被当做一张表查询 C4.exists关键字后面跟一个关键字 当该子查询可以查询出至少一个记录 则 条件成立 返回适合条件的数据
案例: --有员工的部门
SELECT DISTINCT DEPTNO,DNAME FROM DEPT D WHERE EXISTS(SELECT * FROM EMP E WHERE E.DEPTNO=D.DEPTNO );
----没有员工的部门
SELECT DISTINCT DEPTNO,DNAME FROM DEPT D WHERE NOT EXISTS(SELECT * FROM EMP E WHERE E.DEPTNO=D.DEPTNO );
C5.在select子句中使用子查询 (这个暂时搞不懂 )
分页查询 (生活中的分页查询在购物时 查询后会出现多少个商品为一页的商品页面)
为什么使用分页查询? 害怕查询数据量大,导致系统资源消耗大,数据冗余严重。
分页查询在每个数据库中基本都有,但是每个数据库的语法不一样 oracle中使用 ROWNUM实现 ROWNUM不存在于任何一张表,但是所有表都可以查询该字段,只要查询出一条数据他就会记录该记录的行号,从1开始增1
--分页查询 ROWNUM SELECT ROWNUM,ENAME,SAL,DEPTNO FROM EMP