连接查询(JOIN)
(1)sql92标准
SELECT 查询列表
FROM 表1,表2
WHERE 连接条件
[AND 查询条件]
a.内连接
sql92标准只支持内连接,内连接即用来查询两张表的”交集”部分,即满足条件的、两张表都存在的部分。内连接又分为等值连接、非等值连接和自连接。
等值连接
等值连接即以两张表的两个字段的值相等为连接条件,进行两张表的连接,如:
#查询每个员工的job_title
SELECT e.last_name,e.job_id,job_title
FROM employees e,jobs j
WHERE e.job_id = j.job_id;
非等值连接
非等值连接即以两张表的两个字段的值满足一定条件为连接条件,进行两张表的连接,如:
#查询某个员工的工资等级
SELECT e.last_name,j.grade_level
FROM employees e,job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
自连接
自连接即一张表和本身的连接,因涉及到同一张表的连接,一般要对这张表使用不同的别名加以区分,如:
#查询某个员工及其对应的领导
SELECT e1.last_name ‘employee’,e2.last_name ‘manager’
FROM employees e1,employees e2
WHERE e1.manager_id = e2.employee_id;
(2)sql99标准
SELECT 查询列表
FROM 表1
[INNER|LEFT OUTER|RIGHT OUTER|FULL OUTER|UNION] JOIN 表2
ON 连接条件
[WHERE 查询条件]
a.内连接(INNER JOIN)
sql99的内连接含义与sql92语法完全一致,只是语法不同。用sql92的三个例子改为sql99语法形式如下:
等值连接
#查询每个员工的job_title
SELECT e.last_name,e.job_id,job_title
FROM employees e
INNER JOIN jobs j
ON e.job_id = j.job_id;
非等值连接
#查询某个员工的工资等级
SELECT e.last_name,j.grade_level
FROM employees e
INNER JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;
自连接
#查询某个员工及其对应的领导
SELECT e1.last_name ‘employees’,e2.last_name ‘manager’
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.employee_id;
b.外连接(OUTER JOIN)
在sql99标准中,又增加的外连接的功能。外连接又包括左外连接、右外连接和全外连接。多用来查询一张表中有,另一张表中没有的记录。
外连接会查询主表的所以记录
若主表中的某条记录在从表中有与之对应的记录,则相应的字段为从表的内容;
反正,相应的字段为null。
换句话说,外连接查询结果=内连接查询结果+主表有但从表没有的记录
对于主从表的区分,有以下几种:
左外连接:主表 LEFT JOIN 从表
右外连接:从表 RIGHT JOIN 主表
全外连接:表1 FULL JOIN 表2,其中表1表2分别轮流作为主表,查询结果是两张表的”并集”。另外,全外连接在MySQL中不支持使用。
左外连接(LEFT JOIN ON)
#查询没有迟到记录的员工名
SELECT last_name,late.count_late
FROM employees
LEFT JOIN late
ON employees.employee_id = late.employee_id
WHERE late.count_late IS NULL;
右外连接(RIGHT JOIN ON)
#查询没有迟到记录的员工名
SELECT last_name,late.count_late
FROM late
RIGHT JOIN employees
ON employees.employee_id = late.employee_id
WHERE late.count_late IS NULL;
全外连接(FULL JOIN ON)
全外连接在mysql中不支持,语法如下:
SELECT beauty.name
FROM boys
FULL OUTER JOIN beauty
ON beauty.boyfriend_id = boys.id ;
c.交叉连接(CROSS JOIN)
效果即笛卡尔积形式,即两个表的所有记录都一一匹配一遍,查询的结果一共A×B条记录(A、B分别为两个表的记录数)
SELECT * FROM jobs CROSS JOIN locations;