oracle之连接查询和子查询

连接查询和子查询

SQL92的多表连接查询

一、本节要点
1.笛卡尔集
2.等值连接
3.非等值连接
4.外连接
5.自连接
说明。SQL 92是1992年提出的查询语法,向上兼容
二、语法,类型及连接类型区分
语法规则

SELECT table1.column, table2 .column
FROM
table1, table2
WHERE table1.column1 = table2 .column2;

特点
1.在WHERE子句中写入连接条件
2.当多个表中有重名列时,必须在列的名字前加上表名作为前缀
连接的类型:
等值连接- Equijoin
非等值连接- Non- equijoin
外连接- Outer join
1.左外连接
2.右外连接
自连接- Self join
三、笛卡尔集

select * from dept;//4条记录
select * from emp; ;/14条记录
select * from dept,emp; ;//4* 14=56条记录

总结
检索出的行的数目将是第一个表中的行数乘以第二 个表中的
行数
检索出的列的数目将是第-个表中的列数加上第二个表中的
列数
应该保证所有联结都有where子句,不然数据库返回比想要
的数据多得多的数据
四、等值查询
在这里插入图片描述
注意点
当被连接的多个表中存在同名字段时,须在该字段前加
上"表名"前缀可使用AND操作符增加查询条件;
使用表别名可以简化查询;
使用表名(表别名)前缀可提高查询效率;
五、非等值查询
要求:查询员工的工资等级

select empno,ename,job,sal,grade
from emp e,salgrade s
where e.sal<s.hisal and e sal>s.losal;

select empno,ename,job,sal,grade
from emp e,salgrade s
where e.sal<s.hisal and e.sal>s.losal and e.job='MANAGER';

六、外连接
使用外连接可以看到参与连接的某一方不满足连接条件的记
录,而不仅仅是满足连接条件的数据。
外连接运算符为(+)
外连接分为左外连接和右外连接两种
左外连接显示左边表的全部行

SELECT table.column, table column
FROM
table1, table2
WHERE table1.column = table2.column(+);

右外连接显示右边表的全部行

SELECT table.column, table column
FROM
table1, table2
WHERE table1.column(+) = table2.column;

SQL举例

select d.deptno,e.deptno, dname,ename from dept d,empe
where d.deptno(+ )=e.deptno;
select d.deptno,e.deptno, dname,ename from dept d,empe
where d.deptno(+ )=e.deptno
order by d.deptno desc;

六、自连接
特点:将-个表当两个表使用
使用举例:查询每个员工的工号、姓名、经理姓名

select e1.empno,e1.ename,e1.job,e2.ename
from empe1 ,emp e2
where e1.mgr=e2.empno
order by e1.empno;

SQL99的多表连接查询

一、前言
SQL 92的语法规则的缺点:
1.语句过滤条件和表连接的条件都放到了where子句中
2.当条件过多时,联结条件多,过滤条件多时,就容易
造成混淆
SQL 99修正了整个缺点,把联结条件,过滤条件分开来,
包括以下新的TABLE JOIN的句法结构:
1.交叉连接(Cross join)
2.自然连接(Natural join)
3.使用Using子句建立连接
4.使用On子句建立连接
5.外连接( Outer join )
①左外连接
②右外连接
③全外连接
二、SQL1999规范中规定的连接查询语法
在这里插入图片描述
三、交叉连接
Cross join产生了一个笛卡尔集,其效果等同于在两个表进行连接时未使用WHERE子句限定连接条件;可以使用where条件从笛卡尔集中选出满足条件的记录。
用法举例

select dept.deptno,dname, ename,job
from dept cross join emp;

等价于

select dept.deptno,dname,ename,job
from dept,emp;

四、自然连接
Natural join基于两个表中的全部同名列建立连接
1.从两个表中选出同名列的值均对应相等的所有行
2.如果两个表中同名列的数据类型不同,则出错
3.不允许在参照列上使用表名或者别名作为前缀
4.自然连接的结果不保留重复的属性
举例:

select empno, ename, sal, deptno, dname
from emp natural join dept
where deptno= 10;

五、Using子句
如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名。
using子句引|用的列在sq任何地方不能使用表名或者别名做前缀
举例:

select e.ename,e.ename,e.sal,deptno,d. dname
from emp e join dept d
using(deptno)
where deptno=20

六、On子句
自然连接的条件是基于表中所有同名列的等值连接
1.为了设置任意的连接条件或者指定连接的列,需要使
用ON子句
2.连接条件与其它的查询条件分开书写
3.使用ON子句使查询语句更容易理解
举例:

1----select ename ,dname
from emp join dept on emp.deptno=dept.deptno
where emp.deptno=30;
2--- select empno, ename, sal, emp.deptno, dname
from emp join dept
on (emp.deptno = dept.deptno and job='SAL ESMAN);
3---select *
from dept, emp
where dept.deptno = emp.deptno and job='SAL ESMAN';

七、外连接
左外联接
两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为左外联接。
右外联接
两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为右外联接。
满外联接
两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的所有行,这种连接称为满外联接。
内连接:在SQL .99规范中,内连接只返回满足连接条件的数据。
举例

左外连接
select deptno, dname,empno,ename,job
from dept left join emp
using(deptno);
右外连接
select deptno, dname,empno,ename,job
from dept right join emp
using(deptno);
满外连接
select deptno, dname,empno,ename,job
from dept full join emp
using(deptno);

子查询

问题引入
如何查得所有比“CL ARK"工资高的员工的信息

select * from emp
where sal>(select sal from emp where
ename='CLARK');

思考:查询工资高于平均工资的雇员名字和工资。
思考:查询和SCOTT同一部门且比他工资低的雇员名字和
工资。
语法格式:
select字段列表from table
where表达式operator (select 字段列表from table);
特点
1.子查询在主查询前执行- -次
2.主查询使用子查询的结果
使用子查询注意事项
1.在查询是基于未知值时应考虑使用子查询
2.子查询必须包含在括号内
3.建议将子查询放在比较运算符的右侧,以增强可读性。
4.除非进行Top-N分析,否则不要在子查询中使用ORDER BY子句。
5.如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符.
6.如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符.
单行子查询
单行子查询只返回一行记录,对单行子查询可使用单行记录比较运算符
<、>、=、>=、<=;、<>
举例:

select * from emp
where sal > (select sal from emp where empno = 7566);

思考:查询工资最高的雇员名字和工资。
查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息

SELECT empno, ename, job FROM emp
WHERE job =(SEL ECT job FROM emp WHERE empno=7 788)
AND hiredate < (SEL .ECT hiredate FROM emp WHERE
empno=7788); 

查询工资比SCOTT高或者雇佣时间比SCOTT早的雇员的编号和名字

select empno,ename, sal,hiredate
from emp
where sal>(select sal from emp where ename='SCOT T') or
hiredate<(select hiredate from emp where
ename='SCOT T')

多行子查询
多行子查询返回多行记录
1.对多行子查询只能使用多行记录比较运算符
2. ALL和子查询返回的所有值比较
3. ANY和子查询返回的任意一个值比较
4. IN 等于列表中的任何一个
案例
1.查询工资低于任何一个“CLERK"的工资的雇员信息。
2.查询工资比所有的“SAL ESMAN”都高的雇员的编号、
名字和工资。
3.查询部门]20中职务同部门10的雇员-样的雇员信息。
案例答案

SELECT empno, ename, job,sal
FROM emp
WHERE sal < ANY (SELECT sal FROM emp WHERE job = 'CLERK')
AND job <> 'CLERK';

SELECT empno, ename,sal
FROM emp
WHERE sal > ALL(SELECT sal FROM emp WHERE job= 'SALESMAN');

SELECT empno, ename, job FROM emp
WHERE job IN (SELECT job FROM emp WHERE deptno=10)
AND deptno =20;

在这里插入图片描述

rowid和rownum

1、rowid
① rowid在记录创建时生成,而且是不变,直接指向硬件上的存储位置
②用rowid直接访问是最快的,但也是人力所无法做到的
③只要记录没被搬动过, rowid是不变的
2、rownum
①rownum是个伪列,查询的时候除非特别指定,否则不会显示。
②其主要的用处是控制查询返回的行数
③只能使用: <,<=
④当rownum和order by-起使用时,会首先选出符合rownum条件的记录,然后再进行排序,这会给我们的查询带来难度。
3、示例

Select rowid,rownum,e.* from emp
②Select rowid,rownum,e.* from emp order by sal
③Select rowid,rownum,e.* from emp where rownum<=5

在这里插入图片描述

分页查询

一、案例-----显示EMP表中薪水最高的前五个雇员信息
在这里插入图片描述
二、案例----分页按照薪水高低显示数据,每页5条数据,显示第2页数据
在这里插入图片描述
三、模板1
在这里插入图片描述
四、模板2
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_43303023/article/details/122496068