连接查询又称多表查询,当查询的字段来自于多个表时,就会用到连接查询。
本例中使用两个表,分别为beauty表和boys表,beauty表中存放有id,姓名,性别,出生日期,手机号,对应的CP_id。boys表中存放的有id和姓名。如果想要根据beauty表中的CP_id查询到boys中对应id的姓名,就会用到多表查询。
分类
按照年代进行分类:
sql92标准:仅仅支持内连接
sql99标准:支持内连接+外连接(左外和右外)+交叉连接
按照功能划分:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
等值连接
案例:根据beauty表中的CP_id查询boys表中对应id的姓名:
SELECT NAME,boyName FROM boys,beauty
WHERE CP_id = boys.`id`;
案例:根据employees表中`department_id`查询对应的部门名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;
案例:查询员工名、工种号、工种名
如果我们还按照上面的方法:
SELECT last_name,job_id,job_title
FROM employees,jobs
WHERE employees.`job_id`=jobs.`job_id`;
我们发现会报错:
原因是要显示的job_id是有歧义的们也需要进行限定,我们也需要用表名进行限定。
我们发现上面的情况比较复杂,需要好几次进行表名限定,表名还比较长,我们可以给表名起个别名:
SELECT last_name,e.job_id,job_title
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`;
注意:如果为表起了别名,那么用表名进行限定的时候就必须使用别名进行限定,而不能使用原来的表名。
添加筛选
案例:查询有奖金的员工名和部门名
SELECT last_name,department_name
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%';
加分组
案例:查询每个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY city;
案例:查询有奖金的每个部门的部门名,领导编号和部门的最低工资
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%'
ORDER BY department_name DESC;
非等值连接查询
这里介绍非等值连接查询,一个用户查询请求涉及到多个表的时候,连接两个表的条件为=时,就是等值连接查询;其他的运算符连接的就是非等值连接查询。
案例1:查询员工的工资和工资级别
首先看工资级别的划分方法:
进行非等值连接查询:
SELECT salary,grade_level
FROM employees e,job_grades j
WHERE salary BETWEEN j.`lowest_sal` AND j.`highest_sal`;
自连接查询
案例:查询 员工名和上级的名称
例如我们要查询101号员工Neena的上级名称,那么可以看到对应的manager_id为100,再去寻找employee_id为100的人为Steven,就是Neena的上级。
假装这是两个表,给表起两个别名:
SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;