0

0

Oracle基础教程:多表查询、SQL99

php中文网

php中文网

发布时间:2016-06-07 17:11:36

|

1471人浏览过

|

来源于php中文网

原创

多表查询 等连接 通过两个表具有相同意义的列,建立连接条件. 查询结果只显示两个列中的值是等值条件的行数据 表中同名列被选择

多表查询
 等连接
  通过两个表具有相同意义的列,建立连接条件.
  查询结果只显示两个列中的值是等值条件的行数据
  表中同名列被选择时必须添加表名前缀进行修饰 否则无法确定这一列是属于哪个表
  N张表等值连接,条件至少有N-1个,否则会产生笛卡尔积
 不等连接
  A表中的某列数据和B表中一列或多列的关系是非等值关系,大于,小于,不等于,等条件都属于不等连接的范畴
 自连接
  数据都来自一张表,所以在from字句中需要对表添加别名,添加表别名后才能合法化的引用表中的列名.
  本质就是将一张表虚拟成了两张表
 外连接
  即是选择出满足等连接条件及其以外的行
  (+)修饰符号用法:放置在选出结果只包含等连接的列后,则另一列的结果就是等值行+非等值行
 全连接(Oracle 不提供连接关键字,,需要用集合模式实现)
 
 SQL1999(SQL99) 有全连接的关键词

当数据需要从多个表中获得时

idle> select * from emp,dept;
...
...
56 rows selected.
这样得到的结果是 56 行,其实两个表产生了笛卡尔集 14 * 4
idle> select count(*) from emp;

  COUNT(*)
----------
 14

idle> select count(*) from dept;

  COUNT(*)
----------
  4

idle>

在连接中给定一个等值条件 一般是主键和外键的关系
例如deptno在dept表中是主键 在emp表中是外键
观看dept(部门表)和emp(员工表)的关系
他们是主从关系,dept是主表,emp是从表
emp中的deptno一定要隶属于dept中的deptno
所以他们两个列是等值的
具体的主键和外键关系 我们在以后建表时再详细阐述

 


等连接

按deptno的等值关系联合两张表的所有列

idle> select * from dept,emp where dept.deptno=emp.deptno;

    DEPTNO DNAME   LOC       EMPNO ENAME      JOB        MGR HIREDATE        SAL COMM  DEPTNO
---------- -------------- ------------- ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
 10 ACCOUNTING   NEW YORK       7782 CLARK      MANAGER       7839 1981-06-09 00:00:00      2450       10
 10 ACCOUNTING   NEW YORK       7839 KING       PRESIDENT     1981-11-17 00:00:00      5000       10
 10 ACCOUNTING   NEW YORK       7934 MILLER     CLERK       7782 1982-01-23 00:00:00      1300       10
 20 RESEARCH   DALLAS       7566 JONES      MANAGER       7839 1981-04-02 00:00:00      2975       20
 20 RESEARCH   DALLAS       7902 FORD       ANALYST       7566 1981-12-03 00:00:00      3000       20
 20 RESEARCH   DALLAS       7876 ADAMS      CLERK       7788 1987-05-23 00:00:00      1100       20
 20 RESEARCH   DALLAS       7369 SMITH      CLERK       7902 1980-12-17 00:00:00       800       20
 20 RESEARCH   DALLAS       7788 SCOTT      ANALYST       7566 1987-04-19 00:00:00      3000       20
 30 SALES   CHICAGO       7521 WARD       SALESMAN       7698 1981-02-22 00:00:00      1250  500      30
 30 SALES   CHICAGO       7844 TURNER     SALESMAN       7698 1981-09-08 00:00:00      1500    0      30
 30 SALES   CHICAGO       7499 ALLEN      SALESMAN       7698 1981-02-20 00:00:00      1600  300      30
 30 SALES   CHICAGO       7900 JAMES      CLERK       7698 1981-12-03 00:00:00       950       30
 30 SALES   CHICAGO       7698 BLAKE      MANAGER       7839 1981-05-01 00:00:00      2850       30
 30 SALES   CHICAGO       7654 MARTIN     SALESMAN       7698 1981-09-28 00:00:00      1250 1400      30

14 rows selected.

idle>
这才是我们要的结果.笛卡尔积几乎我们不会需要.多表查询时基本都带有where子句来描述多个表的关系 避免笛卡尔集


当两个表中有相同的列名时,为了区分 要在列前加上表名作前缀.
不冲突时 直接使用
idle> select deptno,empno,ename,dname,sal from emp a,dept b where b.deptno=a.deptno;
select deptno,empno,ename,dname,sal from emp a,dept b where b.deptno=a.deptno
       *
ERROR at line 1:
ORA-00918: column ambiguously defined
因为deptno 没有表前缀 冲突

idle>
在联合的两个表内取数据:描述scott在哪个部门
idle> select empno,ename,dname,sal from emp,dept where emp.deptno=dept.deptno and ename='SCOTT';

     EMPNO ENAME      DNAME      SAL
---------- ---------- -------------- ----------
      7788 SCOTT      RESEARCH     3000

idle>


表的别名
 格式:表名 别名
给表取别名是很有必要的,因为有的表名很长 不便于引用时书写.

idle> select a.deptno,empno,ename,dname,sal from emp a,dept b where b.deptno=a.deptno and ename='SCOTT';

    DEPTNO EMPNO ENAME  DNAME         SAL
---------- ---------- ---------- -------------- ----------
 20  7788 SCOTT  RESEARCH       3000

idle>


不等连接
 就是排除完全相等条件以外的 >,=, between and
 主要在于不同表之间显示特定范围的信息(也可以理解成包含关系)
例如: SALGRADE表把工资划分了5个等级
idle> select * from SALGRADE;

     GRADE LOSAL    HISAL
---------- ---------- ----------
  1   700     1200
  2  1201     1400
  3  1401     2000
  4  2001     3000
  5  3001     9999

idle>

查处每个员工的工资等级
idle> select ename,sal,grade from emp a,salgrade b where sal between losal and hisal;

ENAME    SAL    GRADE
---------- ---------- ----------
SMITH    800        1
JAMES    950        1
ADAMS   1100        1
WARD   1250        2
MARTIN   1250        2
MILLER   1300        2
TURNER   1500        3
ALLEN   1600        3
CLARK   2450        4
BLAKE   2850        4
JONES   2975        4
SCOTT   3000        4
FORD   3000        4
KING   5000        5

14 rows selected.

idle>

练习:
 1.查询名字是S开头的员工名,员工号,部门号,部门名,部位地理位置
 select empno,ename,emp.deptno,dept.dname,dept.loc
 from emp,dept
 where ename like 'S%' and emp.deptno=dept.deptno;
 2.查询员工名,部门名,工资,工资等级
 select empno,ename,grade
 from emp,salgrade
 where sal between losal and hisal;
 3.查询工作在NEW YORK的所有员工
 select empno,ename,emp.deptno,dept.dname,dept.loc
  from emp,dept
   where emp.deptno=dept.deptno and dept.loc='NEW YORK';

 

自连接
 同一张表内的连接查询 即把一个表映射成两个表
 主要用于表的自参照关系 比如emp中的上下级或层次关系
 因为自连接是同一张表之间的链接查询 所以必须定义表别名

例子:根据empno和mgr的对应关系,可以查找出KING的下属都有谁

idle> select b.ename||'''s manager is '||a.ename from emp a,emp b where a.empno = b.mgr and a.ename='KING';

B.ENAME||'''SMANAGERIS'||A.ENAME
----------------------------------
BLAKE's manager is KING
JONES's manager is KING
CLARK's manager is KING

idle>

linux

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 2.4万人学习

SQL 教程
SQL 教程

共61课时 | 3.1万人学习

C 教程
C 教程

共75课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号