ORACLE 多表连接与子查询

Oracle表连接

SQL/Oracle使用表连接从多个表中查询数据

语法格式:

select 字段列表from  table1,table2where table1.column1=table2.column2;

说明:

在where子句中指定连接条件

当被连接的多个表中存在同名字段时,必须在该字段前加上"表名"作为前缀.

连接的类型

Oracle8i之前的表连接:

等值连接(Equijoin)

非等值连接(Non-Equijoin)

外连接(Outer join):-->左外连接-->右外连接

自连接(Self join)

 

Oracle9之后新引入的连接形式(支持SQL99规范)

交叉连接(Cross join)

自然连接(Natural join)

使用Using子句建立连接

使用on子句建立连接

外连接(Outer join):-->左外连接-->右外连接-->全外连接

等值连接(Equijoin)

select empno,ename,sal,emp.deptno,dname from emp,deptwhere emp.deptno = dept.deptno;

多表连接中:

  • 可使用AND操作符增加查询条件
  • 使用表别名可以简化查询
  • 使用表名(表别名)前缀可提高查询效率
  • 为了连接n个表,至少需要n-1个连接条件

非等值连接(Non-Equijoin)

外连接(Outer join)

使用外连接可以看到参与连接的某一方不满足连接条件的记录

外连接运算符为(+)

传统的外连接分为左外连接和右外连接两种

语法格式:

select 字段列表from  table1,table2where table1.column1(+)=table2.column2;
select 字段列表from  table1,table2where table1.column1=table2.column2(+);

自连接(Self join)

select a.enpno,a.ename,a.ngr,b.enamefrom emp a,emp bwhere a.ngr = b.enpno;

SQL99连接语法

SQL1999规范中规定的连接查询语法

 

select  字段列表from   table1[cross join table2] |[natural join table2] |[join table2 using(字段名)] |[join table2 on(table.column_name=table2.column_name)] |[(left | right | full out ) join table2on(table1.column_name=table2.column_name)];

交叉连接(Cross join)

Cross join 产生了一个笛卡尔集,其效果等同于再两个表进行连接时未使用where子句限定连接条件;

select empno,ename,sal,emp.deptno,dnamefrom emp cross join dept;

自然连接(Natural join)

Natural join基于两个表中的全部同名列建立连接

  • 从两个表中选出同名列的值均对应相等的所有行
  • 如果两个表中的同名列的所有数据类型不同,则出错
  • 不允许在参照列上使用表名或者别名作为前缀
select empno,ename,sal,emp.deptno,dnamefrom emp natural join dept;

Using子句

如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名.

 

select empno,ename,sal,emp.deptno,dnamefrom emp join deptusing(deptno);

不允许在参照列上使用表名或者别名作为前缀

On子句

如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用On子句

select empno,ename,sal,emp.deptno,dnamefrom emp join depton(emp.deptno=dept.deptno);

多表连接

使用SQL99连接语法,两个以上的表进行连接时应依次/分别指定相临的两个表之间的连接条件.

 

select  字段列表   from   table1   [cross join table2] |   [natural join table2] |   [join table2 using(字段名)] |   [join table2 on(table.column_name=table2.column_name)] |   [(left | right | full out ) join table2   on(table1.column_name=table2.column_name)]   [cross join table3] |   [natural join table3] |   [join table3 using(字段名)] |   [join table3 on(table.column_name=table3.column_name)] |   [(left | right | full out ) join table3   on(table2.column_name=table3.column_name)]...;  

内连接和外连接

内连接(Inner join)

在SQL99规范中,内连接只返回满足连接条件的数据.

外连接(Outer join)

左外连接(Left Outer Join)

两个表在连接过程中除返回满足连接条件的行为外,还返回左表中不满足条件的行为,这种连接称为左外连接.

右外连接(Right Outer Join)

两个表在连接过程中除返回满足连接条件的行为外,还返回右表中不满足条件的行为,这种连接称为右外连接.

满外连接(Full Outer Join)

Oracle9开始新增功能,两个表在连接过程中除返回满足连接条件的行为外,还返回两个表中不满足条件的所有行为,这种连接称为满外连接.

子查询(Sub Query)

子查询子查询在主查询前执行一次

主查询使用子查询的结果

 

select 字段列表from tablewhere 表达式 operator (select 字段列表 from table);

使用子查询注意事项

  • 在查询时基于未知时应考虑使用子查询
  • 子查询必须包含在括号内
  • 将子查询放在比较运算符的右侧,以增强可读性.
  • 除非进行Top-N分析,否则不要再子查询中使用Order by子句
  • 对单行子查询使用单行运算符
  • 对多行子查询使用多行运算符

单行子查询

单行子查询只返回一行记录

对单行子查询可使用单行记录比较运算符

=--------------等于

>--------------大于

>=------------大于等于

<--------------小于

<=--------------小于等于

<>--------------不等于

 

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

子查询空值/多值问题

  • 如果子查询未返回任何行,则主查询页不会返回任何结果
  • 如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符
  • 如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符

多行子查询

多行子查询返回多行记录

对多行子查询只能使用多行记录比较运算符

in--------------等于列表中的任何一个

any--------------和子查询返回的任意一个值比较

all--------------和子查询返回的所有值比较

 

select * from empwhere sal>any(select avg(sal) from emp group by deptno);
select * from empwhere sal>all(select avg(sal) from emp group by deptno);
select * from empwhere job in(select job from emp where ename=‘martin‘ or ename=‘ssss‘);

TopN查询

在oracle中通常采用子查询的方式来实现Top n查询

select 字段列表from(select 字段列表 from table order by 排序字段)where rownum <=n;------------------------------------------------------------select *from(select * from emp order by sal desc)where rownum <=5;

摘自:http://www.cnblogs.com/ddatsh/archive/2010/12/09/1901423.html

时间: 2024-12-20 14:35:22

ORACLE 多表连接与子查询的相关文章

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

mysql表连接,子查询以及if判断

创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2) DEFAULT NULL, deptno int(2) DEFAULT NULL, age int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE dept ( deptno int(2) DEFAULT NUL

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两

Oracle_SQL(5) 连接和子查询

一.连接join一般分类: inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行. left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. full join:外连接,返回两个表中的行:left join + right join. cross join:笛卡尔积,就是第一个表的行数乘以第二个表的行数.oracle分类:等值连接 = 外连接(左外连接.右外连接.全

oracle[insert 时报错: 单行子查询返回多行]

-- 错误的写法 insert into t_b_partner_vehicle(id, partner_id, vehicle_id) (seq_t_b_partner_vehicle.nextval,121, (select id from t_b_car_info where org_id in(1441,1427))) -- Error 单行子查询返回多行 -- 正确的写法 insert into t_b_partner_vehicle(id, partner_id, vehicle_i

MSSQL 4表联查,子查询,函数统计,分组条件查询综合应用实例

1 SELECT 2 [UserName] 3 ,[Yhxm] 4 ,[Qx] 5 ,[Phone] 6 ,[Number] = COUNT([UserName]) 7 FROM 8 (SELECT 9 [UserName] = A.[username] 10 ,[Yhxm] = B.[xm] 11 ,[Qx] = D.[P_Power] 12 ,[Phone] = B.[dh] 13 ,[DayCount] = (SELECT COUNT(*) FROM [Caihuashun_FuJian_

结合真实的测试实例,记录一次SQL语句辅助功能测试的场景(包含多表联查及子查询)

本文结合实例讲解一下 SQL 语句通过数据库辅助进行功能测试.希望阅读本文的小伙伴,能通过这个场景实例体会到SQL 语句在真实的功能测试时起到的作用 本次功能测试涉及的sql 知识点如下: 1 SELECT 查询 2 where 子句 3 count() 4 to_char() 5 group by 6 order by 7 两表联查(这里涉及left join) 8 子查询嵌套 实例中的需求文档 : 系统的测试界面:(不好意思,写文章的时候,想去截一个好一点的图片,测试环境无法登录了) 前提解

java:Oracle(级联删除,左右内外交叉自然连接,子查询,all,any,in)

1.级联删除: -- 级联删除:裁员,公司倒闭 -- 级联删除(cascade),设置为null(setnull),放任不管(No action) -- cascade:(以一对多为例)如果删除多的一方,一的一方不受任何影响,但是如果删除一的一方,多的一方所有对应数据全部被删除 select * from staff s inner join department d on d.id = s.department_id; delete from staff s where s.id = 1; d

Oracle多表连接查询Join

Left join 和right join 为外部连接,inner join 为内部连接 Left join 左侧为主表,右侧为从表,主表会显示出所有数据,从表则只显示关联到的数据,不满足连接条件 的行数据用NULL补全 right join 右侧为主表,左侧为从表,主表会显示出所有数据,从表则只显示关联到的数据,不满足连接条件 的行数据用NULL补全 inner join 则只显示2张表关联条件相匹配的数据 (1)dept(部门表) (2)emp(雇员表) 1.inner join 语法:se