Oracle多表查询

article/2025/9/24 6:59:32

什么是多表查询

 

多表查询:当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询。根据不同表中的数据之间的关系查询相关联的数据

多表链接方式

内连接(inner join)

连接两个表,通过相等或不等判断链接列,称为内连接。在内连接中典型的联接运算有=或<>之类的比较运算符,包括等值连接和自然连接

等值连接

非等值连接

自连接

SQL99:交叉连接(cross join)

SQL99:内连接(inner join)

SQL99:自然连接(natural join)

外连接(outer join)

在两个表之间的连接,返回内连接的结果,同时还返回不匹配行的左(或右)表的连接,称为左(或右)连接。返回内连接的结果,同时还返回左和右连接,称为全连接

右外连接

左外连接

全外连接

子查询

当一个查询是另一个查询的条件时,称之为子查询

多表连接语法

语法结构

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

select        table.column,table2.column        --投影

from          table1table2                                --表的定位

where        table1.column1 = table2.column2 ;       --关联(连接)条件

方法一:select a.*, b.* from a,b where a.a = b.b;

方法二:select a.*,b.*  from a INNER JOIN b on a.a = b.b;

  •  在where子句中写连接条件(不写where条件则会出现笛卡尔现象)

  • 当多个表中有相同的列名时,将表名或表的别名作为列名的前缀

定义连接

当数据从多表中查询时,要使用连接(join)条件。一个表中的行按照存在于相应列中的值被连接到另一个表中的行

原则

  • 在写一个连接表的select语句时,在列名前面用表名或者表别名可以使语义清楚,并且加快数据库访问
  • 为了连接n个表在一起,最少需要n-1个连接条件。例如,为了连接4个表,最少需要3个连接条件

等值连接

什么是等值连接

等值连接也被称为简单连接(simple joins)或者内连接(inner join)。是通过等号来判断连接条件中的数据值是否相匹配

抉择矩阵(decision matrix)

是通过行与列来分析一个查询的方式

例如,如果想显示同一部门中所有名称为Taylor的雇员的名字和部门名称,可以写出下列决策矩阵

投影列源表条件
last_nameemployeeslast_name='Taylor'
department_namdepartments

employee.department_id=

department.department_id

使用and操作符附加搜索条件

除了连接之外,还可以要求用where子句在连接中限制一个或多个表中的行

select * from employees;
select * from departments;
--查询所有雇员名称以及所在的部门名称            
--方法一 from x,x where x=x
select last_name,job_id,department_name 
from employees e,departments d 
where e.department_id=d.department_id--查询所有雇员名称以及所在的部门名称            
--方法二 from x inner join x on x=x
select last_name,job_id,department_name 
from employees e inner join departments  d 
on e.department_id=d.department_id;--查询Taylor名称以及所在的部门名称
select last_name,job_id,department_name 
from employees e,departments d 
where e.department_id=d.department_id
and last_name in 'Taylor'

多于两个表的连接

为了连接n个表,最少需要n-1个连接条件。例如,为了连接3个表最少需要两个连接

--查看雇员的last_name,departmentname 和 city 
select last_name,department_name,city from employees e,departments d,locations l
where e.department_id=d.department_id and d.location_id=l.location_id--查询Taylor名称.的last_name,departmentname 和 city 
select last_name,department_name,city from employees e,departments d,locations l
where e.department_id=d.department_id and d.location_id=l.location_id
and last_name='Taylor'

 

 非等值连接

一个非等值连接是一种不使用相等(=)作为连接条件的查询。如!=、>、<、>=、<=、between and等都是非等值连接的条件判断

select x,x from x,x
where x(条件) between x(上限)  and x(下限)

创建案例表

 ps:原来这个不需要做主外键约束的

--查询所有雇员的薪水级别
select em.last_name,em.salary,gr.gra from employees em,job_grades gr
where em.salary between gr.lowest_sal  and gr.highest_sal--and写法
select em.last_name,em.salary,gr.gra from employees em,job_grades gr
where em.salary>=gr.lowest_sal and em.salary<=gr.highest_sal

自连接

使用一个表连接它自身的操作

--查询每个雇员的名称以及对应经理的名称
select works.last_name,manages.last_name 
from employees works,employees manages
where works.manager_id=manages.employee_id

 外连接(outer join)

 外连接是指查询出符合连接条件的数据同时还包含孤儿数据。左外连接包含左表的孤儿数据,右外连接包含右表的孤儿数据,全外连接包两个表中的孤儿数据

孤儿数据(orphan data):是指被连接的列的值为空的数据

外连接类型

左外连接(left outer join):包含左表的孤儿数据

右外连接(right outer join):包含右表的孤儿数据

全外连接(full outer join):包含两个表中的孤儿数据

外连接语法格式

left outer join

right outer join

full outer join

定义连接类型,用on子句创建连接条件

左外连接(left outer join

--分析 谁是左表,左表是数据都显示,满足条件的;右边就是孤儿数据的
----左外连接
--查询雇员名称以及他们所在部门的名称,包括没有部门的雇员
select e.last_name 雇员名称,d.department_name 部门名称 
from employees e left outer join departments d 
on e.department_id=d.department_id

 

右外连接(right outer join

--以右边为基础,左表为孤儿表
--右外连接
--查询雇员名称以及他们所在的部门,包含哪些没有雇员的部门
select e.last_name,d.department_name 
from employees e right outer join departments d
on d.department_id=e.department_id--用左外连接也可以查出来就是,谁是左表谁是右边的问题
select e.last_name 雇员名称,d.department_name 部门名称 
from departments d left outer join employees e 
on e.department_id=d.department_id

 

全外连接(full outer join

--全外连接 full outer join
--孤儿数据左右都显示 两个表谁在左侧谁在右侧都没关系了
select e.last_name,d.department_name from employees e full outer join departments d
on e.department_id=d.department_id

Oracle扩展的外连接

在Oracle数据库中对外连接中的左外与右外连接做了扩展,可以简化外连接的语法。通过在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不显示孤儿数据而另一侧显示孤儿数据。(仅在Oracle中使用,有+号说明是孤儿数据

--Oracle扩展的外连接
select e.last_name,d.department_name from employees e,departments d
where e.department_id(+)=d.department_id;select e.last_name,d.department_name from employees e,departments d
where e.department_id=d.department_id(+);

内连接(inner join)

内连接通过inner join建立两个表的连接。在内连接中使用inner join作为表的连接,用on子句给定连接条件。inner join语句在性能上和其他语句没有性能优势

--查询雇员id为202的雇员名称,部门名称 以及工作城市--等值连接写法
select e.last_name 雇员名字,d.department_name 部门名称,l.city 工作城市 
from employees e,departments d,locations l
where e.department_id=d.department_id 
and d.location_id=l.location_id and e.employee_id in 202--内连接写法 inner join  on
select e.last_name 雇员名字,d.department_name 部门名称,l.city 工作城市 
from employees e inner join departments d on e.department_id=d.department_id
inner join locations l on l.location_id=d.location_id
where e.employee_id=202


http://chatgpt.dhexx.cn/article/buL1MTMR.shtml

相关文章

(八)多表查询

目录 多表查询 笛卡尔积的错误 连接条件 表的别名 多表查询分类 自连接 和 非自连接 内连接 和 外连接 SQL92 SQL99 UNION的使用 UNION操作符 UNION ALL操作符 7种SQL JOINS的实现 QL99语法新特性 自然连接 USING连接 多表查询 多表查询&#xff0c;也称…

6、多表查询

第06章_多表查询 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了…

【MySQL】多表查询方法

目录 多表关系 多表查询之笛卡尔积 多表查询分类 连接查询 内连接 外连接 自连接 子查询 标量子查询 列子查询 行子查询 表子查询 联合查询 多表关系 一对多&#xff08;多对一&#xff09;&#xff1a;员工与部门&#xff0c;一个部门可以对应多个员工一般在多的…

【MySQL】多表查询

首先&#xff0c;为了方便说明问题&#xff0c;创建两个表emp&#xff08;雇员信息&#xff09;和dept&#xff08;雇员部门信息&#xff09;&#xff0c;其数据如下&#xff1a; 在之前的博客中&#xff0c;我们分享了单表查询的方法&#xff0c;但是在实际应用中&#xff…

mysql 多表查询

一、概念 多表查询也叫关联查询, 其就是指 一次性查询多张表&#xff0c;并且将每张表得到的数据联系作为查询结果 二、关键字 当我们需要一次查询两张表时&#xff0c;如果使用&#xff1a; select * from employees,departmaents; 这样的话会出现笛卡尔积错误 (笛卡尔积错…

数据库-MySQL-多表查询(总结)

目录 前言 多表查询概述 多表查询分类 1、连接查询 2、子查询 内连接 内连接查询语法 案例演示 外连接 外连接查询的语法 案例演示 联合查询-union,union all 子查询 概念 分类 标量子查询 自连接 自连接查询语法 案例演示 子查询 列子查询 行子查询 表子…

多表查询(整理)

一、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间互相关联&#xff0c;所以各个表结构之间也存在着各种联系。 基本上有三种&#xff1a;…

mybatis多表查询

目录 前言 一、Mybatis多表查询 2.一对一查询&#xff08;多对一&#xff09; 2.2 一对多查询 2.3 多对多查询 2.4 知识小结 前言 mybatis初学者记录每日学习日常 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Mybatis多表查询 内连接、左外连…

多表查询(连接查询)

在使用数据库查询语句时&#xff0c;单表的查询有时候不能满足项目的业务需求&#xff0c;在项目开发过程中&#xff0c;有很多需求都是要涉及到多表的连接查询最终需要查询的数据来源于不同的表中时&#xff0c;这个时候需要考虑使用连接查询 新建一张员工表 -- emp drop t…

数据库高级——多表查询

多表查询 多表查询有如下几种&#xff1a; 合并结果集&#xff1a;union、union all连接查询&#xff1a; 2.1. 内连接&#xff1a;inner join on 2.2. 外连接&#xff1a;outer join on – 左外连接&#xff1a;left outer join – 右外连接&#xff1a;right outer join 2.…

MySQL多表查询

文章目录 一、什么是多表查询1、概述2、笛卡尔积现象 二、多表查询的分类1、等值连接 vs非等值连接2、自连接 vs 非自连接3、内连接 vs 外连接4、满外连接&#xff08;FULL OUTER JOIN&#xff09; 三、UNION[ALL]的使用四、7种SQL JOINS的实现 一、什么是多表查询 1、概述 多…

【MySQL】多表查询策略(多表联查子查询)

目录 一、MySQL多表查询 二、准备工作 1.运行环境 2.创建公司表 3.创建员工表 三、多表查询 &#xff08;一&#xff09;多表联查—同时查询多张表 1.联结 2.左连接 3.右连接 4.内连接 &#xff08;二&#xff09;子查询 1.SELECT子查询 2.WHERE子查询 3.FROM子…

MySQL----多表查询

MySQL----多表查询 多表关系表与表之间的联系&#xff1a;一对多(多对一)多对多一对一 多表查询多表查询的分类数据准备内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 多表关系 在进行数据库表结构的设计时&#xff0c;会根据业务的需求和…

SQL语句多表查询

多表查询 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&a…

十、多表查询

十、多表查询 *多表查询的本质就是把多张表合并成一个临时表 1、多表数据合并方案 连接查询合并方案【最常见】 首先确保两张表之间存在【隶属关系】将两张表中的数据行【沿着水平方向进行拼接】最终得到一个拥有【完整隶属关系】的新数据行 联合查询合并方案 不需要两张表之…

图解数据库多表查询(多表联查)的几种方式

多表查询&#xff0c;也被称为多表连接查询。 为什么会有多表查询这个操作呢&#xff1f; 在实际项目开发过程中&#xff0c;会出现多张表&#xff0c;用于分类存储不同的信息&#xff0c;我们测试需要的数据也会来自不同的表&#xff0c;因此需要使用多表查询。 我们常用的…

史上最牛mysql-06 (多表连接)

多表连接 个人博客 &#xff1a;www.xiaobeigua.icu 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&…

sql多表查询

1.多表查询概念&#xff1a;从多张表查询数据 2.分类&#xff1a;连接查询和子查询。 有两张表A、B 连接查询&#xff1a; 内连接 相当于查询A、B交集数据 例1&#xff1a;select * from emp,dept where emp.dep_iddept.id; 外连接 左外连接&#xff1a;相当于查询…

sql语句之多表查询

文章目录 一、笛卡尔积(交叉连接) ---->cross join1、概念2. 语法3.示例 二、内连接---->inner join1、概念2. 语法3.示例 三、外链接---->outer join1、概念2. 语法3.示例 四、联合连接---->union1、概念2.示例 一、笛卡尔积(交叉连接) ---->cross join 1、概…

连接查询(多表查询)——MySQL

连接查询&#xff08;多表查询&#xff09; 又称多表查询&#xff0c;当查询的字段涉及多个表的时候&#xff0c;就要用到连接查询 分类&#xff1a; 为表起别名&#xff1a; 提高语句的简洁度区分多个重名字段注意&#xff1a;如果为表起了别名&#xff0c;则查询的字段就不…