多表查询的目的:

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

笛卡尔集的问题:

查询职员表一共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. 记录工作中常用的 JS 数组相关操作

    工作中难免会遇到各种各样的数据结构,较为全面的了解数组操作,对于复杂数据结构的处理会非常有用且节省时间 所以想在这里总结一下工作中常用的数组操作,都是一些非常基础的知识,大家看个乐就好~ 目录 工作中 ...

  2. jquery的全局函数 多库并存

            // jQuery的全局函数 , 也称钩子函数         // 所谓的钩子函数 是 与 其他函数绑定的函数         // 作用是 监听 函数的执行 当函数执行到某个状态时 ...

  3. 基于 Easysearch kNN 搭建即时图片搜索服务

    环境准备 启动 Easysearch 服务: # Make sure your vm.max_map_count meets the requirement sudo sysctl -w vm.max ...

  4. 给 ES 插上向量检索的翅膀 | DataFunSummit 2023 峰会演讲内容速达

    近日,由 DataFun 主办的 DataFunSummit 2023 数据基础架构峰会 圆满落下帷幕,本次峰会邀请了腾讯.百度.字节.极限科技.Zilliz 等众多企业技术专家为大家带来分布式存储以 ...

  5. .NET5 ASP.NET Core 使用 EF Core MS SQL SERVER DB First

    .NET5 ASP.NET Core 使用 EF Core MS SQL SERVER DB First 开发工具:VS2019 1.修改appsettings.json,增加一项. "Co ...

  6. 容器docker技术

    我们先看看很久很久以前,服务器是怎么部署应用的! 由于物理机的诸多问题,后来出现了虚拟机. 但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统 ...

  7. OceanBase 金融项目优化案例

    领导让我帮忙支持下其他项目的SQL优化工作,呦西,是收集案例的好时机. 下面SQL都是在不能远程的情况下,按照原SQL的逻辑等价改写完成否发给现场同事验证. 案例一 慢SQL,4.32秒: SELEC ...

  8. 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadLocal 事务控制)

    1. 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadLocal 事务控制) @ 目录 1. 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadL ...

  9. python根据文件目录批量过滤空行

    import shutil import os path = "E:\\in\\" #文件夹操作目录 path2 = "E:\\out\\" #文件夹输出目录 ...

  10. redis简单应用demo - 订单号自增长的思路:业务编码+地区+自增数值

    redis简单应用demo1.字符串127.0.0.1:6379> set hello toneyOK127.0.0.1:6379> type hellostring127.0.0.1:6 ...