多表查询的目的:

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

笛卡尔集的问题:

查询职员表一共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. Stable Diffusion 解析:探寻 AI 绘画背后的科技神秘

    AI 绘画发展史 在谈论 Stable Diffusion 之前,有必要先了解 AI 绘画的发展历程. 早在 2012 年,华人科学家吴恩达领导的团队训练出了当时世界上最大的深度学习网络.这个网络能够 ...

  2. @RequestMapping 注解用在类上面有什么作用?

    是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.

  3. java多线程编程:你真的了解线程中断吗?

    java.lang.Thread类有一个 interrupt 方法,该方法直接对线程调用.当被interrupt的线程正在sleep或wait时,会抛出 InterruptedException 异常 ...

  4. 高德解析城市的分析,根据高德的经纬度获取城市cityCode

    高德解析城市的分析,根据高德的经纬度获取城市cityCode http://restapi.amap.com/v3/geocode/regeo?output=json&location=110 ...

  5. 报错 ERR !npicode ELIFECYCLE dev: wue-cli-service serve

    在系统变量 Path 里面加上:%SystemRoot%\system32,关掉终端,重新启动项目.

  6. Stable Diffusion 生成个性图片指南

    在当今人工智能领域,midjourney无疑是生成图片的王者,但是苦于付费才能使用,今天我就给大家分享一下midjourney平替stable diffusion,实现本地生成不逊色于midjourn ...

  7. 35个Redis企业级性能优化点与解决方案

    Redis作为企业级应用中广泛使用的高性能键值存储数据库,其性能优化是一个复杂且多面的话题.以下是V 哥整理的一些关键的优化点和相应的解决方案,提供给兄弟们参考. Redis的性能优化涉及到硬件选择. ...

  8. 关于docker-compose up -d 出现超时情况处理

    由于要搭建一个ctf平台,用docker一键搭建是出现超时情况 用了很多办法,换源,等之类的一样没办法,似乎它就是只能用官方那个一样很怪. 只能用一种笨办法来处理了,一个个pull. 打个比如: 打开 ...

  9. C# pythonnet(2)_FFT傅里叶变换

    Python代码如下 import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取数据 data = pd.r ...

  10. 2.3T NPU强势登场!NXP i.MX 8M Plus开启工业新篇章,14纳米!

                    更多产品详情以及购买咨询 可添加如下客服人员微信 (即刻添加,马上咨询) 更多i.MX 8M Plus产品资料 可长按二维码识别下载 如需选购,请登录创龙科技天猫旗舰店 ...