【MySQL】什么是多表查询
1.案例说明
下面有员工表、部门表、地址表三张表,查询员工名为'Abel'的人在哪个城市工作?
(1)可以这么写
#1.先从员工表中查询姓名为Abel的员工,得到他的部门id为80 SELECT * FROM employees WHERE last_name = 'Abel'; #2.根据他的部门id查找他的地址id,得到地址id为2500 SELECT * FROM departments WHERE department_id = 80; #3.根据地址id找到城市为Oxford SELECT * FROM locations WHERE location_id = 2500;
(2)多条查询语句需要请求3次,尝试写成一条
查询员工姓名和他的部门名称
SELECT last_name,department_name FROM employees,departments; SELECT employee_id,department_name FROM employees CROSS JOIN departments;
查询结果共2889条数据,每个员工都和部门进行了匹配,员工数107×部门数27 = 2889,出现笛卡尔积错误,缺少连接条件。
这4条查询结果都为2889条数据。
#查询员工姓名和所在部门名称 SELECT last_name,department_name FROM employees,departments; SELECT last_name,department_name FROM employees CROSS JOIN departments; SELECT last_name,department_name FROM employees INNER JOIN departments; SELECT last_name,department_name FROM employees JOIN departments;
2.笛卡尔积(交叉连接CROSS JOIN)
可以将任意表进行连接,即使这两张表没有关联
3.加入连接条件
为避免笛卡尔积错误,需要在where添加有效的连接条件。
表中有相同列时,需要在列名前加上表名前缀。
SELECT last_name,department_name FROM employees,departments WHERE employees.department_id = departments.department_id; #优化后 SELECT emp.employee_id,dept.department_name,emp.department_id FROM employees emp,departments dept WHERE emp.`department_id` = dept.department_id;
结果为106条数据。
结论:如果有n个表实现多表的查询,则需要至少n-1个连接条件
如果给表起了别名,在SELECT和WHERE中都必须使用表的别名,不能再使用表的原名。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本