连接查询
关于mysql中各种连接查询的图解如下?
在下面的例题中,需要的数据表如下:
- employees(员工信息表)
- departments(部门信息表)
- jobs(工作信息表)
- locations(地区信息表)
sql99标准
-
内连接
-
内连接(inner join)
1,先确定所连接的表,
2,再确定所要查询的字段,
3,确定连接条件以及连接方式
特点:只查询在连接的表中能够有对应的记录
-- 查询名字和部门名 SELECT e.last_name,d.department_name -- 可以是名称.字段名 FROM employees e -- 表名,别名 INNER JOIN departments d -- 表名,别名 ON e.department_id = d.department_id -- 字段相等的语句
-
等值连接
1)可以搭配前面学的所有字句,排序,分组,筛选
2)多表等值连接的结果是两个表的交集
3)n表连接至少需要(n-1)个连接条件
4)一般需要给表起别名
5)多表顺序没有要求-- 两个表,员工信息表,部门表 -- 查询员工对应部门名 SELECT last_name,department_name FROM employees emp,departments dept WHERE emp.department_id = dept.department_id --用where进行等值连接
-
非等值连接
-- 两个表,员工信息表,工资表 -- 查询员工的工资和工资级别 SELECT salary,grade_level FROM employees emp,job_grades job -- 对两个表起别名 WHERE salary BETWEEN job.lowest_sal AND job.highest_sal -- 查询出各个工资所对应的级别
还有 >, <, !==, 等等
-
自连接
当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名
自连接查询一般用作表中的某个字段的值是引用另一个字段的值,比如权限表中,父权限也属于权限。
-- 一个表,员工表, -- 查询员工名和上级的名称 SELECT emp1.last_name 员工名,emp2.last_name 上级领导 FROM employees emp1,employees emp2 WHERE emp1.manager_id=emp2.employee_id;
-
-
外连接
应用场景:用于查询一个表中有,另一表中没有的记录
- 左外连接查询(left join)
以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null
-
关键字是left outer join,等效于left join
-
在关联查询中,做外连接查询就是左连接查询,两者是一个概念
注意:
- 左连接,左表内容会全部显示,但是还是要看
select
后的语句(查询语句) - 在
select
之后查询的字段,若有重复,需要用 表名.字段 的方式来写
- 左连接,左表内容会全部显示,但是还是要看
-- 两个表,部门名称表,地区表 -- 查询部门名称以及对应的城市 SELECT department_name,city FROM departments dept LEFT JOIN locations loc ON dept.location_id = loc.location_id
-
右外连接查询(right outer join)
和左外连接相同
-
全外连接(full)
把两张表的字段都查出来,没有对应的值就显示null
- 使用full关键字连接左外连接和右外连接
- 全外连接就是两个表的并集
sql92标准
-
仅支持内连接
-- 基本语法格式: SELECT 字段名 FROM 表一,表二,,, WHERE 表名1.连接字段1 = 表名2.连接字段2