Oracle【多表查询操作(SQL92&SQL99)】

多表联合查询:需要获取的数据分布在多张表中

SQL92:

1 --笛卡尔积:将多个表的数据进行一一对应,所得的结果为多表的笛卡尔积
2 select * from emp;
3 select * from dept;
4 select * from emp,dept;--进行全排列 14*5=70

 1 --等值连接:先笛卡尔积,然后筛选,筛选条件为等值筛选
 2  --查询员工的姓名,工作,薪资,部门名称
 3  --可直接在select子句中使用字段获取数据,但效率低,建议字段前明确表名
 4 select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;--效率低
 5  --两张表存在的公众字段,必须明确表名:emp.deptno=dept.deptno
 6 select emp.ename,emp.job,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;--效率高
 7  --给表添加别名(推荐)
 8 select e.ename,e.job,e.sal,d.dname
 9 from emp e,dept d
10 where e.deptno=d.deptno;

1 --查询员工的姓名,工作,工资,工资等级
2 select e.ename,e.job,e.sal,s.grade
3 from emp e,salgrade s
4 where e.sal>=s.losal and e.sal<=s.hisal;

1 --自连接
2  --查询员工的姓名,工作,薪资,及上级领导的姓名
3 select e1.ename,e1.job,e1.sal,e2.ename
4 from emp e1,emp e2
5 where e1.mgr=e2.empno;
6 ----------------下面SQL可详细查看到对应的领导姓名详情-------------------
7 select e1.empno,e1.ename,e1.job,e1.sal,e1.mgr,e2.ename
8 from emp e1,emp e2
9 where e1.mgr=e2.empno;

外连接:左外连接&&右外连接

1 --左外链接
2  --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
3 select e.ename,e.job,e.sal,d.dname
4 from emp e,dept d
5 where e.deptno=d.deptno(+);

1 --右外连接
2  --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
3 select e.ename,e.job,e.sal,d.dname
4 from emp e,dept d
5 where e.deptno(+)=d.deptno;

SQL99:
1:可给表添加别名
2:如果使用on或者usering关键字对结果进行筛选,必须使用inner join作为表与表的连接,其中inner可缺省
3:外连接的outer可缺省
4:依然可以使用分组,having,排序等。

1 --笛卡尔积:使用关键字 cross join
2  --select * from 表名1 cross join 表名2;
3 select * from emp cross join dept;

1 --筛选
2  --自然连接:使用关键字 natural join
3  --特点1:底层先笛卡尔积,然后按照所有同名同值字段自动进行等值筛选
4  --查询员工的姓名,工作,薪资,部门名称
5 select e.ename,e.job,e.sal,d.dname from emp e natural join dept d;

问题1:如果只想按照部分字段结束筛选?
解决1:使用using关键字
作用1:指明使用指定的字段对联合查询的结果进行等值筛选
注意1:指明字段必须是两表的同名同值字段
使用:select * from 表名 inner join 表名 using(字段名1,字段名2...);

1 --查询员工的姓名,工作,薪资,部门名称
2 select emp.ename,emp.job,emp.sal,dept.dname
3 from emp
4 inner join dept using(deptno);

问题2:如果按照字段名不同,但是值相同进行等值筛选?
解决2:使用on关键字进行自定义条件筛选(等值,不等值)
注意1:普通筛选条件使用where进行筛选,不要使用on。(增加SQL语句的阅读性)
使用:select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件;

1 --查询员工的姓名,工作,薪资,部门名称并工资大于等于2000
2 select emp.ename,emp.job,emp.sal,dept.dname
3 from emp
4 inner join dept
5 on emp.deptno=dept.deptno where sal>=2000;

外链接
--左外连接:select 内容 from 表名 left outer join 表名 on 连接条件

1 --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
2 select e.ename,e.job,e.sal,d.dname
3 from emp e
4 left outer join dept d
5 on e.deptno=d.deptno;


--右外连接:select 内容 from 表名 right outer join 表名 on 连接条件

1 --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
2 select e.ename,e.job,e.sal,d.dname
3 from emp e
4 right outer join dept d
5 on e.deptno=d.deptno;
1 --全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
2 select e.ename,e.job,e.sal,d.dname
3 from emp e
4 full outer join dept d
5 on e.deptno=d.deptno;
1 --自链接:
2   --查询员工的姓名,工作,薪资,及上级领导的姓名
3 select e1.ename,e1.job,e1.sal,e2.ename
4 from emp e1
5 inner join emp e2
6 on e1.mgr=e2.empno;

SQL92 && SQL99 详细比对:

 1 -------------------------------------------------- SQL92 && SQL99 详细比对 --------------------------------------------------
 2 --SQL92
 3  --笛卡尔积
 4 select * from emp,dept;--进行全排列
 5 --SQL99
 6  --笛卡尔积:使用关键字 cross join
 7 select * from emp cross join dept;
 8
 9
10 --SQL92
11  --等值连接
12  --查询员工的姓名,工作,薪资,部门名称
13 select e.ename,e.job,e.sal,d.dname
14 from emp e,dept d
15 where e.deptno=d.deptno;
16 --SQL99
17  --自然连接:使用关键字 natural join
18  --查询员工的姓名,工作,薪资,部门名称
19 select e.ename,e.job,e.sal,d.dname
20 from emp e
21 natural join dept d;
22  --查询员工的姓名,工作,薪资,部门名称
23 select emp.ename,emp.job,emp.sal,dept.dname
24 from emp
25 inner join dept using(deptno);
26
27
28 --SQL92
29  --不等值连接
30  --查询员工的姓名,工作,工资,工资等级
31 select e.ename,e.job,e.sal,s.grade
32 from emp e,salgrade s
33 where e.sal>=s.losal and e.sal<=s.hisal;
34 --SQL99
35  --查询员工的姓名,工作,工资,工资等级
36 select e.ename,e.job,e.sal,s.grade
37 from emp e
38 natural join salgrade s
39 where e.sal>=s.losal and e.sal<=s.hisal;
40
41
42 --SQL92
43  --自连接
44  --查询员工的姓名,工作,薪资,及上级领导的姓名
45 select e1.ename,e1.job,e1.sal,e2.ename
46 from emp e1,emp e2
47 where e1.mgr=e2.empno;
48 --SQL99
49  --查询员工的姓名,工作,薪资,及上级领导的姓名
50 select e1.ename,e1.job,e1.sal,e2.ename
51 from emp e1
52 inner join emp e2
53 on e1.mgr=e2.empno;
54
55
56 --SQL92
57  --左外链接
58  --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
59 select e.ename,e.job,e.sal,d.dname
60 from emp e,dept d
61 where e.deptno=d.deptno(+);
62 --SQL99
63 select e.ename,e.job,e.sal,d.dname
64 from emp e
65 left outer join dept d
66 on e.deptno=d.deptno
67
68
69 --SQL92
70  --右外连接
71  --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
72 select e.ename,e.job,e.sal,d.dname
73 from emp e,dept d
74 where e.deptno(+)=d.deptno;
75 --SQL99
76 select e.ename,e.job,e.sal,d.dname
77 from emp e
78 right outer join dept d
79 on e.deptno=d.deptno;
80
81
82 --SQL99
83  --全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
84 select e.ename,e.job,e.sal,d.dname
85 from emp e
86 full outer join dept d
87 on e.deptno=d.deptno;

SQL92 && SQL99 详细比对

原文地址:https://www.cnblogs.com/cao-yin/p/9744321.html

时间: 2024-10-10 21:48:49

Oracle【多表查询操作(SQL92&SQL99)】的相关文章

Oracle锁表查询和解锁方法

数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remove DQL:数据库查询语言,关键字:select oracle表在什么情况下会被锁住 DML锁又可以分为,行锁.表锁.死锁 行锁:当事务执行数据库插入.更新.删除操作时,该事务自动获得操作表中操作行的排它锁. 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL

oracle系统表查询

oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查询本用户的表,视图等select * from all_col_comments --查询所有用户的表的列名和注释.select * from user_col_comments -- 查询本用户的表的列名和注释select * from all_tab_columns --查询所有用户的表的列名等信息

oracle 字典表查询

1.oracle 字典表查询 /*显示当前用户*/ show user 在sql plus中可用,在pl sql中不可用 /*查看所有用户名*/ select username,user_id,created from all_users; /*查看当前用户的用户详情*/ select username,user_id,account_status,lock_date,expiry_date,default_tablespace,temporary_tablespace,created,init

oracle 多表查询

oracle 多表查询  1对多    多个数据放到一个字段内 select  id,zhzxm,fzhzxm,ltrim(max(sys_connect_by_path(xm, ',')), ',') xm from ( select id,zhzxm,fzhzxm,xm,row_number() over(partition by id order by lrsj) rn  --标记相同的字段 from (select t2.id id,t2.zhzxm zhzxm,t2.fzhzxm fz

Oracle 多表查询(1)

一.基本概念 多表查询的语法如下: SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名] ,-]FROM 表名称 [别名], [表名称 [别名] ,-][WHERE 条件(S)][ORDER BY 排序字段 [ASC|DESC] [,排序字段 [ASC|DESC] ,-]]; 但是如果要进行多表查询之前,首先必须先查询出几个数据 -- 雇员表和部门表中的数据量,这个操作可以通过COUNT()函数完成. 范例:查询emp表中的数据量 --返回了14条记录 SELECT C

Oracle多表查询与数据更新

2.1 多表查询 2.1.1 多表查询的基本语法(重点) 多表查询语法如下: SELECT {DISTINCT} *|查询列1 别名1,查询列2 别名2 FROM 表名称1 别名1,表名称2 别名2 {WHERE 条件(s)} {ORDER BY 排序字段 ASC|DESC,排序字段 ASC|DESC} 例:同时查询emp和dept表 SQL> select * from emp,dept; 发现返回了56条数据,emp一个才14条,dept表才4条.56=14*4. 查询emp表的记录数: S

Oracle 锁表查询及解锁

如果对 Oracle 数据表中的数据进行 增删改 操作时卡住无响应,很可能是表已被锁定.使用下面的命令可以解决锁定问题. 锁表状态查询. 直接复制粘贴就可以. --锁表查询SQL SELECT object_name, machine, s.sid, s.serial#  FROM gv$locked_object l, dba_objects o, gv$session s  WHERE l.object_id = o.object_id  AND l.session_id = s.sid;

MySQL数据表查询操作

准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名[ AS 别名][,...]} 指定查询出的字段的 FROM 表名[AS 别名][,表1... AS 别名] [INNER | [LEFT | RIGHT] [OUTER] JOIN 另一张表名 [AS 别名] ON 关联条件] [WHERE 条件] [GROUP BY 分组字段[,...]] [H

oracle多表查询

基本语法多表查询 笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join).全部连接方式都会先生成暂时笛卡尔积表.笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据随意组合. -- 笛卡尔积 select * from emp, dept; -- 使用公共字段,去掉笛卡尔积 select * from emp, dept where emp.deptno = dept.deptno; -- 查询出每一个雇员的姓名,工作,雇员的直接上级领导的姓名 -- 在emp表中的MGR表示一个雇