Mysql基础巩固 --- 多表查询和聚合函数的一些细节,SELECT的执行过程

本文详细讲解了MySQL中的多表查询,包括笛卡尔积、等值连接与非等值连接、自连接与非自连接、内连接与外连接的使用和区别。此外,还介绍了SQL99的新特性自然连接和USING连接。在聚合函数部分,探讨了COUNT函数的使用场景和GROUP BY与HAVING的区别。最后,阐述了SELECT语句的执行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、多表查询

多表查询分类:

  • 等值连接 vs 非等值连接
  • 自连接 vs 非自连接
  • 内连接 vs 外连接

1.1 笛卡儿积(交叉连接)

在数据库原理里学过笛卡尔积,就是把两个表的所有记录做一个全排 ,例如:

image-20220128151703020

会造成笛卡儿积的情况如下:

#查询员工姓名和所在部门名称
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;

即:在不使用on语法时,joininner join逗号cross join结果相同,都是取2个表的笛卡尔积。

解决方法:

使用JOIN...ON子句创建连接限定条件,或者使用WHERE过滤数据


1.2 等值连接 vs 非等值连接

  • 等值连接就是 WHERE语句最后是判断两个值是否相等

  • 非等值连接就是 WHERE语句不是严格的判断是否相等,可以是大于小于,或者IN一个范围等等

例如:

SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e , departments d
WHERE e.department_id = d.department_id; #等值连接

SELECT salary,grade_level
FROM employees e,job_grades j
WHERE salary BETWEEN j.`lowest_sal` AND j.`highest_sal`  #非等值连接

1.3 自连接 vs 非自连接

  • 非自连接就是连接两个不同的表

  • 自连接就是把一张表看作两张表连接

题目:查询employees表,返回“Xxx works for Xxx”

SELECT CONCAT(worker.last_name ,' works for '
, manager.last_name)
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;

1.4 内连接 vs 外连接

1.4.1 内连接(INNER JOIN)

内连接就是求两个表严格相交的部分,只要有一方为NULL就把这条记录丢掉

关键字JOININNER JOINCROSS JOIN的含义是一样的,都是内连接

SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;

1.4.2 外连接(OUTTER JOIN)

外连接分为:左外连接,右外连接,全外连接

1.4.2.1 左外连接(LEFT OUTTER JOIN)

左外连接就是保证左表记录数量不减少,求相交的部分,如果没有相交的部分,就在左表对应右表的字段上置NULL

结果 = 左右表匹配的数据 + 左表没有匹配到的数据

SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WH
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值