MySQL学习笔记3—连接查询

DQL语言学习—数据查询语言

仅作为学习笔记,学习资源来源于B站视频:BV1xW411u7ax

5. 连接查询

5.1 含义及分类

含义: 又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
分类:
(1)按年代分类:

  • SQL92标准:仅仅支持内连接
  • SQL99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接(后面连接查询的内容都将是SQL99标准)

(2)按功能分类:

  • 内连接:等值连接、非等值连接、自连接——就是找表的交集部分
  • 外连接:左外连接、右外连接、全外连接——就是找我有你没有的部分,增加筛选条件也可以找只有我有的部分
  • 交叉连接

SQL99标准语法:

SELECT 查询列表
FROM1 别名 【连接类型】
JOIN2 别名 
ON 连接条件
【WHERE 筛选条件】
【GROUP BY 分组】
【HAVING 筛选条件】
【ORDER BY 排序列表】

连接类型分类:

  • 内连接(★):inner(可省略)

  • 外连接
    ① 左外(★):left 【outer】
    ② 右外(★):right 【outer】
    ③ 全外:full【outer】

  • 交叉连接:cross

5.2 内连接—等值连接

特点:

  • 多表等值连接的结果为多表的交集部分
  • n表连接,至少需要n-1个连接条件
  • 多表查询时表的顺序没有要求
  • 一般需要为表起别名
  • 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

案例:

#案例1.查询员工名、部门名
SELECT last_name,department_name
FROM departments d
JOIN  employees e
ON e.`department_id` = d.`department_id`;

#案例2.查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.`job_id`=  j.`job_id`
WHERE e.`last_name` LIKE '%e%';

#3. 查询部门个数>3的城市名和部门个数,(添加分组+筛选)
SELECT city,COUNT(*) 部门个数
FROM departments d
INNER JOIN locations l
ON d.`location_id`=l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;

#案例4.查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)
SELECT COUNT(*) 个数,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;

#5.查询员工名、部门名、工种名,并按部门名降序(添加三表连接)
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN departments d ON e.`department_id`=d.`department_id`
INNER JOIN jobs j ON e.`job_id` = j.`job_id`
ORDER BY department_name DESC;

5.3 内连接—非等值连接

可用于分组频数,工资归类

#查询工资级别的个数>20的个数,并且按工资级别降序
SELECT COUNT(*),grade_level
FROM employees e
JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
GROUP BY grade_level
HAVING COUNT(*)>20
ORDER BY grade_level DESC;

5.4 内连接—自连接

#查询姓名中包含字符k的员工的名字、上级的名字
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id`= m.`employee_id`
WHERE e.`last_name` LIKE '%k%';

5.5 外连接—左、右、全外连接

应用场景:用于查询一个表中有,另一个表没有的记录
特点:

  • 外连接的查询结果为主表中的所有记录
    如果从表中有和它匹配的,则显示匹配的值;如果从表中没有和它匹配的,则显示null;
    外连接查询结果=内连接结果+主表中有而从表没有的记录
  • 左外连接,left join左边的是主表;右外连接,right join右边的是主表
  • 左外和右外交换两个表的顺序,可以实现同样的效果
  • 全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
#案例:查询哪个部门没有员工
#左外
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
  
#右外 
SELECT d.*,e.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
 
#全外
USE girls;
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.id;

5.6 交叉连接

就是笛卡尔乘积,m*n种结果

 SELECT b.*,bo.*
 FROM beauty b
 CROSS JOIN boys bo;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值