(七)连接查询
含义:多表查询,当查询字段来自多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2 有n行,结果m*n行
发生原因:没有有效的连接条件
避免原因:添加有效的连接条件
分类:
1.按年份分类:sql92标准(仅支持内连接),sql99标准【推荐】(支持内连接、左外连接、右外连接、交叉连接)
2.外连接:左外连接,右外连接,全外连接
3.交叉连接
select * from beauty;
#12行
select * from boys;
#4行
select name,boyName from boys,beauty;
#48行,相当于用第一张表每一行的内容去匹配第二张每一条,最终结果是第一张表的行数乘以第二张表的行数(笛卡尔乘积现象),结果是不对的
select name,boyName from boys,beauty
where beauty.boyfriend_id=boys.id;
一、sql92连接
<1>等值连接
1.等值连接介绍
/*
(1)多表的等值连接为多表的交集
(2)n表连接至少需要n-1个连接条件
(3)多表连接的顺序没有要求
(4)一般需要为表起别名
(5)可以搭配之前所学的语句,比如排序、分组、筛选
*/
#例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,employees.job_id,job_title
from employees,jobs
where employees.job_id=jobs.job_id;
#select语句中的job_id需要用employees来限定,不然会导致歧义
#若表名比较长,反复调用麻烦,可为表起别名
select last_name,e.job_id,job_title
from employees e,jobs j
where e.job_id=j.job_id;
3.两个表的顺序可以调换
#例:查询员工名,工种号,工种名
select last_name,employees.job_id,job_title
from jobs,employees
where employees.job_id=jobs.job_id;
4.可以加筛选
#例1:查询有奖金的员工名、部门名
select last_name,department_name
from employees e,departments d
where e.department_id=d.department_id
and e.commission_pct is not null