GaussDB数据库SQL系列-表连接(JOIN)
目录
2、LEFT JOIN EXCLUDING INNER JOIN
4、LEFT JOIN EXCLUDING INNER JOIN
7、FULL OUTER JOIN EXCLUDING INNER JOIN
一、前言
SQL是用于数据分析和数据处理的最重要的编程语言之一,表连接(JOIN)是数据库中SQL的一种常见操作,在实际应用中,我们需要根据业务需求从两个或多个相关的表中获取信息。
二、GaussDB JOIN
GaussDB是华为推出的企业级分布式关系型数据库。GaussDB JOIN 子句是基于两个或者多个表之间的共同字段把它们进行结合。在GaussDB数据库中,常用的JOIN有如下几种连接及用法:INNER JOIN、LEFT JOIN、RIGHT JOIN、 FULL JOIN、CROSS JOIN。
1、LEFT JOIN
LEFT JOIN 一般称左连接,也写作 LEFT [OUTER] JOIN。左连接查询会返回左表中所有记录,且在右表中找到的关联数据列也会被一起返回。
--SQL示例 SELECT t1.column1 ,… ,t2.column1 ,… FROM table1 t1 LEFT JOIN table2 t2 ON t1.id=t2.id ;
2、LEFT JOIN EXCLUDING INNER JOIN
返回左表有但右表没有关联数据的记录集。
--SQL示例 SELECT t1.column1 ,… ,t2.column1 ,… FROM table1 t1 LEFT JOIN table2 t2 ON t1.id=t2.id WHERE t2.id IS NULL ;
3、RIGHT JOIN
RIGHT JOIN 一般称右连接,也写作 RIGHT [OUTER] JOIN。右连接查询会返回右表中所有记录,且在左表中找到的关联数据列也会被一起返回。
--SQL示例 SELECT t1.column1 ,… ,t2.column1 ,… FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id=t2.id
4、LEFT JOIN EXCLUDING INNER JOIN
返回右表有但左表没有关联数据的记录集。
--SQL示例 SELECT t1.column1 ,… ,t2.column1 ,… FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id=t2.id WHERE t1.id IS NULL ;
5、INNER JOIN
INNER JOIN 一般被译作内连接。获取左表和右表中能关联起来的数据。
--SQL示例 SELECT t1.column1 ,… ,t2.column1 ,… FROM table1 t1 INNER JOIN table2 t2 ON t1.id=t2.id ;
6、FULL OUTER JOIN
FULL [OUTER] JOIN 一般称外连接、全连接,实际查询语句中可以写作FULL JOIN。外连接查询能返回左右表里的所有记录。
--SQL示例 SELECT t1.column1 ,… ,t2.column1 ,… FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.id=t2.id ;
7、FULL OUTER JOIN EXCLUDING INNER JOIN
返回左表和右表里没有相互关联的记录集。
--SQL示例 SELECT t1.column1 ,… ,t2.column1 ,… FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.id=t2.id WHERE t1.id IS NULL OR t2.id IS NULL ;
除以上几种外,另有 CROSS JOIN(迪卡尔集),但此用法不常用,可做拓展研究。
三、GaussDB 实验示例
创建两张实验表:Students(学生表)和Score(学生成绩表)。
1、初始化实验表
1)Students(学生表):
--学生表,Students(SNO, SNAME)代表 (学号,姓名) DROP TABLE students; CREATE TABLE students( sno INTEGER NOT NULL, sname varchar(32) ); --插入数据 INSERT INTO students(sno,sname) VALUES (1001,'张三'); INSERT INTO students(sno,sname) VALUES (1002,'李四'); INSERT INTO students(sno,sname) VALUES (1003,'王五'); INSERT INTO students(sno,sname) VALUES (1004,'赵六'); INSERT INTO students(sno,sname) VALUES (1005,'韩梅'); INSERT INTO students(sno,sname) VALUES (1006,'李雷'); --查看表信息 SELECT * FROM students;
2)Score(学生成绩表):
--学生成绩表,Score(SNO, SCGRADE) 代表(学号,成绩) DROP TABLE score; CREATE TABLE score( sno INTEGER NOT NULL, scgrade DECIMAL(3,1) ); --插入数据 INSERT INTO score(sno,scgrade)values(1001,98); INSERT INTO score(sno,scgrade)values(1002,95); INSERT INTO score(sno,scgrade)values(1003,97); INSERT INTO score(sno,scgrade)values(1004,99); --查看表信息 SELECT * FROM score;
2、LEFT JOIN(示例)
--表students为主表 SELECT t1.sno ,t1.sname ,t2.sno ,t2.scgrade FROM students t1 LEFT JOIN score t2 ON t1.sno=t2.sno
3、RIGTH JOIN(示例)
--表score 为主表 SELECT t1.sno ,t1.sname ,t2.sno ,t2.scgrade FROM students t1 RIGHT JOIN score t2 ON t1.sno=t2.sno
4、INNER JOIN(示例)
--根据字段sno获取两个表中都有的数据 SELECT t1.sno ,t1.sname ,t2.sno ,t2.scgrade FROM students t1 INNER JOIN score t2 ON t1.sno=t2.sno
5、FULL JOIN(示例)
--获取左右表里的所有记录。 SELECT t1.sno ,t1.sname ,t2.sno ,t2.scgrade FROM students t1 FULL JOIN score t2 ON t1.sno=t2.sno
四、小结
数据库表连接(Join)是将两个或多个表中的数据根据一定的条件进行组合,在实际应用中,数据库表连接可以帮助我们快速地获取所需的数据信息,提高数据处理效率。需要注意的是,不同的数据库系统对表连接的支持程度可能存在差异,需要根据具体的数据库类型选择合适的连接方式。(本文是以GaussDB云数据库为实验平台)
——结束

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Apache DolphinScheduler 支持使用 OceanBase 作为元数据库啦!
DolphinScheduler是一个开源的分布式任务调度系统,拥有分布式架构、多任务类型、可视化操作、分布式调度和高可用等特性,适用于大规模分布式任务调度的场景。目前DolphinScheduler支持的元数据库有Mysql、PostgreSQL、H2,如果在业务中需要更好的性能和扩展性,可以在DolphinScheduler中使用OceanBase数据库作为元数据库进行替换。节点数量和规模可以自由调整,实现无缝扩展和缩减。 一. OceanBase数据库 OceanBase数据库是阿里巴巴自主研发的分布式关系型数据库,具有以下特点: 分布式架构:OceanBase采用分布式架构,可水平扩展,支持PB级别的数据存储和处理。 高可用性:OceanBase采用分布式副本机制,实现数据的冗余备份,保证在节点故障时仍能提供可用的服务。 高性能:OceanBase采用多维度优化技术,包括数据存储、查询优化、分布式事务等方面,可大幅提升数据库的性能。 强一致性:OceanBase采用基于Paxos协议的多副本一致性算法,实现强一致性的分布式事务处理。 兼容SQL:OceanBase支持标准的SQ...
- 下一篇
React请求机制优化思路 | 京东云技术团队
说起数据加载的机制,有一个绕不开的话题就是前端性能,很多电商门户的首页其实都会做一些垂直的定制优化,比如让请求在页面最早加载,或者在前一个页面就进行预加载等等。随着react18的发布,请求机制这一块也是被不断谈起,并且在后续其实也给出了明确的方向。 假如我们页面中有三个组件C1、C2、C3依次嵌套,每个组件中有对应的请求F1、F2、F3,通常大多数人会使用useeffect和state变量来实现数据流的获取,这样就意味着必须在组件加载时才能发起请求,所有数据获取都发生在组件的生命周期中,如下图所示,我们可以将这种获取数据的方式称作瀑布流渲染,但是这种方式有一个问题是,在这种方法中,组件之间的数据获取是按顺序进行的,这实际上意味着它们彼此阻塞,如果组件的层级嵌套很深的话,就会导致页面的加载时间特别长。 为了阻止组件间数据获取的这种顺序阻塞,另一种方法就是在组件加载前可以使用Promise.all获取所有的请求数据,这样在组件加载时就已经获取到所有的数据了。这种方式解决了组件加载顺序阻塞彼此数据流获取的问题,但是也产生了一个新的问题,在请求完成之前页面都会是空白的。 基于第二种先请求后渲...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池