DQL语言
连接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2 有n行,结果有m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类:
按年代分类:
sql92标准 :仅仅支持内连接
sql99标准(推荐):支持所有的内连接 + 外连接(左外和右外)+ 交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
一、sql92标准
Ⅰ. 等值连接
① 多表等值连接的结果为多表的交集部分
② n表连接,至少需要n-1个连接条件
③ 多表的顺序没有要求
④ 一般需要为表起别名
⑤ 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
1.简单的使用
#案例1:查询女神名和对应的男神名
SELECT NAME,boyName
FROM boys,beauty
WHERE beauty.boyfriend_id = boys.id;
#案例2:查询员工名和对应的部门名
SELECT last_name ,department_name
FROM employees,departments
WHERE employees.`department_id` = departments.`department_id`;
2.为表起别名
① 提高语句的简洁度
② 区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
#查询员工号、工种号、工种名
SELECT last_name,e.job_id,job_title
FROM employees AS e,jobs AS j
WHERE e.`job_id` = j.`job_id`;
3.两个表的顺序是否可以调换
可以
SELECT e.last_name,e.job_id,j.job_title
FROM jobs AS j,employees AS e
WHERE e.`job_id` = j.`job_id`;
4.可以加筛选?
可以
#案例1:查询有奖金的员工名、部门名
SELECT last_name,department_name