博客
关于我
mysql基础教程四 --连接查询
阅读量:789 次
发布时间:2023-02-12

本文共 2370 字,大约阅读时间需要 7 分钟。

多表查询与笛卡尔乘积的理解

在数据库查询中,多表查询是常见的操作之一。当查询涉及多个表时,通常需要使用连接查询来获取数据。以下是关于多表查询的一些关键点和实例。

笛卡尔乘积现象

当两个表之间没有有效的连接条件时,数据库会自动生成笛卡尔乘积 resultset。例如,如果表A有m行记录,表B有n行记录,则笛卡尔乘积会产生m x n行结果。这一点在没有where子句限制的情况下尤为明显。

发生原因

笛卡尔乘积的产生主要是由于缺少有效的连接条件。数据库无法理解表之间的关联关系,因此会将所有可能的组合都包含在结果中。

如何避免

为了避免笛卡尔乘积现象,必须在查询中明确指定连接条件。确保每个涉及到的表之间都有明确的关联规则。


多表查询的分类

按年代分类

  • SQL92标准:仅支持内连接。
  • SQL99标准(推荐):支持内连接、外连接(左外和右外)、全外连接以及交叉连接。

按功能分类

内连接

  • 等值连接

    • 结果为多表的交集部分。
    • 至少需要n-1个连接条件。
    • 表的顺序没有特殊要求。
    • 通常需要为表起别名。
  • 非等值连接

    • 结果基于字段值之间的逻辑关系。
    • 需要明确的连接条件。
  • 自连接

    • 一表连接到自身。
    • 通常用于关联记录之间的关系。

外连接

  • 左外连接

    • 左边表的所有记录都能与右边表的所有记录关联。
  • 右外连接

    • 右边表的所有记录都能与左边表的所有记录关联。
  • 全外连接

    • 结果包含左表和右表的所有记录。

交叉连接

  • 两张表之间的笛卡尔乘积,通常用于特殊场景。

多表查询的案例

###案例1:查询女神名和对应的男神名

SELECT NAME, boyName FROM boys, beautyWHERE beauty.boyfriend_id = boys.id;

###案例2:查询员工名和对应的部门名

SELECT last_name, department_nameFROM employees, departmentsWHERE employees.`department_id` = departments.`department_id`;

###案例3:查询员工名、工种号、工种名

SELECT e.last_name, e.job_id, j.job_titleFROM employees e, jobs jWHERE e.`job_id` = j.`job_id`;

###案例4:查询有奖金的员工名、部门名

SELECT last_name, department_name, commission_pctFROM employees e, departments dWHERE e.`department_id` = d.`department_id`AND e.`commission_pct` IS NOT NULL;

###案例5:查询城市名中第二个字符为'o'的部门名和城市名

SELECT department_name, cityFROM departments d, locations lWHERE d.`location_id` = l.`location_id`AND city LIKE '_o%';

###案例6:查询每个城市的部门个数

SELECT COUNT(*) AS 部门个数, cityFROM departments d, locations lWHERE d.`location_id` = l.`location_id`GROUP BY city;

###案例7:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资

SELECT department_name, d.`manager_id`, MIN(salary)FROM departments d, employees eWHERE d.`department_id` = e.`department_id`AND commission_pct IS NOT NULLGROUP BY department_name, d.`manager_id`;

###案例8:查询每个工种的工种名和员工个数,并按员工个数降序

SELECT job_title, COUNT(*) AS 员工个数FROM employees e, jobs jWHERE e.`job_id` = j.`job_id`GROUP BY job_titleORDER BY 员工个数 DESC;

###案例9:查询员工名、部门名和所在的城市

SELECT last_name, department_name, cityFROM employees e, departments d, locations lWHERE e.`department_id` = d.`department_id`AND d.`location_id` = l.`location_id`AND city LIKE 's%'ORDER BY department_name DESC;

非等值连接

###案例1:查询员工的工资和工资级别

SELECT salary, grade_levelFROM employees e, job_grades gWHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`AND g.`grade_level` = 'A';

自连接

###案例:查询员工名和上级的名称

SELECT e.employee_id, e.last_name, m.last_nameFROM employees e, employees mWHERE e.`manager_id` = m.`employee_id`;

转载地址:http://rhbfk.baihongyu.com/

你可能感兴趣的文章