当前位置:   article > 正文

PgSQL——学习笔记11: 连接(JOIN)_pgsql join

pgsql join

目录

连接(JOIN)

交叉连接(CROSS JOIN)

内连接(INNER JOIN)

左外连接( LEFT OUTER JOIN )

右外连接( RIGHT OUTER JOIN)

外连接( FULL OUTER JOIN)


连接(JOIN)

PostgreSQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

在 PostgreSQL 中,JOIN 有五种连接类型:

  • CROSS JOIN :交叉连接
  • INNER JOIN:内连接
  • LEFT OUTER JOIN:左外连接
  • RIGHT OUTER JOIN:右外连接
  • FULL OUTER JOIN:全外连接

练习JOIN前准备:

  1. postgres=# \c mydb;
  2. 您现在已经连接到数据库 "mydb",用户 "postgres".
  3. mydb=# \d
  4. 关联列表
  5. 架构模式 | 名称 | 类型 | 拥有者
  6. ----------+----------+--------+----------
  7. public | company | 数据表 | postgres
  8. public | company1 | 数据表 | postgres
  9. public | company2 | 数据表 | postgres
  10. (3 行记录)
  11. mydb=# select * from company;
  12. id | name | age | address | salary | join_date
  13. ----+-------+-----+----------------------------------------------------+--------+-----------
  14. 1 | Paul | 32 | California | 20000 |
  15. 2 | Allen | 25 | Texas | 15000 |
  16. 3 | Teddy | 23 | Norway | 20000 |
  17. 4 | Mark | 25 | Rich-Mond | 65000 |
  18. 5 | David | 27 | South-Hall | 85000 |
  19. 6 | Kim | 22 | South-Hall | 45000 |
  20. 7 | James | 24 | Houston | 1000 |
  21. 8 | Paul | 24 | Houston | 20000 |
  22. 9 | James | 44 | Norway | 5000 |
  23. 10 | James | 45 | Texas | 5000 |
  24. (10 行记录)
  25. /*创建表DEPARTMENT。*/
  26. mydb=# CREATE TABLE DEPARTMENT(
  27. mydb(# ID INT PRIMARY KEY NOT NULL,
  28. mydb(# DEPT CHAR(50) NOT NULL,
  29. mydb(# EMP_ID INT NOT NULL
  30. mydb(# );
  31. CREATE TABLE
  32. mydb=# select * from department;
  33. id | dept | emp_id
  34. ----+------+--------
  35. (0 行记录)
  36. /*往表里添加几条数据:*/
  37. mydb=# INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (1, 'IT Billing', 1 ),(2, 'Engineering', 2 ),(3, 'Finance', 7 );
  38. INSERT 0 3
  39. mydb=# select * from department;
  40. id | dept | emp_id
  41. ----+----------------------------------------------------+--------
  42. 1 | IT Billing | 1
  43. 2 | Engineering | 2
  44. 3 | Finance | 7
  45. (3 行记录)

交叉连接(CROSS JOIN)

交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。

如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。

由于交叉连接有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。

  1. /*下面是 CROSS JOIN 的基础语法:*/
  2. SELECT ...
  3. FROM table1
  4. CROSS JOIN table2;

实例: 

  1. /*基于上面的表,我们可以写一个交叉连接(CROSS JOIN),如下所示:*/
  2. mydb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
  3. emp_id | name | dept
  4. --------+-------+----------------------------------------------------
  5. 1 | Paul | IT Billing
  6. 2 | Paul | Engineering
  7. 7 | Paul | Finance
  8. 1 | Allen | IT Billing
  9. 2 | Allen | Engineering
  10. 7 | Allen | Finance
  11. 1 | Teddy | IT Billing
  12. 2 | Teddy | Engineering
  13. 7 | Teddy | Finance
  14. 1 | Mark | IT Billing
  15. 2 | Mark | Engineering
  16. 7 | Mark | Finance
  17. 1 | David | IT Billing
  18. 2 | David | Engineering
  19. 7 | David | Finance
  20. 1 | Kim | IT Billing
  21. 2 | Kim | Engineering
  22. 7 | Kim | Finance
  23. 1 | James | IT Billing
  24. 2 | James | Engineering
  25. 7 | James | Finance
  26. 1 | Paul | IT Billing
  27. 2 | Paul | Engineering
  28. 7 | Paul | Finance
  29. 1 | James | IT Billing
  30. 2 | James | Engineering
  31. 7 | James | Finance
  32. 1 | James | IT Billing
  33. 2 | James | Engineering
  34. 7 | James | Finance
  35. (30 行记录)

内连接(INNER JOIN)

内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。

当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。

内连接是最常见的连接类型,是默认的连接类型。

INNER 关键字是可选的。

  1. /*下面是内连接(INNER JOIN)的语法:*/
  2. SELECT table1.column1, table2.column2...
  3. FROM table1
  4. INNER JOIN table2
  5. ON table1.common_filed = table2.common_field;

实例: 

  1. /*基于上面的表,我们可以写一个内连接,如下所示:*/
  2. mydb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
  3. emp_id | name | dept
  4. --------+-------+----------------------------------------------------
  5. 1 | Paul | IT Billing
  6. 2 | Allen | Engineering
  7. 7 | James | Finance
  8. (3 行记录)

左外连接( LEFT OUTER JOIN )

外部连接是内部连接的扩展。

SQL 标准定义了三种类型的外部连接: LEFT、RIGHT 和 FULL, PostgreSQL 支持所有这些。

对于左外连接,首先执行一个内连接。

然后,对于表 T1 中不满足表 T2 中连接条件的每一行,其中 T2 的列中有 null 值也会添加一个连接行。因此,连接的表在 T1 中每一行至少有一行。

  1. /*下面是左外连接( LEFT OUTER JOIN )的基础语法:*/
  2. SELECT ...
  3. FROM table1 LEFT
  4. OUTER JOIN table2
  5. ON conditional_expression ...

实例: 

  1. /*基于上面两张表,我们可以写个左外连接,如下:*/
  2. mydb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
  3. emp_id | name | dept
  4. --------+-------+----------------------------------------------------
  5. 1 | Paul | IT Billing
  6. 2 | Allen | Engineering
  7. 7 | James | Finance
  8. | James |
  9. | David |
  10. | Paul |
  11. | Kim |
  12. | Mark |
  13. | Teddy |
  14. | James |
  15. (10 行记录)

右外连接( RIGHT OUTER JOIN)

首先,执行内部连接。

然后,对于表T2中不满足表T1中连接条件的每一行,其中T1列中的值为空也会添加一个连接行。这与左联接相反;对于T2中的每一行,结果表总是有一行。

  1. /*下面是右外连接( RIGHT OUT JOIN)的基本语法:*/
  2. SELECT ...
  3. FROM table1
  4. RIGHT OUTER JOIN table2
  5. ON conditional_expression ...

实例: 

  1. /*基于上面两张表,我们建立一个右外连接:*/
  2. mydb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
  3. emp_id | name | dept
  4. --------+-------+----------------------------------------------------
  5. 1 | Paul | IT Billing
  6. 2 | Allen | Engineering
  7. 7 | James | Finance
  8. (3 行记录)
  9. mydb=# INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (4,'lili',15);
  10. INSERT 0 1
  11. mydb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
  12. emp_id | name | dept
  13. --------+-------+----------------------------------------------------
  14. 1 | Paul | IT Billing
  15. 2 | Allen | Engineering
  16. 7 | James | Finance
  17. 15 | | lili
  18. (4 行记录)

外连接( FULL OUTER JOIN)

首先,执行内部连接。

然后,对于表 T1 中不满足表 T2 中任何行连接条件的每一行,如果 T2 的列中有 null 值也会添加一个到结果中。

此外,对于 T2 中不满足与 T1 中的任何行连接条件的每一行,将会添加 T1 列中包含 null 值的到结果中。

  1. /*下面是外连接的基本语法:*/
  2. SELECT ...
  3. FROM table1
  4. FULL OUTER JOIN table2
  5. ON conditional_expression ...

实例: 

  1. /*基于上面两张表,可以建立一个外连接:*/
  2. mydb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
  3. emp_id | name | dept
  4. --------+-------+----------------------------------------------------
  5. 1 | Paul | IT Billing
  6. 2 | Allen | Engineering
  7. 7 | James | Finance
  8. 15 | | lili
  9. | James |
  10. | David |
  11. | Paul |
  12. | Kim |
  13. | Mark |
  14. | Teddy |
  15. | James |
  16. (11 行记录)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/437563
推荐阅读
  

闽ICP备14008679号