【数据库学习】十 连接查询--SQL99语法

相对于AQL92语法,更加推荐SQL99标准:支持内连接+外连接(左外和右外)+交叉连接。

语法:

	select 查询列表
	from 表1 别名 【连接类型】
	join 表2 别名 
	on 连接条件
	【where 筛选条件】
	【group by 分组】
	【having 筛选条件】
	【order by 排序列表】

分类:

内连接:inner
外连接
    左外:left 【outer】
    右外:right 【outer】
    全外:full【outer】
交叉连接:cross 

内连接 

语法:

select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;

特点:
①可以添加排序、分组、筛选
②inner可以省略
③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集 

等值连接

案例1:查询员工名和对应的部门名

已知员工名在表employees中,部门名在表departments中,两表通过department_id进行结联,如果使用SQL92的语法标准,那么:

SELECT last_name,department_name
FROM departments d ,employees e
WHERE e.`department_id` = d.`department_id`;

使用SQL99语法的话,应该为:

SELECT last_name,department_name
FROM departments d
INNER JOIN  employees e
ON e.`department_id` = d.`department_id`;

上面两个都对,执行结果一样:

 案例2.查询名字中包含e的员工名和对应的工种名(添加筛选)

SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.`job_id`=  j.`job_id`
WHERE e.`last_name` LIKE '%e%';

案例3: 查询部门个数>3的城市名和部门个数(添加分组+筛选)

先查询每个城市的部门个数,然后在此结果的基础上筛选满足条件的:

SELECT city,COUNT(*) 部门个数
FROM departments d
INNER JOIN locations l
ON d.`location_id`=l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;

案例4:查询员工名、部门名、工种名,并按部门名降序(添加三表连接)

SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN departments d ON e.`department_id`=d.`department_id`
INNER JOIN jobs j ON e.`job_id` = j.`job_id`
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`;

使用SQL99语法的话:

SELECT salary,grade_level
FROM employees e
INNER JOIN job_grades g
 ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

 案例2:查询每个工资级别的个数,并按照降序排列

 SELECT COUNT(*),grade_level
 FROM employees e
 JOIN job_grades j
 ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal` 
 GROUP BY grade_level
 ORDER BY grade_level DESC ;

自连接 

案例1:查询员工的名字、上级的名字

 SELECT e.last_name,m.last_name
 FROM employees e
 JOIN employees m
 ON e.`manager_id`= m.`employee_id`;

 外连接

应用场景:用于查询一个表中有,另一个表没有的记录

 特点:
 1、外连接的查询结果为主表中的所有记录
           如果从表中有和它匹配的,则显示匹配的值
           如果从表中没有和它匹配的,则显示null
           外连接查询结果=内连接结果+主表中有而从表没有的记录

主表:要查询内容大都在哪个表,哪个作为主表
 2、左外连接,left join左边的是主表
           右外连接,right join右边的是主表
 3、左外和右外交换两个表的顺序,可以实现同样的效果 
 4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

例如:查询在boys表中没有对应cp的女生名

左外连接

 SELECT g.name
 FROM beauty g
 LEFT OUTER JOIN boys b
 ON g.`CP_id` = b.`id`
 WHERE b.`id` IS NULL;

 案例2: 查询哪个部门没有员工

由于查询的是部门的名字,所以departments表作为主表:

左外连接:

 SELECT d.`department_name`
 FROM departments d
 LEFT OUTER JOIN employees e
 ON d.`department_id` = e.`department_id`
 WHERE e.`employee_id` IS NULL;

右外连接:

 SELECT d.*,e.employee_id
 FROM employees e
 RIGHT OUTER JOIN departments d
 ON d.`department_id` = e.`department_id`
 WHERE e.`employee_id` IS NULL;

全外连接(MySQL不支持 )

全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

交叉连接

笛卡尔乘积

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

猜你喜欢

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