连接查询

1. 连接查询

介绍

  • 含义:
    又称多表查询,当查询的字段来自多个表时,就会用到连接查询。
  • 笛卡尔乘积现象:
    表1有m行,表2有n行,结果m*n行
  • 发生原因:
    没有有效的连接条件
  • 如何避免:
    添加有效的连接条件
SELECT NAME,boyName
FROM boys,beauty
WHERE boys.id = beauty.boyfriend_id;

分类

  • 按年代分:
    -- sql92标准:
    仅仅支持内连接
    -- sql99标准:
    支持内连接,外连接(左外和右外),交叉连接

  • 按功能分:
    -- 内连接:等值连接,非等值连接,自连接
    -- 外连接:左外连接,右外连接,全外连接
    -- 交叉连接

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 查询列表
from1 别名【连接类型】
join2 别名
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/

posted @   jsqup  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示