目录
2、LEFT JOIN EXCLUDING INNER JOIN
4、LEFT JOIN EXCLUDING INNER JOIN
7、FULL OUTER JOIN EXCLUDING INNER JOIN
SQL是用于数据分析和数据处理的最重要的编程语言之一,表连接(JOIN)是数据库中SQL的一种常见操作,在实际应用中,我们需要根据业务需求从两个或多个相关的表中获取信息。
GaussDB是华为推出的企业级分布式关系型数据库。GaussDB JOIN 子句是基于两个或者多个表之间的共同字段把它们进行结合。在GaussDB数据库中,常用的JOIN有如下几种连接及用法:INNER JOIN、LEFT JOIN、RIGHT JOIN、 FULL JOIN、CROSS JOIN。
LEFT JOIN 一般称左连接,也写作 LEFT [OUTER] JOIN。左连接查询会返回左表中所有记录,且在右表中找到的关联数据列也会被一起返回。
- --SQL示例
- SELECT t1.column1
- ,…
- ,t2.column1
- ,…
- FROM table1 t1
- LEFT JOIN table2 t2
- ON t1.id=t2.id ;
返回左表有但右表没有关联数据的记录集。
- --SQL示例
- SELECT t1.column1
- ,…
- ,t2.column1
- ,…
- FROM table1 t1
- LEFT JOIN table2 t2
- ON t1.id=t2.id
- WHERE t2.id IS NULL ;
RIGHT JOIN 一般称右连接,也写作 RIGHT [OUTER] JOIN。右连接查询会返回右表中所有记录,且在左表中找到的关联数据列也会被一起返回。
- --SQL示例
- SELECT t1.column1
- ,…
- ,t2.column1
- ,…
- FROM table1 t1
- RIGHT JOIN table2 t2
- ON t1.id=t2.id
返回右表有但左表没有关联数据的记录集。
- --SQL示例
- SELECT t1.column1
- ,…
- ,t2.column1
- ,…
- FROM table1 t1
- RIGHT JOIN table2 t2
- ON t1.id=t2.id
- WHERE t1.id IS NULL ;
INNER JOIN 一般被译作内连接。获取左表和右表中能关联起来的数据。
- --SQL示例
- SELECT t1.column1
- ,…
- ,t2.column1
- ,…
- FROM table1 t1
- INNER JOIN table2 t2
- ON t1.id=t2.id ;
FULL [OUTER] JOIN 一般称外连接、全连接,实际查询语句中可以写作FULL JOIN。外连接查询能返回左右表里的所有记录。
- --SQL示例
- SELECT t1.column1
- ,…
- ,t2.column1
- ,…
- FROM table1 t1
- FULL OUTER JOIN table2 t2
- ON t1.id=t2.id ;
返回左表和右表里没有相互关联的记录集。
- --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(迪卡尔集),但此用法不常用,可做拓展研究。
创建两张实验表:Students(学生表)和Score(学生成绩表)。
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;
- --表students为主表
- SELECT t1.sno
- ,t1.sname
- ,t2.sno
- ,t2.scgrade
- FROM students t1
- LEFT JOIN score t2
- ON t1.sno=t2.sno
- --表score 为主表
- SELECT t1.sno
- ,t1.sname
- ,t2.sno
- ,t2.scgrade
- FROM students t1
- RIGHT JOIN score t2
- ON t1.sno=t2.sno
- --根据字段sno获取两个表中都有的数据
- SELECT t1.sno
- ,t1.sname
- ,t2.sno
- ,t2.scgrade
- FROM students t1
- INNER JOIN score t2
- ON t1.sno=t2.sno
- --获取左右表里的所有记录。
- SELECT t1.sno
- ,t1.sname
- ,t2.sno
- ,t2.scgrade
- FROM students t1
- FULL JOIN score t2
- ON t1.sno=t2.sno
数据库表连接(Join)是将两个或多个表中的数据根据一定的条件进行组合,在实际应用中,数据库表连接可以帮助我们快速地获取所需的数据信息,提高数据处理效率。需要注意的是,不同的数据库系统对表连接的支持程度可能存在差异,需要根据具体的数据库类型选择合适的连接方式。(本文是以GaussDB云数据库为实验平台)
——结束