深圳做网站知名排行,ui设计需要学什么,大学网站建设专业,龙岩企业网站建设制作精选专栏链接 #x1f517; MySQL技术笔记专栏Redis技术笔记专栏大模型搭建专栏Python学习笔记专栏深度学习算法专栏
欢迎订阅#xff0c;点赞#xff0b;关注#xff0c;每日精进1%#xff0c;与百万开发者共攀技术珠峰
更多内容持续更新中#xff01;希望能给大家带来…
精选专栏链接 MySQL技术笔记专栏Redis技术笔记专栏大模型搭建专栏Python学习笔记专栏深度学习算法专栏
欢迎订阅点赞关注每日精进1%与百万开发者共攀技术珠峰
更多内容持续更新中希望能给大家带来帮助~ MySQL多表查询中的笛卡尔积问题1为什么需要多表查询2什么是笛卡尔积3多表查询的笛卡尔积错误3.1笛卡尔积错误案例3.2笛卡尔积错误的分析和解决3.3公共字段的处理练习1为什么需要多表查询
多表查询也称为关联查询指两个或更多个表一起完成查询操作。
可进行多表查询的前提条件 这些一起查询的表之间是有关系的一对一、一对多它们之间一定是有关联字段比如员工表和部门表这两个表依靠“部门编号”进行关联。 案例说明为什么需要多表查询 如下图所示的是一个项目的三张表EMPLOYEES表员工表、DEPARTMENTS表、LOCATIONS表。 显然我们可以得到如下信息
EMPLOYEES 表和DEPARTMENTS表通过 department_id 字段相关联DEPARTMENT表和 LOCATIONS 表通过 location_id 字段相关联 如果我们现在有一个新需求要求查询员工名为 “Abel” 的人在哪个城市工作 显然 EMPLOYEES 表中没有城市这个字段城市字段位于 LOCATIONS 表内。 我们可以通过如下步骤完成此需求。 第一步在EMPLOYEES表内查询Abel的员工信息 SQL语句如下
SELECT *
FROM employees
WHERE last_name Abel;运行结果如下 可以看到Abel 所在的 department_id 为80。 第二步在DEPARTMENT表内查询department_id 为80的部门信息 SQL语句如下
SELECT *
FROM departments
WHERE department_id 80;运行结果如下 可以看到department_id 为80的部门对应的location_id是2500。 第二步在LOCATIONS表内查询location_id是2500的地址信息 SQL语句如下
SELECT *
FROM locations
WHERE location_id 2500;运行结果如下 由此可见员工Abel的工作城市是Oxford。 写了三条SQL语句才实现此需求找到了Abel的工作城市这样是很不方便的而且在高并发的系统中执行多个SQL语句对效率和性能的影响是比较大的相当于多次交互。因此要引入多表查询通过多表查询可以实现 一条SQL语句完成此需求。 2什么是笛卡尔积
笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合也就是第一个对象来自于 X第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。如下图所示 3多表查询的笛卡尔积错误
多表查询的一个常见错误就是笛卡尔积错误。 3.1笛卡尔积错误案例
当我们有如下需求时 需求查询每一位员工的employee_id和department_name。 注意 如下图所示员工的employee_id位于EMPLOYEES表而department_name字段位于DEPARTMENTS表。 如果执行如下SQL语句得到的是错误结果
SELECT employee_id,department_name
FROM employees,departments; 运行结果如下 一共查询出2889条记录而EMPLOYEES表有107条记录DEPARTMENTS表有27条记录。27✖1072889它把每个员工都与每个部门匹配了一遍显然这是一种错误的实现方式具体来说是出现了笛卡尔积的错误。
错误的原因是缺少了多表的连接条件。 3.2笛卡尔积错误的分析和解决
笛卡尔积错误会在下面条件下产生
省略多个表的连接条件或关联条件连接条件或关联条件失效所有表中的所有行互相连接 正确的多表查询需要有连接条件。为了避免笛卡尔积错误可以通过WHERE子句加入有效的连接条件。
加入连接条件后的查询语法如下
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 table2.column2; #连接条件因此正确的SQL语句应该是
SELECT employee_id,department_name
FROM employees,departments
# 两个表的连接条件
WHERE employees.department_id departments.department_id;运行结果如下 此时查询得到的结果才是正常的。
注意如上SQL查询得到106条记录而EMPLOYEES表内有107条记录原因是EMPLOYEES表中存在一条记录的 department_id 字段为Null。 3.3公共字段的处理
一个细节问题是如果查询语句中出现了多个表中都存在的字段则必须指明此字段所在的表。接下来结合案例解释 需求查询每一位员工的employee_id、department_name、department_id。 如果执行如下SQL
SELECT employee_id,department_name,department_id
FROM employees,departments
WHERE employees.department_id departments.department_id;执行报错 原因是EMPLOYEES表和DEPARTMENTS表都存在字段 departmen_idSQL语句中没有明确指出查询哪个表中的 departmen_id 字段。
因此正确的SQL语句是
# 如果查询语句中出现了多个表中都存在的字段则必须指明此字段所在的表。
SELECT employee_id,department_name,employees.department_id
FROM employees,departments
WHERE employees.department_id departments.department_id;运行结果如下 我们了解到如果查询语句中出现了多个表中都存在的字段则必须指明此字段所在的表。对此规则进行拓展从sql优化的角度建议多表查询时每个字段前都指明其所在的表。 因为如果不指明字段所在的表MySQL会自己去两张表中找此字段找到后还需要检查另外一张表中是否存在此字段。这会在一定程度上影响查询的性能。因此建议多表查询时每个字段前都指明其所在的表。 即更好的SQL语句如下
SELECT employees.employee_id,departments.department_name,employees.department_id
FROM employees,departments
WHERE employees.department_id departments.department_id;练习
我们再提出一个新的需求用做练习。 需求查询每一位员工的employee_id、last_name、department_name、city。 SQL语句如下
SELECT e.employee_id,e.last_name,d.department_name,l.city,e.department_id,l.location_id
FROM employees e,departments d,locations l
WHERE e.department_id d.department_id
AND d.location_id l.location_id;因此可以总结出规律如果有n个表实现多表的查询则需要至少n-1个连接条件。 欢迎订阅点赞关注每日精进1%与百万开发者共攀技术珠峰
更多内容持续更新中希望能给大家带来帮助~