MySQL学习笔记-多表查询1

多表查询(关联查询)

所有笔记的链接
本文是学习尚硅谷MySQL多表查询第一部分的笔记,详细信息请移步b站

前提条件:查询的表之间是有着一对一,一对多的关系的,之间有着关联字段

实验样例前提:employees,departments,locations这三张表(尚硅谷课件可以拿到)

员工和部门表都标有department_id这个信息,部门表和位置表都有location_id这个信息

三张表之间存在着这么一种关联

在这里插入图片描述

#查询名字为Abel的location
SELECT * 
FROM employees
WHERE last_name = 'Abel'

#查询到了Abel的department_id为80

SELECT *
FROM departments
WHERE department_id = 80
#查询到了location_id 为2500


SELECT *
FROM locations
WHERE location_id = 2500

出现笛卡尔积的错误:原因是缺少了多表的连接条件

#错误实现方式:每个员工和每一个部门都进行了一次匹配

SELECT employee_id,department_name
FROM employees,departments


SELECT employee_id,department_name
FROM employees CROSS JOIN   departments

员工和部分的表相关联的就是部门id,多表查询的正确的方式

SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id = departments.department_id

如果查询时查询的是两个表中都有的数据就会报错,必须明确指明查询的是哪一个表中的数据

从优化的角度考虑,指定数据的时候建议明确是哪一个表中的数据

从可读性的角度考虑,在声明表名的时候建议使用别名

SELECT emp.employee_id, dep.department_name,emp.department_id
FROM employees emp,departments dep
WHERE emp.department_id = dep.department_id

练习:查询员工的employee_id, last_name,department_name,city(来源于上面的三张表)

因为我们是多表查询,因此我们就应该像并查集一样让他们手拉手连起来我们才能查询

SELECT e.employee_id, l.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

怎么看起来感觉烂糟的 😦

非等值连接

我们在连接表的时候不仅可以通过等于进行连接,同时也是可以通过非等值连接

首先看一下job_grades这个表中的数据
在这里插入图片描述

问题:查询员工姓名,薪水和对应的等级(job_grade)

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

自连接

我们可以看到职工表中每一个员工(除了King)之外都有一个manager,同时manager的职工编号同样也存在与这张表中,如果我们想要查询员工和他manager的id就需要自连接

其实自连接的话我们可以把同一张职工表看做两张表,用别名进行逻辑上的区分

#查询员工的id,员工姓名,员工对应管理者的id和姓名
SELECT emp.employee_id, emp.last_name, man.employee_id, man.last_name
FROM employees emp, employees man
WHERE emp.manager_id = man.employee_id
#注意表用了别名,选择时候对应的值注意分辨
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值