DQL连接查询介绍
连接查询
按年代分:
- sq192标准(只支持内连接)
- sq199标准
按功能分:
现在有两张表我们想要的是输出boyfriend_id 和 boy表中id匹配的对
SELECT NAME,boyname
FROM beauty,boys
WHERE beauty.boyfriend_id = boys.id
非等值连接
# 这里我们就用到非等值连接
SELECT salary,grade_level,last_name
FROM employees e,job_grades g
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal
GROUP BY last_name
自连接
分析:如上图所示,每个员工后面有个manage_id(领导的id)根据这个manage_id我们可以到这张表中找到id和manage_id相等的员工就是领导的id,这个时候,我们就需要自连接
SELECT e.last_name,e.employee_id,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.manager_id = m.employee_id
SQL99语法
语法: SELECT 查询列表
FROM 表1 别名 【连接类型】
JOIN 表2 别名
ON 连接条件
WHERE 筛选条件
…
连接类型:inner 内连接
left [outer] 左外连接
right[outer] 左外连接
full[outer] 全外连接
cross 交叉连接
等值连接
SELECT last_name,employee_id,employees.job_id
FROM employees INNER
JOIN jobs
ON employees.job_id = jobs.job_id
非等值连接
SELECT salary,grade_level
FROM employees e INNER
JOIN job_grades g
ON salary BETWEEN g.lowest_sal AND g.highest_sal
自连接
SELECT e.last_name,e.employee_id,m.employee_id,m.last_name
FROM employees e INNER
JOIN employees m
ON e.manager_id = m.employee_id
外连接
外连接的结果是主表的所有记录
如果从表有和他匹配的,则显示匹配的值
如果从表中没有和他匹配的,则显示null
外连接的结果 = 内连接的结果 + 主表中有而从表中没有的记录
我们还是拿这两张表举个例子:
一个表是boys表
一个是beauty表
内连接没有主表和从表之分,内连接的效果如下图
可以看到只有匹配上的才会被显示,而外连接的结果 = 内连接的结果 + 主表中有而从表中没有的记录,现在我们拿beauty作为主表,那么其中没有匹配上的记录就会显示null
- 左外连接:left的左边是主表
- 右外连接:right join右边是主表
# 左外连接 beauty作为主表
SELECT beauty.name,boys.*
FROM beauty
LEFT OUTER JOIN boys
ON beauty.boyfriend_id = boys.id
ORDER BY boyName
# 右外连接
SELECT beauty.name,boys.*
FROM boys
RIGHT OUTER JOIN beauty
ON beauty.boyfriend_id = boys.id
ORDER BY boyName
全外连接
mysql中不支持全外连接,不过可以看作就是右外(左外)连接,分别将两张表做主表,然后取并集
交叉连接
SELECT beauty.name,boys.*
FROM boys
CROSS JOIN beauty
交叉连接就是笛卡尔乘积,交叉连接后面可以不用接连接条件,如果加上连接条件就是取交集部分,交叉连接和sql92中的效果很像
SELECT beauty.name,boys.*
FROM boys
CROSS JOIN beauty
ON beauty.boyfriend_id = boys.id
交叉连接后面可以不用接连接条件,如果加上连接条件就是取交集部分,交叉连接和sql92中的效果很像