当前位置:网站首页>MySQL的多表查询(1)
MySQL的多表查询(1)
2022-08-02 23:08:00 【richest_qi】
文章目录
多表查询,也称为关联查询,指两个或更多个表一起完成的查询操作。这些一起查询的表通过关联字段关联,可能一对一,也可能一对多。
比如,要查询 last_name为’Abel’的员工在哪座城市工作?
SELECT department_id
FROM employees
WHERE last_name = 'Abel'; -- 查询到last_name为'Abel'时,其department_id是80
SELECT location_id
FROM departments
WHERE department_id = 80; -- 查询到department_id为80时,其location_id是2500
SELECT city
FROM locations
WHERE location_id = 2500; -- 查询到location_id为2500时,其city是Oxford
以上通过3步查询,终于得到了结果:last_name为’Abel’的员工在Oxford这座城市工作。
但是,如果使用 多表查询 则会简便很多。
接下来,我们会看到
- 多表查询的错误示范:多表查询时,出现了笛卡儿积。
- 多表查询的正确示范:
- 多表查询时,需要连接条件。
- 多表查询时,如果SELECT子句中出现了多个表中都存在的字段,则必须指明该字段所在表。
- 多表查询时,SELECT子句中出现的每个字段,建议都指明其所在表。
- 给表取别名,在SELECT或WHERE中使用表的别名。
- 给表取别名,在SELECT或WHERE中就必须使用表的别名,不能再使用表的原名了。
- 多表查询时,如果有N个表,则至少需要N-1个连接条件。
多表查询,出现了笛卡儿积
多表查询出现了笛卡儿积(或称为 交叉连接,CROSS JOIN)。
SELECT employee_id
FROM employees; -- 返回107条记录
SELECT department_name
FROM departments; -- 返回27条记录
SELECT employee_id,department_name
FROM employees,departments; -- 返回107 * 27 = 2889条记录
-- 每个员工把每个部门都匹配了一遍,即出现了笛卡儿积(笛卡儿积,也称为交叉连接,CROSS JOIN)。
# 等同于
SELECT employee_id,department_name
FROM employees CROSS JOIN departments; -- 返回107 * 27 条记录
-- 每个员工把每个部门都匹配了一遍,即出现了笛卡儿积(笛卡儿积,也称为交叉连接,CROSS JOIN)。
多表查询时,需要连接条件
# 多表查询时,需要连接条件
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id= departments.department_id;
多表查询时,如果SELECT子句中存在多个表中都存在的字段,则必须指明该字段所在表
# 多表查询时,如果SELECT子句中出现多个表中都存在的字段,则必须指明该字段所在表。
SELECT employee_id,department_name,department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; -- 报错:Column 'department_id' in field list is ambiguous
SELECT employee_id,department_name,employees.department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; -- 返回106条记录
多表查询时,SELECT子句中出现的字段,建议都指明其所在表(从sql优化的角度考虑)
# 多表查询时,SELECT子句中出现的字段,建议都指明其所在表。(从sql优化的角度考虑)
SELECT employees.employee_id,departments.department_name,departments.department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; -- 返回106条记录
给表取别名,在SELECT或WHERE中使用表的别名
# 给表取别名,在SELECT或WHERE中使用表的别名
SELECT e.employee_id,d.department_name,d.department_id
FROM employees e,departments d
WHERE e.department_id = d.department_id;
给表取了别名,SELECT或WHERE中必须使用表的别名,不能再使用表的原名了
# 给表取了别名,SELECT或WHERE中就必须使用表的别名,不能再使用表的原名了
SELECT employees.employee_id,d.department_name,d.department_id
FROM employees e,departments d
WHERE e.department_id = d.department_id; -- 报错:Unknown column 'employees.employee_id' in 'field list'
SELECT e.employee_id,d.department_name,d.department_id
FROM employees e,departments d
WHERE e.department_id = departments.department_id; -- 报错:Unknown column 'departments.department_id' in 'where clause'
多表查询时,如果有N个表,则至少需要N-1个连接条件
1. 查询员工的employee_id,last_name,department_name和city
# 查询员工的employee_id,last_name,department_name和city
SELECT e.employee_id,e.last_name,d.department_name,l.city
FROM employees e,departments d,locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id; -- 返回106条记录
2. 查询last_name为’Abel’的员工,其工作所在城市
# 查询last_name为'Abel'的员工,其工作所在城市
SELECT e.last_name,d.department_id,l.location_id,l.city
FROM employees e,departments d,locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id
AND e.last_name = 'Abel';
-- 返回数据如下
-- last_name department_id location_id city
-- Abel 80 2500 Oxford
边栏推荐
猜你喜欢
程序员常说的“左手锟斤拷,右手烫烫烫”是怎么回事?
CentOS7 安装MySQL 图文详细教程
I have been in the software testing industry for nearly 20 years, let me talk to you about today's software testing
Connect the Snowflake of CKAN tutorial CKAN to release to open data portal
Swift中的类型相关内容
CAS:1445723-73-8,DSPE-PEG-NHS,磷脂-聚乙二醇-活性酯两亲性脂质PEG共轭物
合并两个excel表格工具
主流定时任务解决方案全横评
R语言自学 1 - 向量
js基础知识整理之 —— 全局作用域
随机推荐
js基础知识整理之 —— 变量和数据类型
Week 7 CNN Architectures - LeNet-5、AlexNet、VGGNet、GoogLeNet、ResNet
APT级全面免杀拿Shell
2022杭电多校第一场(K/L/B/C)
IDEA多线程调试
十年架构五年生活-04第一个工作转折点
Strict feedback nonlinear systems based on event trigger preset since the immunity of finite time tracking control
Cholesterol-PEG-Amine,CLS-PEG-NH2,胆固醇-聚乙二醇-氨基脂两亲性脂质衍生物
Apache Doris 1.1 特性揭秘:Flink 实时写入如何兼顾高吞吐和低延时
机器学习-特征映射方法
主流定时任务解决方案全横评
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping的区别
DownMusic总结记录
如何使用vlookup+excel数组公式 完成逆向查找?
记一次mysql查询慢的优化历程
matplotlib中的3D绘图警告解决:MatplotlibDeprecationWarning: Axes3D(fig) adding itself to the figure
centos7安装mysql8
雷克萨斯lm的安全性如何?
用了这么多年的LinkedList,作者说自己从来不用它?为什么?
No code development platform data ID introductory tutorial