oracle多表查询

基本语法多表查询

笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join)。全部连接方式都会先生成暂时笛卡尔积表。笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据随意组合。

-- 笛卡尔积
select * from emp, dept;

-- 使用公共字段,去掉笛卡尔积
select * from emp, dept where emp.deptno = dept.deptno;

-- 查询出每一个雇员的姓名,工作,雇员的直接上级领导的姓名
-- 在emp表中的MGR表示一个雇员的上级领导的编号。假设如今要想查询一个雇员的上级领导姓名,则须要用emp表与emp表进行自连接操作
select e.ename, e.job, s.ename from emp s, emp e where s.empno = e.mgr; 

-- 查询出每一个雇员的姓名,工作。雇员的直接上级领导的姓名,雇员所在的部门名称
select e.ename, e.job,s.ename mgr_name, d.dname from emp e, emp s, dept d where e.mgr = s.empno and e.deptno = d.deptno;

-- 查询出每一个雇员的姓名,工资,部门名称。工资在公司的等级及其领导的姓名。领导的工资,以及领导所相应的等级
SELECT e.ename, e.sal, d.dname,
decode(g.grade,5,'第一等工资',4,'第二等工资',3,'第三等工资',2,'第四等工资',1,'第五等工资')
e_grade, s.ename mgr_name, s.sal mgr_sal,
decode(g2.grade,5,'第一等工资',4,'第二等工资',3,'第三等工资',2,'第四等工资',1,'第五等工资') m_grade
FROM emp e,dept d,salgrade g,emp s,salgrade g2
WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN g.losal AND g.hisal)
AND (s.empno=e.mgr) AND (s.sal BETWEEN g2.losal AND g2.hisal);

左右连接

-- 利用emp 和 dept 做一个连接查询,查询结果包含雇员编号,雇员姓名,部门编号,部门名称,部门所在位置
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e,dept d
where e.deptno = d.deptno;

-- 通过观察不难发现,在以上结果中部门编号40没有出现,这是由于在进行普通连接时两边都有的才出如今结果中,在emp表中没有部门40,所以结果中也就没有40
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno(+) = d.deptno;

部门40就出如今结果中了.此时我们使用的是右连接。

      (+)在=左边 表示右连接

(+)在=右边 表示左连接

      左连接以左表为基准,右连接以右表为基准

-- 左连接以左表为基准,右连接以右表为基准
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno(+);
-- 查询雇员的编号。姓名。及其领导的编号。姓名
select e.empno, e.ename, s.empno, s.ename
from emp e, emp s
where e.mgr = s.empno;
-- 但我们经查询知道emp表中应该有14条记录,在以上结果中缺少了KING,由于KING是最高领导,所以他的领导编号为空,故没办法查询出来.为了显示出来,我们用左/右连接来实现
select e.empno, e.ename, s.empno, s.ename
from emp e, emp s
where e.mgr = s.empno(+);

-- 左右连接的连接方式不是固定的。详细採用左连接还是右连接取决于基准条件在等式的左边还是右边,上面的左连接把基准条件放在右边。就变为了右连接
select e.empno, e.ename, s.empno, s.ename
from emp e, emp s
where s.empno(+) = e.mgr;

得到的相同是上图的结果值,这里就不反复贴图了。

SQL:1999SQL定义

语法格式

SELECT table1.column,table2.column

FROM table1 [CROSS JOIN table2]|

[NATURAL JOIN table2]|

[JOIN table2 USING(column_name)]|

[JOIN table2 ON(table1.column_name=table2.column_name)]|

[LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name=table2.column_name)]

-- 交叉连接(CROSS JOIN):迪卡尔积运算
select * from emp cross join dept;

select * from emp cross join dept where emp.empno = 7369;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFnaTEyMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

-- 自然连接 NATURAL JOIN
select * from emp natural join dept;

-- 依据结果能够发现。自然连接按公共字段相等进行连接。而且产生的结果会自己主动消除反复的列
select * from emp e, dept d
where e.deptno = d.deptno;

-- USING(column_name) 用于指定两个表之间的连接字段
select * from emp join dept using(deptno);

-- ON(tab1.column_name=tab2.column_name) 用于指定两表的连接条件
select * from emp join dept on emp.deptno = dept.deptno;

-- LEFT[OUTER] JOIN 左连接 OUTER可有可无
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e left join dept d
on e.deptno = d.deptno;
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e left outer join dept d
on e.deptno = d.deptno;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFnaTEyMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

-- RIGHT JOIN 右连接
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e right join dept d
on e.deptno = d.deptno;

-- INNER JOIN 取交集
create table empbak as select * from emp where emp.empno in (7369, 7499, 7521, 7566, 7654, 7698);
select e1.empno, e1.empno, e1.job, e1.mgr, e1.hiredate, e1.sal, e1.comm, e1.deptno
from emp e1 inner join empbak e2 on e1.empno = e2.empno;

-- FULL OUTER JOIN 取并集
update empbak e set e.empno = 8369 where e.empno = 7369;
update empbak e set e.empno = 8499 where e.empno = 7499;
update empbak e set e.empno = 8521 where e.empno = 7521;
select * from emp e full join empbak s on e.empno = s.empno;

-- 对于没有匹配的记录,则会以null做为值
select * from emp e full join empbak s on e.empno = s.empno
where e.empno is not null and s.empno is not null;

-- UNION 取并集 去掉反复记录
select * from emp
union
select * from empbak;

-- UNION ALL 取并集 不去除反复记录
select * from emp
union all
select * from empbak;

最以下的三条记录是反复记录,在上面的union连接中,多余的三条反复记录是被去掉的。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-11-08 01:02:07

oracle多表查询的相关文章

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锁表查询和解锁方法

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

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;

Oracle 多表查询(2)

四.统计函数及分组查询 1.统计函数 在之前学习过一个COUNT()函数,此函数的功能可以统计出表中的数据量,实际上这个就是一个统计函数,而常用的统计函数有如下几个: COUNT():查询表中的数据记录: AVG():求出平均值: SUM():求和: MAX():求出最大值: MIN():求出最小值: 范例:测试COUNT().AVG().SUM() 统计出公司的所有雇员,每个月支付的平均工资及总工资. SELECT MAX(sal),MIN(sal) FROM emp; 注意点:关于COUNT

[数据库] Oracle单表查询总数及百分比和数据横向纵向连接

这是最近项目关于SQL语句的,本文简单记录并总结以下几个知识点: 1.如何统计一张表中某个字段的总数,如不同"专业"的学生数及所占百分比: 2.如何联系另一张表进行查询某个字段的总数及百分比: 3.简单介绍decode防止分母为0和trunc保留小数位数等函数: 4.通常复杂的SQL语句会涉及到查询结果横向连接和纵向连接,这里进行介绍. 最近买了本<Oracle查询优化改写技巧与案例·有教无类 落落>,推荐大家也阅读下.后面我也会补充一些相关数据的知识,希望对大家有所帮助吧