MySQL查询语句学习之多表查询

前言

所有表均来自mytestdb数据库
可通过此链接免费下载或直接点击mytestdb下载

https://download.csdn.net/download/Onlylong1/85747137?spm=1001.2014.3001.5503


1. 等值连接与不等值连接

①等值连接

查询员工的id名字及其对应的部门id部门名

SELECT emp.employee_id, emp.last_name, dep.department_id, dep.department_name
FROM employees emp, departments dep
WHERE emp.department_id = dep.department_id
ORDER BY dep.department_id DESC;

查询结果:

请添加图片描述

②不等值连接

查询员工名字薪资及其对应的工作等级

SELECT e.last_name,e.salary,j.grade_level
FROM employees e, job_grades j
# WHERE e.salary >= j.lowest_sal AND e.salary <= j.highest_sal
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal
ORDER BY salary ASC, LENGTH(e.last_name);

查询结果:
请添加图片描述

2. 自连接与非自连接

①自连接

查询员工id名字及其管理者id名字

SELECT emp.employee_id, emp.last_name, mgr.employee_id,mgr.last_name
FROM employees emp, employees mgr
WHERE emp.manager_id = mgr.employee_id;

查询结果:

请添加图片描述

②非自连接

除自连接外的查询都叫非自连接,即前面所演示的等值连接与不等值连接均为非自连接

3. 内连接与外连接

①内连接

合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行

查询员工的名字及其部门名及其所在部门所在城市名

SELECT last_name, department_name, city
#INNER 可省略
FROM employees emp INNER JOIN departments dep 
ON emp.department_id = dep.department_id
JOIN locations loc
ON dep.location_id = loc.location_id;

查询结果:
请添加图片描述

②外连接

合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表 或 右表 中不匹配的行

外连接分为左外连接、右外连接、满外连接

左外连接:

查询所有的员工的last_name,department_name信息

SELECT last_name, department_name
# OUTER 可以省略
FROM employees emp LEFT OUTER JOIN departments dep
ON emp.department_id = dep.department_id;

查询结果:
请添加图片描述

右外连接:

查询所有的员工的last_name,department_name信息

SELECT last_name, department_name
# OUTER 可以省略
FROM employees emp RIGHT OUTER JOIN departments dep
ON emp.department_id = dep.department_id;

查询结果:
请添加图片描述

满外连接(全外连接):

查询所有的员工的last_name,department_name信息

# MySQL 不支持 FULL OUTTER JOIN
SELECT last_name, department_name
# OUTER 可以省略
FROM employees emp FULL OUTER JOIN departments dep
ON emp.department_id = dep.department_id;

MySQL要实现满外连接(全外连接)要引入UNION或UNION ALL

其作用是操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中

区别:

UNION:会去重

UNION ALL: 不会去重,效率比UNION高(能使用UNION ALL就不要使用UNION)

MySQL实现满外连接

1.使用左连接(查出表employees与表departments公共部分及表employees特有部分):

SELECT emp.last_name, dep.department_name
FROM employees emp LEFT OUTER JOIN departments dep
ON emp.department_id = dep.department_id;

2.再使用右外连接(查询表departments的特有部分)

SELECT emp.last_name, dep.department_name
FROM employees emp RIGHT OUTER JOIN departments dep
ON emp.department_id = dep.department_id
WHERE emp.department_id IS NULL;

3.最后使用UNION ALL连接两部分

其实只需要获取到表employees与表department的公共部分及两表特有部分,再将其使用UNION或UNION ALL即可

SELECT emp.last_name, dep.department_name
FROM employees emp LEFT OUTER JOIN departments dep
ON emp.department_id = dep.department_id

UNION ALL

SELECT emp.last_name, dep.department_name
FROM employees emp RIGHT OUTER JOIN departments dep
ON emp.department_id = dep.department_id
WHERE emp.department_id IS NULL;

查询结果:
请添加图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值