首页 > 数据库 >无涯教程-PostgreSQL - Joins(连接语句)

无涯教程-PostgreSQL - Joins(连接语句)

时间:2023-12-24 23:02:30浏览次数:30  
标签:JOIN 无涯 Joins DEPARTMENT PostgreSQL Paul 联接 OUTER ID

PostgreSQL Joins 子句用于合并数据库中两个或多个表中的记录, JOIN是一种通过使用每个表的公用值来组合两个表中的字段的方法。

PostgreSQL中的联接类型是-

  • CROSS JOIN
  • INNER JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

在继续之前,让无涯教程考虑两个表,COMPANY和DEPARTMENT,无涯教程已经看到了INSERT语句来填充COMPANY表,所以让无涯教程假设COMPANY表中可用的记录列表-

 id | name  | age | address   | salary | join_date
----+-------+-----+-----------+--------+-----------
  1 | Paul  |  32 | California|  20000 | 2001-07-13
  3 | Teddy |  23 | Norway    |  20000 |
  4 | Mark  |  25 | Rich-Mond |  65000 | 2007-12-13
  5 | David |  27 | Texas     |  85000 | 2007-12-13
  2 | Learnfk |  25 | Texas     |        | 2007-12-13
  8 | Paul  |  24 | Houston   |  20000 | 2005-07-13
  9 | James |  44 | Norway    |   5000 | 2005-07-13
 10 | James |  45 | Texas     |   5000 | 2005-07-13

另一个表是DEPARTMENT,具有以下定义-

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

这是用于填充DEPARTMENT表的INSERT语句的列表-

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

最后,无涯教程在DEPARTMENT表中有以下记录列表可用-

 id | dept        | emp_id
----+-------------+--------
  1 | IT Billing  |  1
  2 | Engineering |  2
  3 | Finance     |  7

CROSS JOIN 联接

CROSS JOIN将第一个表的每一行与第二个表的每一行匹配,如果输入表分别具有x和y列,则输出表将具有x + y列。由于CROSS JOINs可能会生成非常大的表,因此必须注意仅在适当的时候使用它们。

以下是CROSS JOIN的语法-

SELECT ... FROM table1 CROSS JOIN table2 ...

根据上表,无涯教程可以编写一个CROSS JOIN,如下所示:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

上面给出的查询将产生以下输出-

emp_id| name  |  dept
------|-------|--------------
    1 | Paul  | IT Billing
    1 | Teddy | IT Billing
    1 | Mark  | IT Billing
    1 | David | IT Billing
    1 | Learnfk | IT Billing
    1 | Paul  | IT Billing
    1 | James | IT Billing
    1 | James | IT Billing
    2 | Paul  | Engineering
    2 | Teddy | Engineering
    2 | Mark  | Engineering
    2 | David | Engineering
    2 | Learnfk | Engineering
    2 | Paul  | Engineering
    2 | James | Engineering
    2 | James | Engineering
    7 | Paul  | Finance
    7 | Teddy | Finance
    7 | Mark  | Finance
    7 | David | Finance
    7 | Learnfk | Finance
    7 | Paul  | Finance
    7 | James | Finance
    7 | James | Finance

INNER JOIN 联接

INNER JOIN通过基于连接断言组合两个表(table1和table2)的列值来创建新的输出表,该查询将table1的每一行与table2的每一行进行比较,以找到满足联接断言的所有行对,当满足连接断言时,table1和table2的每对匹配的行对的列值将合并为输出行。

INNER JOIN是最常见的联接类型,也是默认的联接类型,您可以选择使用INNER关键字。

以下是INNER JOIN的语法-

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;

根据上表,无涯教程可以编写一个INNER JOIN,如下所示:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下输出-

 emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Learnfk | Engineering

LEFT OUTER JOIN 联接

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

如果是LEFT OUTER JOIN,则首先执行内部联接,然后,对于不满足与表T2中任何行的联接条件的表T1中的每一行,将在T2的列中添加具有空值的联接行。因此,对于T1中的每一行,联接表始终至少具有一行。

以下是LEFT OUTER JOIN的语法-

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

基于上表,无涯教程可以编写一个内部联接,如下所示:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下输出-

 emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Learnfk | Engineering
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |

RIGHT OUTER JOIN 联接

首先,执行内部联接,然后,对于表T2中不满足与表T1中任何行的连接中的每一行,将在T1列中添加具有空值,输出表在T2中的每一行将始终有一行。

以下是RIGHT OUTER JOIN的语法-

SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...

基于上表,无涯教程可以编写一个内部联接,如下所示:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下输出-

 emp_id | name  | dept
--------+-------+--------
      1 | Paul  | IT Billing
      2 | Learnfk | Engineering
      7 |       | Finance

FULL OUTER JOIN 联接

首先,执行内部联接,然后,对于不满足与表T2中任何行的联接条件的表T1中的每一行,将在T2的列中添加具有空值,另外,对于不满足与T1中任何行的联接条件的T2的每一行,将在T1列中添加具有空值的联接行。

以下是FULL OUTER JOIN的语法-

SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

基于上表,无涯教程可以编写一个内部联接,如下所示:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下输出-

 emp_id | name  | dept
--------+-------+---------------
      1 | Paul  | IT Billing
      2 | Learnfk | Engineering
      7 |       | Finance
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |

参考链接

https://www.learnfk.com/postgresql/postgresql-using-joins.html

标签:JOIN,无涯,Joins,DEPARTMENT,PostgreSQL,Paul,联接,OUTER,ID
From: https://blog.51cto.com/u_14033984/8957354

相关文章

  • 无涯教程-PostgreSQL - 约束条件
    约束是对表的数据列强制执行的规则,这些用于防止将无效数据输入数据库,这样可以确保数据库中数据的准确性和可靠性。以下是PostgreSQL中可用的常用约束。NOTNULLConstraint   -确保值不能为空UNIQUEConstraint     - 确保值唯一PRIMARYKey    ......
  • 无涯教程-PostgreSQL - Distinct语句
    PostgreSQLDISTINCT关键字与SELECT语句结合使用,可消除所有重复记录并仅提取唯一记录。Distinct-语法消除重复记录的DISTINCT关键字的基本语法如下-SELECTDISTINCTcolumn1,column2,.....columnNFROMtable_nameWHERE[condition]Distinct-示例考虑表 COMPANY ......
  • 无涯教程-PostgreSQL - With语句
    在PostgreSQL中,WITH查询提供了一种编写辅助语句以用于较大查询的方法,它有助于将复杂的大型查询分解为更易于阅读的更简单形式。WITH查询是CTE查询,在多次执行子查询时特别有用,代替临时表同样有用,它只计算一次聚合,并允许无涯教程在查询中按其名称引用它。在查询中使用它之前,必须......
  • 无涯教程-PostgreSQL - Order By语句
    PostgreSQLORDERBY子句用于根据一个或多个列以升序或降序对数据进行排序。OrderBy-语法ORDERBY子句的基本语法如下-SELECTcolumn-listFROMtable_name[WHEREcondition][ORDERBYcolumn1,column2,..columnN][ASC|DESC];您可以在ORDERBY子句中使用多个列......
  • 无涯教程-PostgreSQL - Limit语句
    PostgreSQLLIMIT子句用于限制SELECT语句返回的数量。LimitClause-语法带LIMIT子句的SELECT语句的基本语法如下-SELECTcolumn1,column2,columnNFROMtable_nameLIMIT[noofrows]以下是LIMIT子句与OFFSET子句一起使用时的语法-SELECTcolumn1,column2,columnN......
  • 无涯教程-PostgreSQL - 更新数据(Update)
    PostgreSQLUPDATE查询用于修改表中的现有记录,您可以将WHERE子句与UPDATE查询一起使用来更新选定的行,否则,将更新所有行。使用WHERE子句的UPDATE查询的基本语法如下-UPDATEtable_nameSETcolumn1=value1,column2=value2....,columnN=valueNWHERE[condition];您可以使用......
  • 无涯教程-PostgreSQL - AND&OR语句
    PostgreSQL的AND和OR运算符用于组合多个条件以缩小PostgreSQL语句中的选定数据。AND运算符AND运算符允许PostgreSQL语句的WHERE子句中存在多个条件,使用AND运算符时,当所有条件都为真时才通过。如,仅当condition1和condition2均为true时,[condition1]AND[condition2]才为tr......
  • 无涯教程-PostgreSQL - 表达式
    表达式(Expressions)是一个或多个值,运算符以及计算为一个值的PostgresSQL函数的组合。PostgreSQLEXPRESSIONS类似于公式,它们以查询语言编写,您还可以用于查询数据库以获取特定的数据集。考虑一下SELECT语句的基本语法,如下所示:SELECTcolumn1,column2,columnNFROMtable_na......
  • 无涯教程-PostgreSQL - 运算符
    运算符是保留字或字符,主要用于PostgreSQL语句的WHERE子句中以执行操作,如比较和算术运算。运算符用于指定PostgreSQL语句中的条件,并用作语句中多个条件的结合。算术运算符比较运算符逻辑运算符按位运算符PostgreSQL算术运算符假设变量a=2,变量b=3,则-运算符描述示例......
  • 无涯教程-PostgreSQL - 插入数据(Insert)
    PostgreSQLINSERTINTO语句允许将新行插入表中,一个查询可以一次插入一行或几行。INSERTINTO语句的基本语法如下-INSERTINTOTABLE_NAME(column1,column2,column3,...columnN)VALUES(value1,value2,value3,...valueN);在这里,columnN,column1,columnN是要在其中插入数......