连接查询(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;