1. 连接查询
介绍
- 含义:
又称多表查询,当查询的字段来自多个表时,就会用到连接查询。
- 笛卡尔乘积现象:
表1有m行,表2有n行,结果m*n行
- 发生原因:
没有有效的连接条件
- 如何避免:
添加有效的连接条件
| SELECT NAME,boyName |
| FROM boys,beauty |
| WHERE boys.id = beauty.boyfriend_id; |
分类
2. sql92标准
sql92标准之内连接之等值连接
| SELECT NAME,boyName |
| FROM boys,beauty |
| WHERE boys.`id` = beauty.`boyfriend_id`; |
| #查询员工名、工种号、工种名 |
| SELECT last_name,e.job_id,job_title |
| FROM employees AS e,jobs |
| WHERE e.`job_id` = jobs.`job_id`; |
sql92标准之内连接之非等值连接
| SELECT salary,grade_level |
| FROM job_grades j,employees e |
| WHERE salary BETWEEN lowest_sal AND highest_sal |
| AND grade_level = 'A' |
| ; |
sql92标准之内连接之自连接
| SELECT e.`employee_id`,e.`last_name`,m.`employee_id`,m.`last_name` |
| FROM employees e,employees m |
| WHERE e.`manager_id` = m.`employee_id`; |
3. sql99标准
| select 查询列表 |
| from 表一 别名 |
| [inner] join 表二 别名 |
| on 连接条件; |
| |
| 全语法: |
| select 查询列表 |
| from 表1 别名【连接类型】 |
| join 表2 别名 |
| on 连接条件 |
| 【where 筛选条件】 |
| 【group by 分组】 |
| 【having 筛选条件】 |
| 【order by 排序列表】 |
sql99标准之内连接之等值连接
| #案例一:查询员工名和部门名 |
| SELECT last_name,department_name |
| FROM employees e |
| INNER JOIN departments d |
| ON e.`department_id` = d.`department_id`; |
sql99标准之内连接之非等值连接
| #查询工资级别的个数>2的个数,并且按工资级别降序 |
| SELECT COUNT(*),salary,grade_level |
| FROM employees e |
| INNER 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 |
| ; |
sql99标准之内连接之自连接
| #查询员工的名字、上级的名字 |
| SELECT e.last_name,m.`last_name` |
| FROM employees e |
| INNER JOIN employees m |
| ON e.`employee_id` = m.`manager_id`; |
sql99标准之外连接之左外连接
| #引入:查询男朋友不在男神表的女神名 |
| SELECT b.name,bo.* |
| FROM beauty b |
| LEFT OUTER JOIN boys bo |
| ON b.`boyfriend_id` = bo.`id` |
| WHERE bo.`id` IS NULL |
| ; |
sql99标准之外连接之右外连接
| #引入:查询男朋友不在男神表的女神名 |
| SELECT b.`name`,bo.* |
| FROM boys bo |
| RIGHT OUTER JOIN beauty b |
| ON b.`boyfriend_id` = bo.`id` |
| WHERE bo.`id` IS NULL; |
sql99标准之外连接之全外连接
| #全外连接 |
| SELECT b.*,bo.* |
| FROM beauty b |
| FULL OUTER JOIN boys bo |
| ON b.`boyfriend_id` = bo.id; |
sql99标准之外连接之交叉连接
| #相当于sql标准的笛卡尔乘积 |
| SELECT b.*,bo.* |
| FROM beauty b |
| CROSS JOIN boys bo; |
| |
| #对比 |
| #sql92标准里的笛卡尔乘积 |
| SELECT b.*,bo.* |
| FROM beauty b,boys bo; |
4. 总结连接查询
内连接:

左外连接:

右外连接:

全外连接:

其他三种的实现:

5. 练习题目
https://leetcode-cn.com/problems/combine-two-tables/submissions/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?