[GBase 8s 教程]GBase 8s 连接(JOIN)
GBase 8s JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
在 GBase 8s 中,JOIN 有五种连接类型:
- CROSS JOIN :交叉连接
- INNER JOIN:内连接
- LEFT OUTER JOIN:左外连接
- RIGHT OUTER JOIN:右外连接
- FULL OUTER JOIN:全外连接
接下来让我们创建两张表 COMPANY 和 DEPARTMENT。
实例
创建 COMPANY 表 ,数据内容如下:
DROP TABLE IF EXISTS COMPANY;
CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME VARCHAR(40) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY DECIMAL(10,2),
JOIN_DATE DATE DEFAULT TODAY
);
INSERT INTO COMPANY VALUES (0, '李雷', 37, '北京', 20000.00,'2005-05-13');
INSERT INTO COMPANY VALUES (0, '韩梅梅', 35, '天津', 16000.00, '2007-12-18');
INSERT INTO COMPANY VALUES (0, '林涛', 36, '上海', 25000.00, '2006-01-04');
INSERT INTO COMPANY VALUES (0, '魏华', 36, '西安', 15000.00, '2007-08-30');
INSERT INTO COMPANY VALUES (0, '露茜', 34, '伦敦', 22000.00, '2008-08-08');
INSERT INTO COMPANY VALUES (0, '莉莉', 34, '伦敦', 22000.00, '2008-08-08');
INSERT INTO COMPANY VALUES (0, '吉姆', 35, '华盛顿', 16000.00, '2010-12-13');
INSERT INTO COMPANY VALUES (0, '汤姆', 36, '渥太华', 21000.00, '2010-04-30');
此时,COMPANY 表的记录如下:
id | name | age | address | salary | join_date |
---|---|---|---|---|---|
1 | 李雷 | 37 | 北京 | 20000.00 | 2005-05-13 |
2 | 韩梅梅 | 35 | 天津 | 16000.00 | 2007-12-18 |
3 | 林涛 | 36 | 上海 | 25000.00 | 2006-01-04 |
4 | 魏华 | 36 | 西安 | 15000.00 | 2007-08-30 |
5 | 露茜 | 34 | 伦敦 | 22000.00 | 2008-08-08 |
6 | 莉莉 | 34 | 伦敦 | 22000.00 | 2008-08-08 |
7 | 吉姆 | 35 | 华盛顿 | 16000.00 | 2010-12-13 |
8 | 汤姆 | 36 | 渥太华 | 21000.00 | 2010-04-30 |
创建一张 DEPARTMENT 表,添加三个字段:
DROP TABLE IF EXISTS DEPARTMENT;
CREATE TABLE DEPARTMENT (
ID SERIAL PRIMARY KEY,
DEPT CHAR(50) NOT NULL,
EMP_ID INT references COMPANY(ID)
);
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (0, '研发部', 1 );
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (0, '市场部', 5 );
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (0, '人力资源部', 2);
此时,DEPARTMENT 表的记录如下:
id | dept | emp_id |
---|---|---|
1 | 研发部 | 1 |
2 | 市场部 | 5 |
3 | 人力资源部 | 2 |
交叉连接
交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。
由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
下面是 CROSS JOIN 的基础语法:
SELECT ... FROM table1 CROSS JOIN table2 ...
基于上面的表,我们可以写一个交叉连接(CROSS JOIN),如下所示:
select * from company cross join department;
得到结果如下:
id | name | age | address | salary | join_date | id | dept | emp_id |
---|---|---|---|---|---|---|---|---|
1 | 李雷 | 37 | 北京 | 20000.00 | 2005-05-13 | 1 | 研发部 | 1 |
2 | 韩梅梅 | 35 | 天津 | 16000.00 | 2007-12-18 | 1 | 研发部 | 1 |
3 | 林涛 | 36 | 上海 | 25000.00 | 2006-01-04 | 1 | 研发部 | 1 |
4 | 魏华 | 36 | 西安 | 15000.00 | 2007-08-30 | 1 | 研发部 | 1 |
5 | 露茜 | 34 | 伦敦 | 22000.00 | 2008-08-08 | 1 | 研发部 | 1 |
6 | 莉莉 | 34 | 伦敦 | 22000.00 | 2008-08-08 | 1 | 研发部 | 1 |
7 | 吉姆 | 35 | 华盛顿 | 16000.00 | 2010-12-13 | 1 | 研发部 | 1 |
8 | 汤姆 | 36 | 渥太华 | 21000.00 | 2010-04-30 | 1 | 研发部 | 1 |
1 | 李雷 | 37 | 北京 | 20000.00 | 2005-05-13 | 2 | 市场部 | 5 |
2 | 韩梅梅 | 35 | 天津 | 16000.00 | 2007-12-18 | 2 | 市场部 | 5 |
3 | 林涛 | 36 | 上海 | 25000.00 | 2006-01-04 | 2 | 市场部 | 5 |
4 | 魏华 | 36 | 西安 | 15000.00 | 2007-08-30 | 2 | 市场部 | 5 |
5 | 露茜 | 34 | 伦敦 | 22000.00 | 2008-08-08 | 2 | 市场部 | 5 |
6 | 莉莉 | 34 | 伦敦 | 22000.00 | 2008-08-08 | 2 | 市场部 | 5 |
7 | 吉姆 | 35 | 华盛顿 | 16000.00 | 2010-12-13 | 2 | 市场部 | 5 |
8 | 汤姆 | 36 | 渥太华 | 21000.00 | 2010-04-30 | 2 | 市场部 | 5 |
1 | 李雷 | 37 | 北京 | 20000.00 | 2005-05-13 | 3 | 人力资源部 | 2 |
2 | 韩梅梅 | 35 | 天津 | 16000.00 | 2007-12-18 | 3 | 人力资源部 | 2 |
3 | 林涛 | 36 | 上海 | 25000.00 | 2006-01-04 | 3 | 人力资源部 | 2 |
4 | 魏华 | 36 | 西安 | 15000.00 | 2007-08-30 | 3 | 人力资源部 | 2 |
5 | 露茜 | 34 | 伦敦 | 22000.00 | 2008-08-08 | 3 | 人力资源部 | 2 |
6 | 莉莉 | 34 | 伦敦 | 22000.00 | 2008-08-08 | 3 | 人力资源部 | 2 |
7 | 吉姆 | 35 | 华盛顿 | 16000.00 | 2010-12-13 | 3 | 人力资源部 | 2 |
8 | 汤姆 | 36 | 渥太华 | 21000.00 | 2010-04-30 | 3 | 人力资源部 | 2 |
内连接
内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。
当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。
内连接(INNER JOIN)是最常见的连接类型,是默认的连接类型。
INNER 关键字是可选的。
下面是内连接(INNER JOIN)的语法:
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
基于上面的表,我们可以写一个内连接,如下所示:
SELECT EMP_ID, NAME, DEPT
FROM COMPANY
INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
得到结果如下:
emp_id | name | dept |
---|---|---|
1 | 李雷 | 研发部 |
5 | 露茜 | 市场部 |
2 | 韩梅梅 | 人力资源部 |
左外连接
外部连接是内部连接的扩展。SQL 标准定义了三种类型的外部连接: LEFT、RIGHT 和 FULL, GBase 8s 支持所有这些。
对于左外连接,首先执行一个内连接。然后,对于表 T1 中不满足表 T2 中连接条件的每一行,其中 T2 的列中有 null 值也会添加一个连接行。因此,连接的表在 T1 中每一行至少有一行。
下面是左外连接( LEFT OUTER JOIN )的基础语法:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
基于上面两张表,我们可以写个左外连接,如下:
SELECT EMP_ID, NAME, DEPT
FROM COMPANY
LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
得到结果如下:
emp_id | name | dept |
---|---|---|
1 | 李雷 | 研发部 |
2 | 韩梅梅 | 人力资源部 |
林涛 | ||
魏华 | ||
5 | 露茜 | 市场部 |
莉莉 | ||
吉姆 | ||
汤姆 |
右外连接
首先,执行内部连接。然后,对于表T2中不满足表T1中连接条件的每一行,其中T1列中的值为空也会添加一个连接行。这与左联接相反;对于T2中的每一行,结果表总是有一行。
下面是右外连接( RIGHT OUT JOIN)的基本语法:
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
基于上面两张表,我们建立一个右外连接:
SELECT EMP_ID, NAME, DEPT
FROM COMPANY
RIGHT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
得到结果如下:
emp_id | name | dept |
---|---|---|
1 | 李雷 | 研发部 |
5 | 露茜 | 市场部 |
2 | 韩梅梅 | 人力资源部 |
外连接
首先,执行内部连接。然后,对于表 T1 中不满足表 T2 中任何行连接条件的每一行,如果 T2 的列中有 null 值也会添加一个到结果中。此外,对于 T2 中不满足与 T1 中的任何行连接条件的每一行,将会添加 T1 列中包含 null 值的到结果中。
下面是外连接的基本语法:
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
基于上面两张表,可以建立一个外连接:
SELECT EMP_ID, NAME, DEPT
FROM COMPANY
FULL OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
得到结果如下:
emp_id | name | dept |
---|---|---|
1 | 李雷 | 研发部 |
2 | 韩梅梅 | 人力资源部 |
林涛 | ||
魏华 | ||
5 | 露茜 | 市场部 |
莉莉 | ||
吉姆 | ||
汤姆 |
上一篇: 初唐四杰都有谁?他们到底多有才
下一篇: php插入排序法实现数组排序实例