ORACLE 第4节 多表查询

学习目标:

?使用等值和不等值连接在SELECT语句中查询多个表中的数据。

?使用自连接。

使用外连接查询不满足连接条件的数据

Oracle连接

等值连接:

使用连接在多个表中查询数据。

SELECT  table1.column, table2.column

FROM  table1, table2

WHERE  table1.column1table2.column2;

?在 WHERE 子句中写入连接条件。

?在表中有相同列时,在列名之前加上表名前缀

两个表的连接

select e.employee_id,e.last_name,d.department_id
from employees e,departments d
where e.department_id = d.department_id

三个表的连接

select e.employee_id,e.last_name,d.department_id,l.city
from employees e,departments d,locations l
where e.department_id = d.department_id and
d.location_id = l.location_id

?连接 n个表,至少需要n-1个连接条件。
例如:连接三个表,至少需要两个连接条件。

非等值连接:

select e.last_name,e.salary,j.grade_level
from employees e,job_grades j
where e.salary between j.lowest_sal and j.highest_sal

内连接和外连接:

内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。

没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的 WHERE子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符,即用圆括号括起来的加号(+). 

--左外连接
select e.employee_id,e.last_name,d.department_name
from employees e,departments d
where e.department_id = d.department_id(+)
--右外连接
select e.employee_id,e.last_name,d.department_name
from employees e,departments d
where e.department_id(+) = d.department_id

使用SQL: 1999语法连接

使用连接从多个表中查询数据:

SELECT table1.column, table2.column

FROM 
table1

[CROSS JOINtable2] |

[NATURAL JOINtable2] |

[JOINtable2 USING(column_name)]
|

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

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

自然连接:

?NATURALJOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。

?在表中查询满足等值条件的数据。

如果只是列名相同而数据类型不同,则会产生错误。

select e.employee_id,e.last_name,d.department_name
from employees e natural join departments d

使用
USING子句创建连接:

?在NATURAL JOIN 子句创建等值连接时,可以使用 USING子句指定等值连接中需要用到的列。

?使用USING 可以在有多个列满足条件时进行选择。

JOIN和USING子句经常同时使用。

select e.employee_id,e.last_name,d.department_name
from employees e join departments d
using(department_id)

这种方法有局限性:如果两个表中的列名(一个叫department_id,另外一个叫id)不一样,这个方法就失效了。

使用ON子句创建连接(常用):

?自然连接中是以具有相同名字的列为连接条件的。

?可以使用 ON子句指定额外的连接条件。

?这个连接条件是与其它条件分开的。

ON子句使语句具有更高的易读性

<pre name="code" class="sql">select e.employee_id,e.last_name,d.department_name
from employees e
join departments d
on e.department_id = d.department_id

这个和等值连接是很相似的

select e.employee_id,e.last_name,d.department_name,l.city
from employees e
<strong>join departments d</strong>
on e.department_id = d.department_id
<strong>join locations l</strong>
on d.location_id = l.location_id

版权声明:本文为博主原创文章,未经博主允许不得转载。

ORACLE 第4节 多表查询

时间: 2024-10-12 14:40:44

ORACLE 第4节 多表查询的相关文章

Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等

count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age),max(age),min(age),avg(nvl(age,0)) from b_user 1       260     70      10      37.1428571428571 group by:如果前面定义了该字段名  则groupby必须也写上该字段 select name,pw

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.比如SilverStream就是基于数据库的一种中间件.ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能:作为一个关系数据库,它是一个完备关系的产品:作为分布式数据库它实现了分布式处理功能.但它的所有知识,只要在一种机型上学习

Oracle学习(五):多表查询

1.知识点:能够对比以下的录屏进行阅读 SQL> --等值连接 SQL> --查询员工信息: 员工号 姓名 月薪 部门名称 SQL> select empno,ename,sal,dname 2 from emp,dept 3 where emp.deptno=dept.deptno; SQL> --不等值连接 SQL> --查询员工信息: 姓名 月薪 工资级别 SQL> select ename,sal,grade 2 from emp e,salgrade s 3

Oracle中把一张表查询结果插入到另一张表中

一.Oracle数据库中,把一张表的查询结果直接生成并导入一张新表中.  例如:现有只有A表,查询A表,并且把结果导入B表中.使用如下SQL语句: Sql代码  create table B as select * from A    二.Oracle数据库中支持把查询结果导入到另外一张表中.  例如:有两个表A和B 1)如果两个表的表结构是否相同,但要插入的字段类型相同:  (1)把A表的全部字段数据插入到B表中: Sql代码  insert into B select * from A;  

数据库Oracle强化练习之多表查询

1.      列出所有雇员的姓名及其直接上级的姓名 Select a.ename,a.mgr,b.ename,b.empno From emp a,emp b where a.mgr=b.empno(+); 2.      列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门 Select dept.deptno,dname,ename From emp,dept where emp.deptno(+)=dept.deptno; 3.      显示所有部门在"NEW YORK"

Oracle学习记录 八 多表查询

1. 笛卡尔集 select * from emp, dept; 2. 等值连接 select ename, job from emp, dept where emp.deptno=dept.deptno; 3. 非等值连接 select ename, grade from emp, salgrade where sal between losal and hisal; 这个其实我不太明白到底是怎么弄的.前面的两种都容易理解,这个难道是 拿一个sal就去salgrade中找在哪个范围? 4. 自

Oracle下按分钟多表查询

select  to_char(SIGNDATE,'yyyy-MM-dd HH24:mi') ,count(*)  from (        SELECT * FROM (select  ID,CODE,SIGNDATE FROM table1 WHERE SIGNDATE >= TO_DATE('2017-04-01 00:00:00','yyyy-MM-dd HH24:mi:ss')                 AND SIGNDATE <= TO_DATE('2017-04-30

mysql_05_单表查询

#创建数据库create database db_student; #使用数据库use db_student; #创建表create table `t_student` ( `id` int primary key not null auto_increment, `stuName` varchar (60), `age` int , `sex` varchar (30), `gradeName` varchar (60)); #插入数据insert into `t_student` (`id`

ORACLE 第7节 创建和管理表

?用户定义的表: –用户自己创建并维护的一组表 –包含了用户所需的信息 如:SELECT * FROM user_tables;查看用户创建的表 CREATE TABLE 语句 ?必须具备: –CREATE TABLE权限 –存储空间 CREATE TABLE [schema.]table       (column datatype[DEFAULT expr][,...]); ?必须指定: –表名 –列名,数据类型,尺寸 CREATE TABLE dept(deptno<span style=