【数据库学习】九 连接查询--SQL92语法

连接查询又称多表查询,当查询的字段来自于多个表时,就会用到连接查询。

本例中使用两个表,分别为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`;

发布了169 篇原创文章 · 获赞 101 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/zzu_seu/article/details/100865380
今日推荐