postgresql join使用

交叉连接即即笛卡尔积

准备数据

CREATE TABLE EMP
   (    EMPNO int PRIMARY KEY,
        ENAME VARCHAR(10),
        JOB VARCHAR(9),
        MGR int,
        HIREDATE DATE,
        SAL int,
        COMM int,
        DEPTNO int
	)

insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7369,'SMITH','CLERK',7902,'17-DEC-80',800,20);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values(7499,'ALLEN','SALESMAN',7698,'20-FEB-81',1600,300,30);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values(7521,'WARD','SALESMAN',7698,'22-FEB-81',1250,500,30);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7566,'JONES','MANAGER',7839,'02-APR-81',2975,20);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values(7654,'MARTIN','SALESMAN',7698,'28-SEP-81',1250,1400,30);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7698,'BLAKE','MANAGER',7839,'01-MAY-81',2850,30);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7782,'CLARK','MANAGER',7839,'09-JUN-81',2450,10);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7788,'SCOTT','ANALYST',7566,'19-APR-87',3000,20);
insert into emp (EMPNO,ENAME,JOB,HIREDATE,SAL,DEPTNO) values(7839,'KING','PRESIDENT','17-NOV-81',5000,10);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values(7844,'TURNER','SALESMAN',7698,'08-SEP-81',1500,0,30);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7876,'ADAMS','CLERK',7788,'23-MAY-87',1100,20);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7900,'JAMES','CLERK',7698,'03-DEC-81',950,30);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7902,'FORD','ANALYST',7566,'03-DEC-81',3000,20);
insert into emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) values(7934,'MILLER','CLERK',7782,'23-JAN-82',1300,10);



CREATE TABLE DEPT
(    DEPTNO int PRIMARY KEY,
    DNAME VARCHAR(14),
    LOC VARCHAR(13)
);

insert into DEPT values(10,'ACCOUNTING','NEW YORK');
insert into DEPT values(20,'RESEARCH','DALLAS');
insert into DEPT values(30,'SALES','CHICAGO');
insert into DEPT values(40,'OPERATIONS','BOSTON');

用法

mydb=# select * from dept;
 deptno |   dname    |   loc
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
     40 | OPERATIONS | BOSTON
(4 rows)

mydb=# select * from emp;
 empno | ename  |    job    | mgr  |  hiredate  | sal  | comm | deptno
-------+--------+-----------+------+------------+------+------+--------
  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800 |      |     20
  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600 |  300 |     30
  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250 |  500 |     30
  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975 |      |     20
  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250 | 1400 |     30
  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850 |      |     30
  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450 |      |     10
  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000 |      |     20
  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000 |      |     10
  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500 |    0 |     30
  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100 |      |     20
  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950 |      |     30
  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000 |      |     20
  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300 |      |     10
(14 rows)


mydb=# select count(*) from emp;
 count
-------
    14
(1 row)

mydb=# select count(*) from dept;
 count
-------
     4
(1 row)

mydb=# select count(*) from dept cross join emp;
 count
-------
    56
(1 row)

mydb=# select count(*) from emp cross join dept; ;
 count
-------
    56
(1 row)

mydb=#

left outer join
查询以左表为主,左表的每一行去匹配右表,右表中没有匹配到左表的字段则为NULL


mydb=# select * from emp left outer join dept on dept.deptno=emp.deptno;
 empno | ename  |    job    | mgr  |  hiredate  | sal  | comm | deptno | deptno |   dname    |   loc

-------+--------+-----------+------+------------+------+------+--------+--------+------------+------
----
  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800 |      |     20 |     20 | RESEARCH   | DALLA
S
  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600 |  300 |     30 |     30 | SALES      | CHICA
GO
  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250 |  500 |     30 |     30 | SALES      | CHICA
GO
  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975 |      |     20 |     20 | RESEARCH   | DALLA
S
  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250 | 1400 |     30 |     30 | SALES      | CHICA
GO
  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850 |      |     30 |     30 | SALES      | CHICA
GO
  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450 |      |     10 |     10 | ACCOUNTING | NEW Y
ORK
  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000 |      |     20 |     20 | RESEARCH   | DALLA
S
  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000 |      |     10 |     10 | ACCOUNTING | NEW Y
ORK
  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500 |    0 |     30 |     30 | SALES      | CHICA
GO
  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100 |      |     20 |     20 | RESEARCH   | DALLA
S
  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950 |      |     30 |     30 | SALES      | CHICA
GO
  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000 |      |     20 |     20 | RESEARCH   | DALLA
S
  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300 |      |     10 |     10 | ACCOUNTING | NEW Y
ORK
(14 rows)

right outer join
查询以右表为主,右表的每一行去匹配左表,左表中没有匹配到右表的字段则为NULL

mydb=# select * from emp right outer join dept on emp.deptno=dept.deptno;
 empno | ename  |    job    | mgr  |  hiredate  | sal  | comm | deptno | deptno |   dname    |   loc

-------+--------+-----------+------+------------+------+------+--------+--------+------------+------
----
  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800 |      |     20 |     20 | RESEARCH   | DALLA
S
  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600 |  300 |     30 |     30 | SALES      | CHICA
GO
  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250 |  500 |     30 |     30 | SALES      | CHICA
GO
  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975 |      |     20 |     20 | RESEARCH   | DALLA
S
  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250 | 1400 |     30 |     30 | SALES      | CHICA
GO
  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850 |      |     30 |     30 | SALES      | CHICA
GO
  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450 |      |     10 |     10 | ACCOUNTING | NEW Y
ORK
  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000 |      |     20 |     20 | RESEARCH   | DALLA
S
  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000 |      |     10 |     10 | ACCOUNTING | NEW Y
ORK
  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500 |    0 |     30 |     30 | SALES      | CHICA
GO
  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100 |      |     20 |     20 | RESEARCH   | DALLA
S
  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950 |      |     30 |     30 | SALES      | CHICA
GO
  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000 |      |     20 |     20 | RESEARCH   | DALLA
S
  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300 |      |     10 |     10 | ACCOUNTING | NEW Y
ORK
       |        |           |      |            |      |      |        |     40 | OPERATIONS | BOSTO
N
(15 rows)

POSTGRESQL中join 子句中的a join b using(a,b)相当于a join b on a.xx=b.xx

posted @ 2022-06-27 16:00  南大仙  阅读(212)  评论(0编辑  收藏  举报