数据库的内外链接和左右链接

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 数据库的内外链接和左右链接30

@[toc]

数据库连接

准备数据

  • 标题表(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
    * 
FROM
    title
    left JOIN article ON title.id = article.id

查询数据如下:

id name id text
1 孙中明 1 孙中明是一个公众号
2 公众号 2 公众号是一个平台
3 大数据 3 大数据是一个技术
4 数据库 null null

左连接

left joinleft outer join的缩写,所以作用是一样的。

left join + where B.column is null, 查出和两张表中没有关联的数据。


SELECT
    * 
FROM
    title
    left JOIN article ON title.id = article.id
    where article.id is null

查询数据如下:

id name id text
4 数据库

左连接

外连接之右连接(right join)

跟左连接相反,会以右表为驱动表。与左连恰恰相反,首先是右表数据全部罗列,然后有满足条件的左表数据都会全部罗列出。若两条左表数据对右表一条数据,则会用对应好的右表数据补足作为一条记录。

右连接


SELECT
    * 
FROM
    title
    right  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
    * 
FROM
    title
    left  JOIN article ON title.id = article.id
    
    union
    
    SELECT
    * 
FROM
    title
    right  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
    * 
FROM
    title
    left  JOIN article ON title.id = article.id
    
    where article.id is null
    
    union
    
    SELECT
    * 
FROM
    title
    right  JOIN article ON title.id = article.id
    where title.id is null
    

查询数据如下:

id name id text
4 数据库
5 Java 是一种语言

没有关系

交叉连接(cross join)

交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。

显式的交叉连接:A,B表记录的排列组合,即笛卡儿积。

将查询的结果和里那个一个表的结果相互匹配的组合。

select * from  school.student  stu
         cross join school.score
         order 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
    * 
FROM
    title
    CROSS JOIN article 
WHERE
    title.id = article.id 
ORDER BY
    title.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
    * 
FROM
    title

UNION

SELECT
    * 
FROM
    article
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),不消除重复行。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
6月前
|
druid Java 数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
326 0
|
6月前
|
关系型数据库 数据库 C++
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
|
5月前
|
SQL 安全 关系型数据库
sql数据库本地链接
在SQL数据库中,本地连接通常指的是在同一台计算机上运行的数据库客户端连接到该计算机上的数据库服务器。这种连接通常使用`localhost`或`127.0.0.1`(这是IPv4地址,代表本地回环地址
|
1月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
24 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
1月前
|
数据库连接 网络安全 数据库
网站链接数据库失败,重启网站好了
网站链接数据库失败,重启网站好了
|
1月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
177 10
|
1月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
|
1月前
|
Oracle Java 关系型数据库
使用DataGrip链接达梦数据库
使用DataGrip链接达梦数据库
54 0
|
3月前
|
监控 数据可视化 前端开发
基于python django生产数据与计划大屏,可链接数据库
本文介绍了一个基于Python Django框架开发的生产数据与计划大屏系统,该系统能够实时采集和展示生产数据,支持数据可视化和实时更新,以提高生产监控的效率和质量。
|
4月前
|
缓存 分布式计算 DataWorks
DataWorks操作报错合集之连接数据库时出现了通信链接失败的报错,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。