多表查询的目的:

从两张以上的数据表中查询每张表的字段

笛卡尔集的问题:

查询职员表一共107条记录

select count(employee_id) from employees;

查询部门表,一共27条记录

select count(department_id)from departments;

我们不按照任何的数据表的关系,合并查询,就会出现这样的状况:

select 107*27 from dual;

也就是表1的每一个记录对应表2的所有记录

查询的结果就是N张表之间的所有记录乘积

笛卡尔积产生的条件:

- 省略连接条件

- 连接条件无效

- 所有表的所有记录互相连接

【使用WHERE子句,加入有效的筛选条件以过滤】


Oracle的连接查询:

语法公式:

SELECT    table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;

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

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

等值连接

SELECT
employees.employee_id,
employees.last_name,
employees.department_id,
departments.department_id,
departments.location_id
FROM
employees,
departments
WHERE
employees.department_id = departments.department_id;

使用别名简化标识和书写

SELECT
e.employee_id,
e.last_name,
e.department_id,
d.department_id,
d.location_id
FROM
employees e ,
departments d
WHERE
e.department_id = d.department_id;

【连接 n个表,至少需要 n-1个连接条件】

练习:

查询出公司员工的 last_name, department_name, city

非等值连接

案例:

EMPLOYEES表中的列工资 应在JOB_GRADES表中的最高 工资与最低工资之间

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    table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);

右外连接

SELECT    table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;

【使用外连接可以查询不满足连接条件的数据。 外连接的符号是 (+)

案例:

SELECT
e.last_name, e.department_id,
d.department_name
FROM
employees e, departments d
WHERE
e.department_id(+) = d.department_id ;

自连接

练习:

查询出 last_name 为 ‘Chen’ 的员工的 manager 的信息

练习2:

查询employees表,返回“Xxx works for Xxx”

写法:

SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;

Oracle99SQL语法:

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

SELECT
table1.column,
table2.column
FROM
table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON(table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)];

叉集 CROSS JOIN

使用CROSS JOIN 子句使连接的表产生叉集。

叉集和笛卡尔集是相同的。

SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;

自然连接 NATURAL JOIN

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

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

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

返回的是,两个表中具有相同名字的列的“且、交集”,而非“或,并集”。

即:比如employee类和department类都有department_id和manager_id,返回二者都相同的结果。

自然连接

SELECT
department_id, department_name,
location_id, city
FROM
departments
NATURAL JOIN
locations ;

使用 USING 子句创建连接

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

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

- 不要给选中的列中加上表名前缀或别名。

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

使用自然连接

select last_name,department_name  
from employees
natural  join departments ; 

使用USING子句

select  last_name,department_name 
from employees 
join departments using (department_id);

案例:

SELECT e.employee_id, e.last_name, d.location_id
FROM employees e JOIN departments d
USING (department_id) ;

使用ON 子句创建连接

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

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

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

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

案例:

SELECT
e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM
employees e JOIN departments d
ON (e.department_id = d.department_id);

使用 ON 子句创建多表连接

SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;

总结:内连接和外连接

- 在SQL: 1999中,内连接只返回满足连接条件的数据

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

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

左外

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

右外

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

全外

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

SQL语句的多表查询方式:

例如:按照department_id查询employees(员工表)和departments(部门表)的信息。

方式一(通用型):SELECT ... FROM ... WHERE

SELECT e.last_name,e.department_id,d.department_name
FROM employees e,departments d
where e.department_id = d.department_id

方式二:SELECT ... FROM ... NATURAL JOIN ...

有局限性:会自动连接两个表中相同的列(可能有多个:department_id和manager_id)

SELECT last_name,department_id,department_name
FROM employees
NATURAL JOIN departments

方式三:SELECT ... JOIN ... USING ...

有局限性:好于方式二,但若多表的连接列列名不同,此法不合适

SELECT last_name,department_id,department_name
FROM employees
JOIN departments
USING(department_id)

方式四:SELECT ... FROM ... JOIN ... ON ...
常用方式,较方式一,更易实现外联接(左、右、满)

SELECT last_name,e.department_id,department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
--内连接
1)
--等值连接
--不等值连接
2)
--非自连接
--自连接 --外连接
--左外连接、右外连接、满外连接

【OracleDB】 06 多表查询的更多相关文章

  1. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

  2. python实现简易数据库之二——单表查询和top N实现

    上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...

  3. (六)Oracle 的 oracle表查询关键字

    参考:http://www.hechaku.com/Oracle/oracle_tables2.html 1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们 ...

  4. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  5. MySQL数据库查询操作进阶——多表查询

    多表查询 在大部分情况下,我们用到的表都是彼此相关联的,所以我们会有相当大的需求用到跨表的查询,这个时候我们就需要将相关联的表连起来做多表查询. 多表查询分为连表查询和子查询,连表查询即将相关联的表连 ...

  6. MySQL多表查询,pymysql模块。

    一 多表查询: 首先什么是多表查询: 我们在实际工作中,不可能把数据都存入一个表中,那么又需要这些表之间有一定的关联,因为表与表之间的数据是相关联的,所以就要用到我们的外键将多表连接到一起,那么我们更 ...

  7. mysql 数据操作 单表查询 group by 介绍

    group by 是在where 之后运行 在写单表查询语法的时候 应该把group by 写在 where 之后 执行顺序 1.先找到表 from 库.表名 2.按照where 约束条件 过滤你想要 ...

  8. 9 MySQL--多表查询

    多表查询: http://www.cnblogs.com/linhaifeng/articles/7267596.html 1.多表连接查询 2.符合条件连接查询 3.子查询 一.准备表 #建表 cr ...

  9. MySQL数据库篇之单表查询

    主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...

  10. day--39-MySQL的多表查询

    多表查询一:表的基本介绍 可以参考:https://www.cnblogs.com/cdf-opensource-007/p/6517627.html 建立一个员工表信息表和一个部门表,每个员工都对应 ...

随机推荐

  1. vue3 KeepAlive

    在Vue.js 3中,<keep-alive> 是一个抽象组件,用于保留其子组件状态,防止在切换组件时销毁它们.这对于在页面间切换时保留组件的状态或避免重复渲染特定组件非常有用.<k ...

  2. vue局部注册

    只能在当前注册它的vue实例中使用,通过某个 Vue 实例/组件的实例选项 components 注册仅在其作用域中可用的组件 var Child = { template: '<div> ...

  3. Vue CLI 4与项目构建实战指南

    title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置,提高开发效 ...

  4. Easysearch 内核完善之 OOM 内存溢出优化案例一则

    最近某客户在使用 Easysearch 做聚合时,报出 OOM 导致掉节点的问题,当时直接让客户试着调整 indices.breaker.request.limit ,但是不起作用,于是又看了下 Ea ...

  5. 微信支付(付款码支付,条码支付,刷卡支付)左上角LOGO显示

    微信支付(付款码支付,条码支付,刷卡支付)左上角LOGO显示 如果你上送的sub_appid 公众号(小程序),优先显示你公众号(小程序)的LOGO,如果你的公众号(小程序)未设置LOGO,会显示上游 ...

  6. 华擎B365M ITX ,SSD WIN7 电脑卡顿,4K异常,9代 I7

    华擎B365M ITX ,SSD WIN7 电脑卡顿,4K异常,9代 I7 故障现象: 新装的电脑,WIN7 电脑卡顿. 表现:我的电脑打开很慢,延时个1-3秒左右.任务管理器打开很慢,N秒. 换了块 ...

  7. Java中常见的几种的溢出

    引言 在开发过程中,因为编程经验不足,经常会导致各种各样的溢出,今天本文就举例说明几种常见的溢出 堆溢出 堆溢出是最常见的一种溢出. 导致原因:堆中没有足够的空间储存新生成的实例对象 public s ...

  8. vite+vue3+ts+elementPlus前端框架搭建 [一]

    记录下搭建vite + vue3 + ts + elementPlus项目的过程及遇到的问题. 建议使用pnpm安装依赖,npm切换到pnpm 链接地址:[https://www.pnpm.cn/in ...

  9. python pika rabbitmq demo

    import pika import json # https://www.cnblogs.com/zhaohuaxishi/p/12107392.html # https://www.cnblogs ...

  10. https请求,Java代码忽略https证书:解决No subject alternative names present问题

    https请求,Java代码忽略https证书:解决No subject alternative names present问题 package com.test.utils; import org. ...