美文网首页数据库MySQL
20 多表查询的分类

20 多表查询的分类

作者: 菩提树下参悟 | 来源:发表于2022-07-29 06:22 被阅读0次

    多表查询的分类
    /*

    角度1:等值连接 vs 非等值连接

    角度2:自连接 vs 非自连接

    角度3:内连接 vs 外连接

    */

    7.1 等值连接 vs 非等值连接

    非等值连接的例子:

    SELECT *
    FROM job_grades;

    SELECT e.last_name,e.salary,j.grade_level
    FROM employees e,job_grades j

    where e.salary between j.lowest_sal and j.highest_sal;

    WHERE e.salary >= j.lowest_sal AND e.salary <= j.highest_sal;

    7.2 自连接 vs 非自连接

    SELECT * FROM employees;

    自连接的例子:

    练习:查询员工id,员工姓名及其管理者的id和姓名

    SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
    FROM employees emp ,employees mgr
    WHERE emp.manager_id = mgr.employee_id;

    7.3 内连接 vs 外连接

    内连接:合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

    SELECT employee_id,department_name
    FROM employees e,departments d
    WHERE e.department_id = d.department_id; #只有106条记录

    外连接:合并具有同一列的两个以上的表的行, 结果集中除了包含一个表与另一个表匹配的行之外,

    还查询到了左表 或 右表中不匹配的行。

    外连接的分类:左外连接、右外连接、满外连接

    左外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行,这种连接称为左外连接。

    右外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行,这种连接称为右外连接。

    练习:查询所有的员工的last_name,department_name信息

    SELECT employee_id,department_name
    FROM employees e,departments d
    WHERE e.department_id = d.department_id; # 需要使用左外连接

    SQL92语法实现内连接:见上,略

    SQL92语法实现外连接:使用 + ----------MySQL不支持SQL92语法中外连接的写法!

    不支持:

    SELECT employee_id,department_name
    FROM employees e,departments d
    WHERE e.department_id = d.department_id(+);

    SQL99语法中使用 JOIN ...ON 的方式实现多表的查询。这种方式也能解决外连接的问题。MySQL是支持此种方式的。

    SQL99语法如何实现多表的查询。

    SQL99语法实现内连接:

    SELECT last_name,department_name
    FROM employees e INNER JOIN departments d
    ON e.department_id = d.department_id;

    SELECT last_name,department_name,city
    FROM employees e JOIN departments d
    ON e.department_id = d.department_id
    JOIN locations l
    ON d.location_id = l.location_id;

    SQL99语法实现外连接:

    练习:查询所有的员工的last_name,department_name信息

    左外连接:

    SELECT last_name,department_name
    FROM employees e LEFT JOIN departments d
    ON e.department_id = d.department_id;

    右外连接:

    SELECT last_name,department_name
    FROM employees e RIGHT OUTER JOIN departments d
    ON e.department_id = d.department_id;

    满外连接:mysql不支持FULL OUTER JOIN

    SELECT last_name,department_name
    FROM employees e FULL OUTER JOIN departments d
    ON e.department_id = d.department_id;

    8. UNION 和 UNION ALL的使用

    UNION:会执行去重操作

    UNION ALL:不会执行去重操作

    结论:如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,

    则尽量使用UNION ALL语句,以提高数据查询的效率。

    相关文章

      网友评论

        本文标题:20 多表查询的分类

        本文链接:https://www.haomeiwen.com/subject/yjxrirtx.html