sql 语句left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on下去?
今天这个帖子要解决一个问题:oracle数据库表间通过left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on 下去?
利用sqlfiddle创建三张基本表结构先:
create table company(company_id int,company_name varchar2(10),department_id int,employee_id int);
create table department(department_id int,department_name varchar(10));
create table employee(employee_id int,employee_name varchar(10));
insert into company values(1,'HSBC',101,1001);
insert into department values(101,'IT');
insert into employee values(1001,'Steve');
select * from company;
select * from department;
select * from employee;
为了印证,我写下了如下代码:
select t1.*,t2.department_name,t3.employee_name
from company t1
left join department t2
on t1.department_id=t2.department_id
left join employee t3
on t1.employee_id=t3.employee_id;
结果是可以出来预想的结果的,也就是说left join是右边表向左join过程实际上是合并的过程,再继续left join新表的时候实际上是前面所有集合向新表抛出on. 随着left join一路向左,并非只能是最左边的关联表与新表关联,其实母表可以一直on 下去
另外,顺表解决一个疑问,left join关联的时候,左边表join on的字段value集大于右边表,拼合成的表如何取值?是保留左边所有value集,右边没有就为空吗?
譬如新增一条记录:
insert into company values(1,'HSBC',102,1001);
没错,left join关联的时候,左边表join on的字段value集大于右边表,拼合成的表是保留左边所有value集,右边没有就为空。
反之,left join关联的时候,左边表join on的字段value集小于右边表,拼合成的表如何取值?是只取左边所有value集,右边多出来的value集不取?
insert into employee values(1002,'Luke');
结论:反之,left join关联的时候,左边表join on的字段value集小于右边表,拼合成的表是只取左边所有value集,右边多出来的value集不取。
最后,借楼反馈下 left join /join /where连接表间关系的区别:
select t1.column,t2.column
from t1
left join t2
on
t1.indexno=t2.indexno;
这个意思是以右边表为主表,关联左边t2表,如果t2.indexno能有1个match则取这一行的t2.column,如果有超过1个match的,那么t1主表开始膨胀。如果0个match,那么t1.indexno依然出现在查询结果,只是t2.column出现null值;
join 则不然,
select t1.column,t2.column
from t1
join t2
on
t1.indexno=t2.indexno;
这个意思t1表和t2表相互关联,如果t2.indexno能有1个match则取这一行的t2.column,如果有超过1个match的,那么表开始膨胀。如果0个match,那么t1和t2取全集然后去掉空的记录;
where和join相同原理。
sql 语句left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on下去?相关推荐
- 试用SQL语句创建一个工资总额超过20万元(含20万元)的各部门工资总额视图V-SAL...
2010年5月21日星期五 设有关系模式:EMP(职工号,姓名,工资,部门号) 试用SQL语句创建一个工资总额超过20万元(含20万元)的各部门工资总额视图V-SAL. select 部门号,sum( ...
- 一条SQL语句查询当前数据库下有多少张表
SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE table_schema=(SELECT DATABASE())
- Hibernate使用原生SQL语句(left join左连接查询)
Hibernate使用原生SQL语句 以下是本人对Hibernate使用原生SQL语句的理解: 在项目开发当中使用Hibernate提供的HQL有时候不能满足需求,尤其是多表查询或者是多表中没创建主外 ...
- MySQL面试2:一张学生表,一张教师表,里面都有Name和Code,写出张三的老师有多少名学生的SQL语句。
在Mysql面试的写SQL语句环节中,有人曾碰到了这样一道这样的一道SQL语句题.目前有两张数据表,一张学生,一张老师表.里面都有Name和Code两个字段.求出张三的老师一共有多少名学生. 这样,我 ...
- MySQL经典面试题--SQL语句
备注:建立下面的每一个题目对应的表,插入案例数据,然后执行需要的 SQL ,将结果复制到 word 文件中 MYSQL经典面试题,后面有建表过程和SQL执行语句 有道云连接 https://note ...
- MS-SQL Server 基础类 - SQL语句
网址收藏夹 免费申请! 首页 |收藏夹 | 笑话 | 贴吧 | 交友 | 留言 | 软件 | 超市 | 网页特效 | 酷站导航 | 论坛 新闻 | 同学录 | 图片 | 跑商 | 动画 | 音乐 ...
- sql语句优化之SQL Server
MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成 ...
- MySQL 数据库 之 高级 SQL 语句(常用查询,正则表达式,运算符,库函数,存储过程)
文章目录 前言 一 . 常用查询介绍 1.按关键字排序 1.1默认升序 1.2 降序 1.3 多字段的排序 2. 对结果进行分组 2.1 分组统计 3.限制结果条目 3.1 查看前4行 3.2 查看第 ...
- MySql数据库SQL语句小结
数据库概述 什么是数据库? 什么是关系型数据库? 数据库相关概念 什么是SQL语言? 连接mysql服务器 数据库及表操作 创建.删除.查看数据库 创建.删除.查看表 新增.更新.删除表记录 查询表记 ...
最新文章
- unordered_map的使用特性
- 自动化测试框架:自动化测试呼唤开发
- centos-stream-9安装chrome谷歌浏览器
- 都说「跳一跳」是微信抄袭了育碧,万万没想到,他们在一起了!
- VS2015+Opencv3.2配置(一次配好)
- 【优化选址】基于matlab穷举法求解小区基站选址优化问题【含Matlab源码 439期】
- 3S基础知识:MapX应用讲义—加载地图数据
- 仙剑制作人教你成为游戏人
- 安卓手机如何复制粘贴不重叠_复制的文字粘贴时怎么重叠了 - 卡饭网
- armlinux开发板用户自动登录
- 手机扫描识别Vin码识别
- 鼠标悬停,图片向四周放大效果
- 内网环境部署zabbix5.0版本监控(一)
- 历史经验之js个200经验收藏
- 云班课python测试答案_智慧职教云课堂APPPython程序设计题目答案
- 【Linux】Linux 磁盘与文件系统管理命令
- 如何提高Python代码的可读性?
- 看不到同一个网络下的其他计算机,看不到局域网其他计算机怎么办
- Mac搭建GO开发环境
- python-gif图生成
热门文章
- 如何成为智能合约开发者
- Data Binding: A godsend or the devil in disguise?
- 数字音频总线A2B开发详解十六(A2B-一主一从:ADAU1701作为全新Slave板的DSP)
- 数电课设,数电特殊字符大全(UC,AP,CL,rh)含原理图
- 一个邮件钓鱼木马的分析 (一)
- 7和7的倍数游戏答案_直播互动小游戏,块拿小本本记好
- ARM7、ARM9和ARM11的区别
- 好心情精神心理科:抑郁症,真的会让你变丑!
- 智慧电力可视化大屏,赋能虚拟电厂精准减碳
- 多系统linux系统引导修复工具,EasyBCD引导双系统|EasyBCD双系统引导修复工具 V2.4.0.237 中文免费版 下载_当下软件园_软件下载...