Oracle 10g数据库基础之基本查询语句-下-连接&子查询

简介:

 Oracle 10g数据库基础之基本查询语句-下-连接&子查询

-- 资料参考:张烈  张建中《数据库管理员培训讲义》
实验18:表的连接查询
该实验的目的是掌握基本的联合查询 .
表的连接
我们要从多张表中要得到信息,就得以一定的条件将表连接在一起查询。

Cartesian (笛卡儿)连接

当多张表在一起查询时,没有给定正确的连接条件,结果是第一张表的所有行和第二张表的所有行进行矩阵相乘,得到n*m行的结果集。

一般来说笛卡儿连接不是我们需要的结果。
但表如果有一行的情况下,结果有可能正确。

SQL> select ename,dname from emp,dept;

 
ENAME      DNAME

---------- --------------

SMITH      ACCOUNTING
ALLEN      ACCOUNTING
……..
SMITH      RESEARCH
ALLEN      RESEARCH
……..
SMITH      SALES
ALLEN      SALES
……..
SMITH      OPERATIONS
ALLEN      OPERATIONS
……..
 
56 rows selected
 
SQL>

结果为每个员工在每个部门上了一次班,4*14=56,这并不是我们想得到的结果。

要避免笛卡儿连接一定要给定一个正确的连接条件。
等值连接
在连接中给定一个相等的连接条件。
SQL> select ename,dname from emp,dept where emp.deptno=dept.deptno;

当列的名称在两张表内重复的时候,要加表的前缀来区分,避免不明确的定义。
表的别名
1 。便于书写
2 。将同名的表区分
3 。一旦定义了别名,表的本名就无效
4 。只在该语句内有效
5 。定义方式为表名后紧跟别名,用空各间隔。

SQL> select ename,dname from emp e,dept d where e.deptno=d.deptno;

SQL99 的书写方式

select ename,dname from emp e join dept d on (e.deptno=d.deptno)

效率是相同的,SQL99是国标

列的别名,为了区分相同的列的名称,这是别名的本质。
SQL> select ename,dname,e.deptno,d.deptno

  from emp e,dept d

  where e.deptno=d.deptno;

上述显示有两个列名称都叫deptno,我们无法区分。

SQL> select ename,dname,e.deptno "员工表",d.deptno "部门表"

  from emp e,dept d
  where e.deptno=d.deptno;

不等连接
连接条件不是一个相等的条件。

SQL> select ename,sal,grade

  from emp,salgrade
  where sal between LOSAL and hisal;

外键连接
将一张表有,而另一张表没有的行也显示出来。

SQL> select ename,dname,emp.deptno from emp,dept

where emp.deptno=dept.deptno;

这句话不会显示40号部门,因为40部门没有员工。

SQL> select ename,dname,dept.deptno from emp,dept where emp.deptno(+)=dept.deptno;

+号的意思为将没有员工的部门,用NULL来匹配

+号不能同时放在等号的两边,只能出现在一边。

自连接
表的一列和同一个表的另一列作为连接的条件。

SQL> select w.ename "下级" ,m.ename "上级"

  from emp w,emp m
  where w.mgr=m.empno(+);

其中“下级”“上级”为列的别名。区分相同的列。

W为表的别名。区分相同的表。别名的本质。

+)为了将没有上级的人也显示。

过滤结果

想在结果中过滤去一些内容请用and运算。

SQL> select w.ename "下级" ,m.ename "上级"

  from emp w,emp m
  where w.mgr=m.empno(+)
  and w.deptno=30;

实验19:sql99规则的表连接操作

该实验的目的是掌握新的ORACLE表之间的联合查询语法.

SQL99 规则的书写格式

. Nature(自然)连接

这是SQL99规则。

所有同名的列都作为等值条件。
同名的列的数据类型必须匹配。
列的名称前不能加表的前缀。

SQL> select ename,deptno,dname from emp natural join dept;

Using 指定列的连接
当有多列同名,但想用其中某一列作为连接条件时使用。
SQL> select ename,deptno ,dname from emp join dept using (deptno);

SQL99 的外键连接
SQL99 写法

select ename,dname,dept.deptno

from dept left outer join emp

on(dept.deptno=emp.deptno);
9I 前的写法

select ename,dname from emp,dept

where emp.deptno(+)=dept.deptno;

SQL> select ename,dname,dept.deptno
  from dept left outer join emp
  on(dept.deptno=emp.deptno);

知识点
1 。笛卡儿连接
2 。等值连接
3 。不等连接
4 。外键连接
5 。自连接

6SQL99的书写格式

实验20:子查询
该实验的目的是掌握子查询的语法和概念 .
  子查询
谁的工资最多

简单子查询
1 。先于主查询执行。
2 。主查询调用了子查询的结果。
3 。注意列的个数和类型要匹配。
4 。子查询返回多行要用多行关系运算操作。
5 。子查询要用括号括起来。

SQL> --查询工资总和高于10号部门工资总和的部门。

SQL> select deptno,sum(sal)

  from emp
  group by deptno

  having sum(sal)>(select sum(sal) from emp where deptno=10);

SQL> -- 查询每个部门的最大工资是谁。

SQL> select deptno,ename,sal from emp

  where (deptno,sal) in

  (select deptno,max(sal) from emp group by deptno);

子查询返回多行,用=不可以,得用in

子查询返回多列,所以对比的列也要匹配。
Any  all 操作

SQL> select ename,sal from emp where sal<any(1000,2000);

小于2000就可以

SQL> select ename,sal from emp where sal<all(1000,2000);

必须小于 1000

小于all小于最小,大于all大于最大

SQL> select ename,sal,deptno from emp

where sal<all(select avg(sal) from emp group by deptno);

小于any小于最大,大于any大于最小

select ename,sal,deptno from emp

where sal>any(select avg(sal) from emp group by deptno)

From 子句中的子查询
查询工资大于本部门平均工资的员工。

select ename,e.deptno,sal,asal

from emp e,

(select deptno ,avg(sal) asal from emp group by deptno) a

where e.deptno=a.deptno and sal>asal;

A为视图,为什么要使用别名asal,因为表达式不能当列的名称,别名的本质使用方法是使非法的合法化。

相互关联的子查询

select ename,sal ,deptno

from emp o

where sal>(select avg(sal) from emp where deptno=o.deptno) ;

先运行主查询,得到第一行,将DEPTNO传入到子查询,由子查询求出AVGSAL),在判定主查询的行是否符合查询的条件。

执行计划是将子查询看作视图的关联。这叫做SQL的自动改写。

Exists 操作

找领导,其中3是常量,你写什么都可以。

当子查询有行时,Exists返回true

查到行后就不再继续查询

当子查询没有行时为假,Exists返回false

select ename,empno,mgr from emp o

where exists(select 3 from emp where mgr=o.empno);

《完》

--xjzhujunjie




本文转自xjzhujunjie 51CTO博客,原文链接:http://blog.51cto.com/xjzhujunjie/868102
相关文章
|
17天前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
6天前
|
Oracle 关系型数据库 网络安全
崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB
文章是作者小草对崖山异构数据库迁移利器 YMP 的初体验分享,包括背景、YMP 简介、体验环境说明、YMP 部署(含安装前准备、安装、卸载、启动与停止)、数据迁移及遇到的问题与解决过程。重点介绍了 YMP 功能、部署的诸多细节和数据迁移流程,还提到了安装和迁移中遇到的问题及解决办法。
|
6天前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】oracle dblink varchar类型查询报错记录
这篇文章主要介绍了 Oracle DBLINK 查询崖山 DB 报错的相关内容,包括 ODBC 安装配置、数据源配置、dblink 环境配置、问题原因分析及规避方法。问题原因是 dblink 连接其他数据库时 varchar 类型转换导致的,还介绍了 long 类型限制、char 等类型区别,规避方法是修改参数 MAX_STRING_SIZE 支持 32K。
|
19天前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
2天前
|
数据库
|
20天前
|
存储 人工智能 监控
时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累,精准聚焦行业痛点,并携手 TDengine 提供高效解决方案。
35 0
|
2月前
|
Oracle 关系型数据库 数据库
【YashanDB知识库】oracle dblink varchar类型查询报错记录
在使用Oracle DBLink查询VARCHAR类型数据时,可能会遇到多种报错。通过了解常见错误原因,采取合适的解决方法,可以有效避免和处理这些错误。希望本文提供的分析和示例能帮助你在实际工作中更好地处理DBLink查询问题。
76 10
|
2月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
2月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
168 6
|
2月前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
522 0

热门文章

最新文章

推荐镜像

更多