【OracleDB】 06 多表查询
多表查询的目的:
从两张以上的数据表中查询每张表的字段

笛卡尔集的问题:
查询职员表一共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 多表查询的更多相关文章
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
- python实现简易数据库之二——单表查询和top N实现
上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...
- (六)Oracle 的 oracle表查询关键字
参考:http://www.hechaku.com/Oracle/oracle_tables2.html 1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们 ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- MySQL数据库查询操作进阶——多表查询
多表查询 在大部分情况下,我们用到的表都是彼此相关联的,所以我们会有相当大的需求用到跨表的查询,这个时候我们就需要将相关联的表连起来做多表查询. 多表查询分为连表查询和子查询,连表查询即将相关联的表连 ...
- MySQL多表查询,pymysql模块。
一 多表查询: 首先什么是多表查询: 我们在实际工作中,不可能把数据都存入一个表中,那么又需要这些表之间有一定的关联,因为表与表之间的数据是相关联的,所以就要用到我们的外键将多表连接到一起,那么我们更 ...
- mysql 数据操作 单表查询 group by 介绍
group by 是在where 之后运行 在写单表查询语法的时候 应该把group by 写在 where 之后 执行顺序 1.先找到表 from 库.表名 2.按照where 约束条件 过滤你想要 ...
- 9 MySQL--多表查询
多表查询: http://www.cnblogs.com/linhaifeng/articles/7267596.html 1.多表连接查询 2.符合条件连接查询 3.子查询 一.准备表 #建表 cr ...
- MySQL数据库篇之单表查询
主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...
- day--39-MySQL的多表查询
多表查询一:表的基本介绍 可以参考:https://www.cnblogs.com/cdf-opensource-007/p/6517627.html 建立一个员工表信息表和一个部门表,每个员工都对应 ...
随机推荐
- vue移动端 滚动
better-scroll: https://better-scroll.github.io/docs/zh-CN/guide/ 影院列表数据使用better-scroll来完成数据的展示,此插件对于 ...
- .NET借助虚拟网卡实现一个简单异地组网工具
由于工作需要,经常需要远程客户的服务器,但是并不是所有服务器都能开外网端口,使用向日葵等软件终究还是不太方便,于是找了很多工具,包括zerotier 等,但是由于服务器在国外等有时候还不同, 于是开始 ...
- 使用vscode写Markdown并且导出为pdf(干货)
目录 序言 下载vscode 安装插件 markdown语法 导出为pdf 序言 大家在学习过程中都会有记笔记的好习惯(美观的笔记当然是上上选),于是,Markdown就是一个不错的选择,待会也会附上 ...
- mysql case when使用
## mysql case when使用 SELECT order_no,case is_test when 0 then '否'when 1 then '是'end as '是否测试' from ` ...
- 何时/如何使用 std::enable_shared_from_this<T>?
要点回顾 继承自 std::enable_shared_from_this<T> 的类能够在其自身实例中通过 std::shared_from_this 方法创建一个指向自己的 std:: ...
- 常用的jvm一些监控命令
一.jmap 查看堆内对象示例的统计信息 jmap -heap pid 描述:查看堆信息 jmap -histo:live pid | head -30 描述:显示堆中对象的统计信息 命令:jmap ...
- C# DateTime日期字段转中文文字
public static String ToChineseYearAndMonth(this DateTime dt) { string[] chineseNumbers = { "零&q ...
- .Net8 AddKeyedScoped键值key注册服务异常
异常描述:This service descriptor is keyed. Your service provider may not support keyed services. 场景:.Net ...
- substr()函数用法
substr()函数: 定义和用法: substr()返回字符串的一部分 如果start参数是负数且length小于等于start,则length为0 语法: substr(starting,star ...
- 【iOS】push控制器时隐藏tabbar,dismiss控制器时显示tabbar
在push之前将控制器的属性hidesBottomBarWhenPushed设置为yes就好. //准备要把控制器vc给push出去了 UIViewController *vc = [[UIViewC ...