连接查询
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 查询列表
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/
本文来自博客园,作者:jsqup,转载请注明原文链接:https://www.cnblogs.com/jsqup/p/15947649.html