前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL92、SQL99中的多表连接查询区别

SQL92、SQL99中的多表连接查询区别

作者头像
时间静止不是简史
发布于 2020-07-24 09:25:34
发布于 2020-07-24 09:25:34
2.3K00
代码可运行
举报
文章被收录于专栏:Java探索之路Java探索之路
运行总次数:0
代码可运行

SQL99多表连接查询

1. cross join(交叉连接)

交叉连接会产生一个笛卡尔积

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp cross join dept; 

在笛卡尔积中, 有很多数据是无意义的, 所以需要消除, 可以通过 where 子句来消除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp cross join dept where 
emp.deptno=dept.deptno; 

可以在查询时, 给表格起别名(如果不是e.*,则后面必须直接跟from,否则会报错)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.*, dname, loc from emp e cross join dept d 
where e.deptno=d.deptno; 

2. natural join(自然连接)

natural join 用于针对多张表的同名字段进行等值连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp e natural join dept d; 

特点: a) 在自然连接时, 自动进行所有同名列的等值连接, 不需 要写连接的条件 b) 同名列只显示一列, 而且在使用时, 不能加表前缀(e.、d.、) 查询所有员工的姓名, 部门编号和部门名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, deptno, d.dname from emp e natural join dept d;

3. inner join(内连接)

inner可以省略不写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp inner join dept 
on emp.deptno=dept.deptno; 

4. using 子句

用来指定进行等值连接的同名字段, 针对自然连接提供的. 同名字段依然不能使用表前缀.

a) 查询 20 部门员工的姓名, 工资, 部门编号和部门名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, e.sal, deptno, d.dname from emp e 
natural join dept d where deptno=20; 

select e.ename, e.sal, deptno, d.dname from emp e 
join dept d using (deptno) where deptno=20;

5. on 子句

on 子句是使用非常广泛的子句, 它可以被用来指定连接的(特别是非等值连接) 条件. 用于将过滤条件和关联条件分开.

a) 查询所有员工的姓名, 工资和工资等级

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, e.sal, s.grade from emp e join 
salgrade s on e.sal>=s.losal and e.sal<=s.hisal; 

select e.ename, e.sal, s.grade from emp e join 
salgrade s on e.sal between s.losal and s.hisal; 

b) 查询 30 部门员工的编号, 姓名, 部门名称和所在地

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.empno, e.ename, d.dname, d.loc 
from emp e 
join dept d 
on e.deptno=d.deptno 
where d.deptno=30; 

c) 查询所有员工的姓名, 部门名称, 工资及工资等级

N 张表连接, 至少需要 N-1 个连接条件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, d.dname, e.sal, s.grade 
from emp e 
join dept d 
on e.deptno=d.deptno 
join salgrade s 
on e.sal between s.losal and s.hisal;

6. 外连接

外连接除了能显示满足连接条件的数据以外, 还用于显示不 满足连接条件的数据

左外连接

left [outer] join, 表示左外连接, 可以显示左表中不满足 连接条件的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, e.job, d.deptno, d.dname, d.loc 
from dept d 
left join emp e 
on e.deptno=d.deptno; 

右外连接

right [outer] join, 表示右外连接, 可以显示右表中不满 足连接条件的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, e.job, d.deptno, d.dname, d.loc 
from emp e 
right join dept d 
on e.deptno=d.deptno; 

全外连接

full [outer] join, 表示全外连接, 可以显示左右两表中不满足连接条件的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e1.empno, e1.ename, e2.empno, e2.ename 
from emp e1 
full join emp e2 
on e1.mgr=e2.empno 
order by e1.empno;

自连接

自连接是发生在同一个表格中的连接

a) 查询所有员工的编号, 姓名和领导的编号及姓名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e1.empno, e1.ename, e2.empno, e2.ename 
from emp e1 
join emp e2 
on e1.mgr=e2.empno 
order by e1.empno; 

b) 查询所有员工的编号, 姓名和领导的编号及姓名, 并显示 没有领导的员工信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e1.empno, e1.ename, e2.empno, e2.ename 
from emp e1 
left join emp e2 
on e1.mgr=e2.empno 
order by e1.empno;

SQL92多表连接查询

1 笛卡尔积

多张表通过逗号分隔

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp e, dept d; 

消除无意义数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from emp e, dept d where e.deptno=d.deptno; 

2 等值连接

a) 查询 10 部门员工的姓名, 职位和部门名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, e.job, d.dname from emp e, dept d where 
e.deptno=d.deptno and d.deptno=10; 

3 非等值连接

a) 查询所有员工的姓名, 工资和工资等级

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, e.sal, s.grade from emp e, salgrade 
s where e.sal between s.losal and s.hisal; 

4 外连接

通过”(+)”符号实现外连接

左外连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, d.deptno, d.dname, d.loc 
from emp e, dept d 
where d.deptno=e.deptno(+); 

右外连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e.ename, d.deptno, d.dname, d.loc 
from emp e, dept d 
where e.deptno(+)=d.deptno; 

自连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select e1.empno, e1.ename, e2.empno, e2.ename 
from emp e1, emp e2 
where e1.mgr=e2.empno(+);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Java限制IP访问页面
最近遇到一个需求,一个只能内网访问的网站,需要限制ip访问。就是网站内的部分文章只有白名单内的ip才能打开。因为是静态化的网站,所有文章都是静态html页面。所以首先想到的就是直接js获取访问者ip然后再判断是否在白名单内,不在白名单内就到没有权限页面。
sunonzj
2022/06/21
3.8K0
哎,我早就料到你获取IP地址的姿势不对啦!
来源:https://blog.csdn.net/takeurhand/article/details/52512200
用户5224393
2019/10/10
3.3K2
Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)
在我上一篇文章《Spring Cloud开发人员如何解决服务冲突和实例乱窜?》中提到使用服务的元数据来实现隔离和路由,有朋友问到能不能直接通过IP来实现?本文就和大家一起来讨论一下这个问题
陶陶技术笔记
2020/06/02
6160
Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)
干货:Java正确获取客户端真实IP方法整理
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.abc.com/的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。 经过
Java技术栈
2018/04/02
4K0
干货:Java正确获取客户端真实IP方法整理
Java常用工具类之自定义访问对象
package com.wazn.learn.util; import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author yangzhenyu * */ public class CusAccessObjectUtil { /** * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120,
二十三年蝉
2018/02/28
8270
Java工具集-获取IP(IpUtils)
添加依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> 代码示例 package *; import javax.servlet.http.HttpServletRequest; import java.n
cwl_java
2019/10/26
2.8K0
快递鸟电子面单打印功能基于java
快递鸟电子面单API地址:http://www.kdniao.com/api-eorder
陈灬大灬海
2018/12/05
2.1K0
快递鸟电子面单打印功能基于java
Java获取操作系统名称 和 浏览器信息
业务需求需要记录用户登录时的信息:浏览器信息、IP地址、操作系统信息等,从网上查找了很多帖子,实现方式有两种,一种纯编码判断,一种是使用UserAgentUtils工具类。 注:经测试第一种方式获取浏览器名称时获取不到IE的信息,第二种是可以的。
一写代码就开心
2023/04/12
1.5K0
zuul实现IP白名单功能
主要利用Zuul的过滤器来实现该功能,其过滤器还可以用来实现统一的签名和验签服务以及其他任何你需要的服务,本例实现简单的IP过滤功能 新建IPFilter类,继承ZuulFilter,实现其方法
似水的流年
2019/12/05
3.4K0
java根据ip地址获取城市地域信息
java根据ip地址获取城市地域信息 这里提供两个公开的接口,一个是阿里的,一个是新浪的 http://ip.taobao.com/service/getIpInfo.php?ip=123.139.
用户2235302
2018/06/13
3.5K0
Nginx反向代理后获取用户真实IP地址
问题描述:nginx集群后无法获取用户真实的IP地址,得到的一直都是前端代理服务器。Nginx的地址有2台Nginx服务器,1台代理nacos集群,一台代理vue前端项目。在登录前端页面时一直无法获取到真实的用户IP地址,获取到的是代理前端服务器的地址解决方法:在代理的后端地址中加上如下代码: proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header
Reset
2022/12/19
1.6K0
nginx代理tomcat不能获取真实ip地址解决方法
本文介绍了nginx服务器代理tomcat系统时,不能获取真实ip地址的解决办法,有需要的朋友参考下。
拓荒者
2019/03/11
2K0
获取IP地址工具类
该工具类可以获取请求的ip地址 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; /** * @create: 2022/3/29 * @author: Tony Stark */ public class IpUtils { /** * 获取客户端IP * * @param reques
暴躁的程序猿
2022/04/08
2.3K0
Springboot&websocket实现IP数据实时统计
1、 使用websocket实时获取在线人数,并且对外提供服务 2.、新建redis表,用来存取每日最新全部访问数据(定时任务进行数据更新每天晚上3点将数据同步到MySQL,redis只用来存当天的访问数据) 3、需要获取访问者的IP等信息,然后新建一张表,对这些信息进行存储,对外提供最近访问的前100条数据 4、过滤重复IP的问题,暂时选择使用:redis使用hset结构记录数据,拿到Redis中的数据的count字段,如果为空就赋值为1,否则的话进行自增。websocket中使用 ConcurrentHashMap<String, Set<WebSocketServer>>数据结构存储(该数据每天晚上3点同步到数据库) 5、提供100条数据的策略:先从redis里查询数据,如果少于100条数据,则不够的从数据库里面取剩余需要的数据 6、判断用户是否在线:websoket主体类中,用户下线就remove对应ip的session,知道map中该ip的session全部移出后,就修改redis对应数据中status的状态值
不愿意做鱼的小鲸鱼
2022/09/26
1.6K0
Springboot&websocket实现IP数据实时统计
SpringBoot自定义拦截器实现IP白名单功能
SpringBoot自定义拦截器实现IP白名单功能 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8993331.html   首先,相关功能已经上线了,且先让
上帝
2018/05/18
6.7K0
springboot优雅的改进你的输出日志,让你快速的定位问题 超详细的初始化教程
一个好的项目,一定会输出很多的日志,来让开发者,快速的去定位一些问题。下面我将带来一些在springboot中,你可以选择做的初始化技巧。这些都是比较通用的,可以直接进行复制使用,所以我这里不做过多的讲解。
用户10143704
2024/04/13
2760
Java杂谈之获取客户端IP
获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了。
你呀不牛
2021/05/28
5K0
IP 工具类
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
收心
2022/11/16
3990
WebFilter过滤器,返回指定信息
import java.io.IOException; import java.util.HashSet; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.Servle
JQ实验室
2022/02/10
7710
杨校老师课堂之封装工具类【防止重复提交拦截器|全局异常处理器|获取IP及地址】
分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。
杨校
2022/09/23
3430
相关推荐
Java限制IP访问页面
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • SQL99多表连接查询
    • 1. cross join(交叉连接)
    • 2. natural join(自然连接)
    • 3. inner join(内连接)
    • 4. using 子句
    • 5. on 子句
    • 6. 外连接
      • 左外连接
      • 右外连接
      • 全外连接
      • 自连接
  • SQL92多表连接查询
    • 1 笛卡尔积
    • 2 等值连接
    • 3 非等值连接
    • 4 外连接
      • 左外连接
      • 右外连接
      • 自连接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档