Oracle学习笔记_04_多表查询
一.概念:
1.多表连接有以下几种分法:
(1)内连接 vs 外连接 (左、右、满)
(2)等值连接 vs 不等值连接
(3)非自连接 vs 自连接
2.笛卡尔集: 所有表中的所有行互相连接
产生条件:(1)多表查询没有连接条件
(2)连接条件无效
3. 内连接 : 结果集中不包含一个表与另一个表不匹配的行
外连接 : 两个表在连接过程中除了返回满足连接条件的行以外(这里的数据是内连接查询到的),还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接
满外连接: 返回左表中和右表中不满足条件的行
4.注意: 当列名为多个表共有时,列名必须被限制。
二.1999 语法连接
语法:
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)];
1.join ... on... (推荐使用)
自然连接中是以具有相同名字的列为连接条件的,而 JOIN...ON ...子句并不要求两张表含有相同名字的列。
ON 子句使语句具有更高的易读性。
select 字段... from 表1 join 表2 on 表1和表2的连接条件
join 表3
on 表1(或表2)和表3的连接条件
(1)两张表的等值连接
select last_name, department_name
from employees e join departments d
on e.department_id = d.department_id;
(2)使用 join.. on..创建多表连接:三张表的等值连接
select last_name,e.department_id,department_name,city
from employees e join departments d
on e.department_id = d.department_id
join locations l
on d.location_id = l.location_id;
2.CROSS JOIN ( 不推荐 )
使用 CROSS JOIN 会产生叉集,叉集与笛卡尔集相同。
SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;
3. natural join (不推荐)
自然连接: NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。
注: 如果只是列名相同而数据类型不同,则会产生错误。
employees表 和 departments表 有两个相同字段。使用NATURAL JOIN ,会自动以这两个字段作为连接条件。
select last_name,department_name
from employees natural join departments;
以上代码与下面代码相同:
select last_name,department_name
from employees e,departments d
where e.department_id = d.department_id and e.manager_id = d.manager_id;
4.join .. using ... (不推荐)
背景:由 NATURAL JOIN 子句创建等值连接,会将这些相同列都作为连接条件。而有时我们只需要其中某些列,这是就可以使用using子句指定等值连接中需要用到的列。
作用:在有多个列满足条件时,可以使用 USING 子句 指定等值连接中需要用到的列。
局限:按照指定的列作为连接条件。但是要求指定的列,在两个表中列名相同。
注:
不要给选中的列中加上表名前缀或别名。
JOIN 和 USING 子句经常同时使用。
以上都是内连接
三.外连接
1.左外连接
左外连接:除了查询到满足条件的行之外,返回左表中不满足条件的行。主要有两种实现方式:
(1) left outer join... on...
select last_name ,department_name
from employees e left outer join departments d
on e.department_id = d.department_id;
(2) +
select e.employee_id,e.department_id,d.department_name
from employees e,departments d
where e.department_id = d.department_id(+); --左边有,右边没,故右加
2.右外连接
右外连接:返回右表中不满足条件的行。主要有两种实现方式:
(1) right outer join... on...
select employee_id,last_name,e.department_id,department_name
from employees e right outer join departments d
on e.department_id = d.department_id;
(2) +
select employee_id,e.department_id,department_name
from employees e,departments d
where e.department_id(+) = d.department_id;
3.满外连接
满外连接:同时返回左表和右表中不满足条件的行
select employee_id,last_name,e.department_id,department_name
from employees e full outer join departments d
on e.department_id = d.department_id;
四.补充
1.自连接
select emp.employee_id,emp.last_name,mgr.last_name
from employees emp,employees mgr
where emp.manager_id = mgr.employee_id;
Oracle学习笔记_04_多表查询的更多相关文章
- oracle系列笔记(2)---多表查询
多表查询 这篇文章主要讲四点: (1)oracle多表查询 (2)SQL99标准的连接查询 (3)子查询 (4)分级查询 oracle多表查询有两种方式,一种是oracle所 ...
- Mybatis学习笔记之---多表查询(1)
Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...
- MySQL学习笔记8——多表查询
多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...
- Mybatis学习笔记之---多表查询(2)
Mybatis多表查询(2) (一)举例 用户和角色 一个用户可以有多个角色,一个角色可以赋予多个用户 (二)步骤 1.建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系.需要使用中间表,中 ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...
- Oracle学习(五):多表查询
1.知识点:能够对比以下的录屏进行阅读 SQL> --等值连接 SQL> --查询员工信息: 员工号 姓名 月薪 部门名称 SQL> select empno,ename,sal,d ...
- mysql学习笔记--数据库多表查询
一.内连接[inner join] 1. 语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 2. 语法二:select 列名 from 表1 ...
- mysql学习笔记--数据库单表查询
一.查询语句 1. select [选项] 列名 [from 表名] [where 条件] [order by 排序] [group by 分组] [having 条件] [limit 限 ...
随机推荐
- 在Ubuntu下编译FFmpeg
第一步:准备编译环境 .tar.bz2 -2245/ ./configure --enable-static--enable-shared--prefix=/usr/localmakesudomake ...
- 生成n个元素的全排列 C实现
近期在准备复习算法设计的考试,下边记录一些,看笔记时突然想到的解法. 问题是这种 用递归实现 n 个元素的全排列. 当时老师给出的解答是 假定第i个元素 ri 放在首位,于是 f(r1,r2,-,rn ...
- 嵌套SQL语句訪问DB2中SQLCA的调用技巧
在IBM的关系型数据库产品DB2中,使用SQL Communication Area(SQLCA)将程序中嵌套的SQL语句执行情况返回给程序. 在程序中有针对性地对SQLCA实施调用,可对程序中各类S ...
- 为什么是kafka(二)
回答几个网友提出的问题,不清楚的能够看上一篇内容. 1. kafka的删除策略应该怎么配置?为了提升性能.我是不是应该1小时删除一次消费过的数据. 全然能够依据磁盘大小配置.仅仅要磁盘足够用,全然不 ...
- JS获取图片的缩略图
js获取上传文件的缩略图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- A/B(逆元)
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- EasyDSS直播服务器如何帮助用户解决OBS不能同时同步输出多路直播流到直播平台、CDN平台的限制
最近有用户突然寻求帮助,大概的意思就是说: 他需要同步将桌面的直播同时RTMP发布到:斗鱼.熊猫TV等等多个平台,但是OBS又只能同时采集并发布推流直播到单一个平台,而且有时候在4G或者网络比较差的情 ...
- [Android]豆瓣FM离线数据
离线目录结构: /sdcard/Android/data/com.douban.radio下 ./cache/fileCaches: 离线音乐歌词(lyric) ./cache/images: 离线音 ...
- 给MDI窗体加背景,解释MakeObjectInstance和CallWindowProc的用法
工程含有1个MDI主窗口和2个子窗口.唯一需要注意的是,每个窗体都有ClientHandle,但只有当自己是MDI主窗体的情况下才有值,否则等于0. unit Unit1; interface use ...
- c++操作flash
c++操作falsh,忘了原文在哪了,自己尝试了,直接贴代码 // SDK版本 //////////////////////////////////////////////////////////// ...