连接查询
笛卡尔集
select name,boyName from beauty,boys;
会出现笛卡尔集
笛卡尔集出现错误情况
select count(*) from beauty;
假设输出12行
select count(*) from boys;
假设输出4行
最终结果 12*4=48行
发生原因:没有有效的约束条件
解决方法:添加有效的连接条件
分类
按年代分类
sql192标准 | 只支持内连接 |
---|---|
sql199标准(推荐) | 支持内连接+外连接(左外和右外连接)+交叉连接 |
按功能分类
内连接 | ||
---|---|---|
等值连接 | ||
非等值连接 | ||
自连接 | ||
外连接 | ||
左外连接 | ||
右外连接 | ||
全外连接 | ||
交叉连接 |
等值连接
案例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;
为表起别名的方式
好处:①提高语句的简洁度②区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
查询员工名,工种号,工种名
SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.job_id=j.job_id;
可以加筛选条件
查询有奖金的员工名,部门名 使用where and
SELECT last_name,department_name,commission_pct
FROM employees e,departments d
WHERE e.department_id=d.department_id
AND e.commission_pct IS NOT NULL;
查询城市名中第二个字符为o的部门名和城市名
SELECT department_name,city
FROM departments d,locations l
WHERE d.location_id=l.location_id
AND city LIKE ‘_o%’;
可以加分组条件 一般有关键词,“每”
案例1:查询每个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.location_id=l.location_id
GROUP BY city;
案例2:查询出有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT department_name,d.manager_id,MIN(salary)
FROM departments d,employees e
WHERE d.department_id=e.department_id
AND commission_pct IS NOT NULL
GROUP BY department_name,d.manager_id;
可以加排序
查询每个工种的工种名和员工的个数,并且按员工的个数降序
SELECT job_title,COUNT()
FROM employees e,jobs j
WHERE e.job_id=j.job_id
GROUP BY job_title
ORDER BY COUNT() DESC;
可以实现三表连接
查询员工名,部门名和所在的城市带s
SELECT last_name, department_name, city
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND city LIKE “%s%”;
多表连接
①多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有子句使用,比如排序,分组,筛选
非等值连接
查询员工工资和工资级别
SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal;
自连接
当员工表中的数据,比如查询员工的名字,查询他的领导,查询它的名字,查询对应的id,再去查询员工表中的id,查询出领导名
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;