数据库的内外链接和左右链接
文章目录
- 数据库连接
- 准备数据
- 内连接(inner join)
- 外连接(outer join)
- 外连接之左连接(left join)
- 外连接之右连接(right join)
- 外连接之全外连接(full join )
- 交叉连接(cross join)
- UNION
- UNION ALL
数据库连接
准备数据
- 标题表(title)
DROP TABLE IF EXISTS `title`;
CREATE TABLE `title` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;INSERT INTO `title` VALUES (1,'孙中明'),(2,'公众号'),(3,'大数据'),(4,'数据库');
id | name |
---|---|
1 | 孙中明 |
2 | 公众号 |
3 | 大数据 |
4 | 数据库 |
- 内容表(article)
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (`id` int(11) NOT NULL AUTO_INCREMENT,`text` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;INSERT INTO `article` VALUES (1,'孙中明是一个公众号'),(2,'公众号是一个平台'),(3,'大数据是一个技术'),(5,'Java 是一种语言');
id | text |
---|---|
1 | 孙中明是一个公众号 |
2 | 公众号是一个平台 |
3 | 大数据是一个技术 |
5 | Java 是一种语言 |
内连接(inner join)
用比较运算符根据每个表共有的列的值匹配两个表中的行(=或>、<)也叫等值连接,得到的满足条件的A和B表内部的数据(必须两边都满足才查出)。
select * from article inner join title on title.id = article.id
id | text | id | name |
---|---|---|---|
1 | 孙中明是一个公众号 | 1 | 孙中明 |
2 | 公众号是一个平台 | 2 | 公众号 |
3 | 大数据是一个技术 | 3 | 大数据 |
这个是交集,4 和 5 没有对应的所以没有出来。
如果不添加 ON条件约束的话,取得的是表的笛卡尔积。在添加了ON条件约束后,获取的是同时符合ON条件的 A表和B表数据。
与
where
的区别,where
子句中过滤的条件记录都不会加入到最后的结果集;on
字句如果过滤的条件的数据任然会加入;被驱动的表没有的字段被当做null
和驱动表一起加入到结果集里面但是如果
on
自己放在内连接中那样的话就和where的作用是等价的。
外连接(outer join)
外连接之左连接(left join)
首先是左表数据全部罗列,然后有满足条件的右表数据都会全部罗列出。若两条右表数据对左表一条数据,则会用对应好的左表数据补足作为一条记录。
以左表为驱动表,取得左表全部的数据。
然后右表满足条件的数据会对应在左表数据后面,作为添加的外部行列出。
如果没有满足左表的数据,则会用NULL全部填充到外部行。
如果有多条满足左表数据,那么会用左表对应的数据补足,按行逐条对应右表数据。(也就是左表数据重复生成,右表的每条记录都生成一行,然后对应同一个左表数据)
SELECT*
FROMtitleleft JOIN article ON title.id = article.id
查询数据如下:
id | name | id | text |
---|---|---|---|
1 | 孙中明 | 1 | 孙中明是一个公众号 |
2 | 公众号 | 2 | 公众号是一个平台 |
3 | 大数据 | 3 | 大数据是一个技术 |
4 | 数据库 | null | null |
left join
是left outer join
的缩写,所以作用是一样的。
left join
+ where B.column is null
, 查出和两张表中没有关联的数据。
SELECT*
FROMtitleleft JOIN article ON title.id = article.idwhere article.id is null
查询数据如下:
id | name | id | text |
---|---|---|---|
4 | 数据库 |
外连接之右连接(right join)
跟左连接相反,会以右表为驱动表。与左连恰恰相反,首先是右表数据全部罗列,然后有满足条件的左表数据都会全部罗列出。若两条左表数据对右表一条数据,则会用对应好的右表数据补足作为一条记录。
SELECT*
FROMtitleright JOIN article ON title.id = article.id
查询数据如下:
id | name | id | text |
---|---|---|---|
1 | 孙中明 | 1 | 孙中明是一个公众号 |
2 | 公众号 | 2 | 公众号是一个平台 |
3 | 大数据 | 3 | 大数据是一个技术 |
5 | Java 是一种语言 |
外连接之全外连接(full join )
full join (mysql不支持,但是可以用 left join union right join代替)
SELECT*
FROMtitleleft JOIN article ON title.id = article.idunionSELECT*
FROMtitleright JOIN article ON title.id = article.id
id | name | id | text |
---|---|---|---|
1 | 孙中明 | 1 | 孙中明是一个公众号 |
2 | 公众号 | 2 | 公众号是一个平台 |
3 | 大数据 | 3 | 大数据是一个技术 |
4 | 数据库 | ||
5 | Java 是一种语言 |
因为只要满足 union上面的sql或者下面的sql一种情况就ok了。 如下我们可以升级,查询出两种表中没有关系的数据:
SELECT*
FROMtitleleft JOIN article ON title.id = article.idwhere article.id is nullunionSELECT*
FROMtitleright JOIN article ON title.id = article.idwhere title.id is null
查询数据如下:
id | name | id | text |
---|---|---|---|
4 | 数据库 | ||
5 | Java 是一种语言 |
交叉连接(cross join)
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。
显式的交叉连接:A,B表记录的排列组合,即笛卡儿积。
将查询的结果和里那个一个表的结果相互匹配的组合。
select * from school.student stucross join school.scoreorder by stu.id
id | name | id | text |
---|---|---|---|
1 | 孙中明 | 1 | 孙中明是一个公众号 |
1 | 孙中明 | 2 | 公众号是一个平台 |
1 | 孙中明 | 3 | 大数据是一个技术 |
1 | 孙中明 | 5 | Java 是一种语言 |
2 | 公众号 | 1 | 孙中明是一个公众号 |
2 | 公众号 | 2 | 公众号是一个平台 |
2 | 公众号 | 3 | 大数据是一个技术 |
2 | 公众号 | 5 | Java 是一种语言 |
3 | 大数据 | 1 | 孙中明是一个公众号 |
3 | 大数据 | 2 | 公众号是一个平台 |
3 | 大数据 | 3 | 大数据是一个技术 |
3 | 大数据 | 5 | Java 是一种语言 |
4 | 数据库 | 1 | 孙中明是一个公众号 |
4 | 数据库 | 2 | 公众号是一个平台 |
4 | 数据库 | 3 | 大数据是一个技术 |
4 | 数据库 | 5 | Java 是一种语言 |
可以看到, 左边的表4条数据, 每一条对应右边的4条数据, 4x4=16条数据。
SELECT*
FROMtitleCROSS JOIN article
WHEREtitle.id = article.id
ORDER BYtitle.id
转成内连接,查询如下数据:
id | text | id | name |
---|---|---|---|
1 | 孙中明是一个公众号 | 1 | 孙中明 |
2 | 公众号是一个平台 | 2 | 公众号 |
3 | 大数据是一个技术 | 3 | 大数据 |
UNION
超大型数据尽可能尽力不要写子查询,使用连接(JOIN)去替换它,使用联合(UNION)来代替手动创建的临时表。
UNION是会把结果排序,union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中(即把两次或多次查询结果合并起来。)。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用UNION作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数目要想同。
要求
两次查询的列数必须一致
推荐
列的类型可以不一样,但推荐查询的每一列,想对应的类型以一样
可以来自多张表的数据
多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。
如果不同的语句中取出的行,有完全相同(这里表示的是每个列的值都相同),那么union会将相同的行合并,最终只保留一行。也可以这样理解,union会去掉重复的行。如果不想去掉重复的行,可以使用union all。
如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选。
SELECT*
FROMtitleUNIONSELECT*
FROMarticle
id | name |
---|---|
1 | 孙中明 |
2 | 公众号 |
3 | 大数据 |
4 | 数据库 |
1 | 孙中明是一个公众号 |
2 | 公众号是一个平台 |
3 | 大数据是一个技术 |
5 | Java 是一种语言 |
1、UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名。
2、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
UNION ALL
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。
数据库的内外链接和左右链接相关推荐
- 主机屋 mysql 数据库名_主机屋php链接数据库
主机屋对于一个php初学者是一个不错的选择,在主机屋中可以实名注册后,可以拥有一个免费的域名空间和数据库,在主机屋中链接数据库和在本地链接数据库一样,通过$conn=mysql_connect(&qu ...
- SQL SERVER访问Access数据库,出现错误:无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象
SQL SERVER访问Access数据库,出现错误: 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4. ...
- sql怎么连接mysql数据库服务器_MSSQL数据库的跨库查询与链接服务器
各位小伙伴们,关于MSSQL的基本技能篇前面一共写了10篇,也基本上算是告一段落,接下来将开始介绍进阶技能篇.在构思这个进阶技能篇的时候,一直在考虑先写哪个,其实到看到这部分内容能理解的人,基本上对S ...
- 京东城市时空数据引擎JUST亮相中国数据库技术大会(附PPT链接)
受疫情影响,第十一届中国数据库技术大会(DTCC2020)从原定的5月份,推迟到了8月份,再推迟到了12月份.尽管如此,依然没有减退国人对数据库技术的热情.2020年12月21日-12月23日,北京国 ...
- SQL SERVER访问Access数据库,出现错误:无法初始化链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Jet.OLEDB.4.0 的数据源对象...
SQL SERVER访问Access数据库,出现错误: 无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4. ...
- 浅谈死链接和错误链接,如何防范死链接发生
最近我想我学了这么长时间的seo了,也该总结一下,每天一小总结,也作为自己的seo路程的一个总结.下面呢,我现在稍微介绍一下在seo概念性问题. 什么事死链接和错误链接,如何防范死链接发生? 死链接是 ...
- c++定义一个动态全局变量_静态链接与动态链接的宏观概述及微观详解
静态链接与动态链接的宏观概述及微观详解 第一部分 宏观概述 1. 静态链接 静态链接就是在程序运行前,链接器通过对象文件中包含的重定位表,完成所有重定位操作,并最终形成一个在运行时不需要再次进行依赖库 ...
- TCP 短链接 和 长链接
TCP短链接和长链接: 一.简介 TCP在真正的读写操作(数据传输)之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立通过三 ...
- 长URL链接转短链接算法
引言 很多大型网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责就是把原始链接很长的地址压缩成只有6 个 ...
- URL长链接转短链接
开始以为短链接是按照某种算法把原始链接压缩为短链接,再根据算法从短链接反算成原始链接的.后来尝试了下压缩算法(gzip 压缩算法),发现对于url 这种字符串越是压缩,长度就越长.通过对压缩算法的一些 ...
最新文章
- [JS]视频总结-第三部分_深入javascript
- Android 5.1上MultiDex异常: DexPathList NoSuchMethodException makeDexElements
- php svn up,php中执行svn update问题
- spring 的权限控制:security
- Struts的几个精细之处
- Visual Studio 支持 Java?谣言止于智者
- 车牌识别数据集_行人再识别数据集
- $_FILES['userfile']['error'] 错误码
- 当机器人具有自我知觉,并能自适应环境,真的不可怕吗?
- node主要应用场景是在大前端
- vim 安装_vim实战:插件安装(Vundle,NerdTree)
- 关于区块链通证模型,你想知道的都在这
- 30种EMC标准电路分享,再不收藏就晚了!
- DM数据库查询错误码
- 天网防火网的安装与使用
- GUI界面设计学渣笔记———使用PyQt做深度学习的可视化界面
- Python:实现random forest regressor随机森林回归器算法(附完整源码)
- python神经网络模型调用后预测值不变_用R语言实现神经网络预测股票实例
- 绝妙一招 教你如何拍出烟雾缥缈的作品
- 管理信息系统需求调研分析指南-软件工程-www.knowsky.com