一、多表联接查询
1.内联接 (inner join)
2.外联接
左外联接 (left outer join) ;右外联接 (right outer join) 完整外联接 (full outer join)
3.交叉联接(cross join 笛卡尔积)
二、内联接
它根据表中共同的列来进行匹配,当两个表存在主外键关系的时候通常会用到内联接查询。
例如:查询出公司的员工ID、员工姓名、所在部门ID、部门名称
SELECT emp_id,emp_name,DEP.dep_id,dep_name FROM EMPLOYEE INNER JOIN DEP ON EMPLOYEE.dep_id=DEP.dep_id
三、左外联接
它的结果集包括left outer join子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列均为空值。
例如:查询出公司的员工姓名、月份、实发工资 SELECT E.emp_name,S.sal_ym,S.sal_disburse FROM EMPLOYEE E LEFT OUTER JOIN SALARY S ON E.emp_id = S.emp_id
四、右外联接
右外联接:RIGHT JOIN(RIGHT OUTER JOIN)是左联接的反向联接,将返回右表中的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
例如:查询出公司的员工编号、职位编号、职位名称
SELECT EMPLOYEE.emp_id, EMPLOYEE.job_id, JOB.job_name FROM EMPLOYEE RIGHT OUTER JOIN JOB ON EMPLOYEE.job_id = JOB.job_id
五、完整外联接
完整外联接:FULL OUTER JOIN,它返回左右表中的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列包含空值,如果表之间有匹配行,则整个结果集行包含基表的数据值。
例如:查询出公司的员工编号、职位编号、职位名称 SELECT EMPLOYEE.emp_id, EMPLOYEE.job_id, JOB.job_name FROM EMPLOYEE FULL OUTER JOIN JOB ON EMPLOYEE.job_id = JOB.job_id。
六、交叉联接(cross join 笛卡尔积)
交叉联接:CROSS JOIN,没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。如果添加一个 WHERE 子句,则交叉联接的作用将同内联接一样。
例如:查询出公司的员工姓名和职位名称 SELECT E.emp_name || '.' || J.job_name FROM EMPLOYEE E CROSS JOIN JOB J
七、多表联接查询
例:现需要查询出所有员工的姓名,所在的部门以及职位。
SELECT E.emp_name 姓名, D.dep_name 部门, J.job_name 职位 FROM EMPLOYEE E LEFT JOIN DEP D ON E.dep_id = D.dep_id LEFT JOIN JOB J ON E.job_id = J.job_id