runoobdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------1|Paul|32|California|200002|Allen|25|Texas|150003|Teddy|23|Norway|200004|Mark|25|Rich-Mond|650005|David|27|Texas|850006|Kim|22|South-Hall|450007|James|24|Houston|10000(7 rows)
我们往表里添加几条数据:
INSERT INTO COMPANY VALUES (8,'Paul',24,'Houston',20000.00);
INSERT INTO COMPANY VALUES (9,'James',44,'Norway',5000.00);
INSERT INTO COMPANY VALUES (10,'James',45,'Texas',5000.00);
此时,COMPANY 表的记录如下:
id | name | age | address | salary
----+-------+-----+--------------+--------1|Paul|32|California|200002|Allen|25|Texas|150003|Teddy|23|Norway|200004|Mark|25|Rich-Mond|650005|David|27|Texas|850006|Kim|22|South-Hall|450007|James|24|Houston|100008|Paul|24|Houston|200009|James|44|Norway|500010|James|45|Texas|5000(10 rows)
创建一张 DEPARTMENT 表,添加三个字段:
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
向 DEPARTMENT 表插入三条记录:
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|12|Engineering|23|Finance|7
交叉连接
交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有
x 和 y 行,则结果表有 x*y 行。
由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
下面是 CROSS JOIN 的基础语法:
SELECT ... FROM table1 CROSS JOIN table2 ...
基于上面的表,我们可以写一个交叉连接(CROSS JOIN),如下所示:
runoobdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
得到结果如下:
runoobdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
emp_id | name | dept
--------+-------+--------------------1|Paul| IT Billing1|Allen| IT Billing1|Teddy| IT Billing1|Mark| IT Billing1|David| IT Billing1|Kim| IT Billing1|James| IT Billing1|Paul| IT Billing1|James| IT Billing1|James| IT Billing2|Paul|Engineering2|Allen|Engineering2|Teddy|Engineering2|Mark|Engineering2|David|Engineering2|Kim|Engineering2|James|Engineering2|Paul|Engineering2|James|Engineering2|James|Engineering7|Paul|Finance
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
基于上面的表,我们可以写一个内连接,如下所示:
runoobdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+--------------1|Paul| IT Billing2|Allen|Engineering7|James|Finance(3 rows)
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
基于上面两张表,我们可以写个左外连接,如下:
runoobdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+----------------1|Paul| IT Billing2|Allen|Engineering7|James|Finance|James||David||Paul||Kim||Mark||Teddy||James|(10 rows)
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
基于上面两张表,我们建立一个右外连接:
runoobdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+-----------------1|Paul| IT Billing2|Allen|Engineering7|James|Finance(3 rows)
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
基于上面两张表,可以建立一个外连接:
runoobdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
emp_id | name | dept
--------+-------+-----------------1|Paul| IT Billing2|Allen|Engineering7|James|Finance|James||David||Paul||Kim||Mark||Teddy||James|(10 rows)