6.MYSQL-DQL查询语言学习-连接查询-SQL99语法

#二、SQL99语法
/*
语法:
		 SELECT 查询列表
		 FROM 表1 别名 【连接类型】
		 JOIN 表2 别名 
		 ON 连接条件
		 【WHERE 筛选条件】
		 【GROUP BY 分组】
		 【HAVING 筛选条件】
		 【ORDER BY 排序列表】
分类:
内连接 :INNER
外连接(左外连接:LEFT [OUTER] ;右外连接 RIGHT [OUTER] ;全外 FULL OUTER)
交叉连接:CROSS

*/
#1.内连接
/*
语法:
SELECT 查询列表
FROM 表1 别名 
INNER JOIN 表2 别名
ON 连接条件
分类:
等值
非等值连接
自连接

特点:
1.添加排序,分组,筛选
2.INNER可以省略
3.筛选条件放在WHERE后面,连接条件放在ON后面,提高了分离性,便于阅读
4.INNER JOIN连接与SQL 92语法中的等值连接效果是一样的,都是查询多表交集部分

*/
#1.等值连接
#案例1:查询员工名,部门名
SELECT
	last_name,
	department_name 
FROM
	employees E
	INNER JOIN departments D 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
	last_name LIKE '%E%';
	
#查询部门个数为3的城市名和部门个数(添加分组和筛选)
SELECT
	COUNT( department_id ),
	city 
FROM
	departments D
	INNER JOIN locations L ON D.location_id = L.location_id 
GROUP BY
	city 
HAVING
	COUNT( department_id ) = 3;

#案例4:查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)
SELECT
	COUNT( employee_id ) ,
	department_name
FROM
	departments D
	INNER JOIN employees E
	ON E.department_id=D.department_id
GROUP BY department_name
HAVING
	COUNT( employee_id ) > 3 
ORDER BY
	COUNT( employee_id ) DESC;

#案例5:查询员工名,部门名,工种名,并按部门名降序
SELECT
	last_name,
	department_name,
	job_title 
FROM
	employees E
	INNER JOIN departments D
	ON D.department_id = E.department_id
	INNER JOIN jobs J 
	ON E.job_id = J.job_id 
ORDER BY
	department_name DESC;

#二、非等值查询
#查询员工的工资级别
SELECT
	salary,
	GRADE_LEVEL 
FROM
	employees E
	INNER JOIN job_grades J ON E.salary BETWEEN LOWEST_SAL 
	AND HIGHEST_SAL;
#查询每个工资级别的个数大于20,并且进行降序排序
SELECT
	count( employee_id ) ,
	GRADE_LEVEL 
FROM
	employees E
	INNER JOIN job_grades J ON E.salary BETWEEN LOWEST_SAL 
	AND HIGHEST_SAL 
GROUP BY
	GRADE_LEVEL 
HAVING COUNT(employee_id)>20
ORDER BY
	count( employee_id );

#案例6:查询姓名中包含字符‘K’的员工的名字、上级的名字
SELECT
	M.last_name,
	M.employee_id,
	E.last_name,
	E.manager_id 
FROM
	employees E
	INNER JOIN employees M ON E.employee_id = M.manager_id
WHERE M.last_name LIKE '%K%';
	
#二、外连接
/*
应用场景:
用于查询一个表中有,另一个表没有的记录
特点:
1.外连接的查询结果为主表中的所有记录
如果从表中有和他匹配的,则显示匹配的值
如果从表中没有和他匹配的,则显示NULL值
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left左边的是主表
右外连接,right右边的是主表
3.左外和右外交换两表的顺序,可以实现同样的效果
4.全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表1中没有的
*/
#案例1:查询哪个部门没有员工
#左外
SELECT
	d.*,
	E.employee_id 
FROM
	departments D
	LEFT OUTER JOIN employees E ON D.department_id = E.department_id 
WHERE
	employee_id IS NULL;
	
#全外:
/*
USE GIRLS;
SELECT B.*,BO.*
FROM BEAUTY B
FULL OUTER JOIN BOYS BO 
ON B.BOYFRIEND = BO.ID;

*/
#交叉连接
SELECT
	B.*,
	BO.* 
FROM
	BEAUTY B
	CROSS JOIN BOYS BO;
#SQL92和SQL99 PK
功能:SQL99支持的功能较多
可读性:SQL99实现连接条件和筛选条件的分离,可读性较高

测试题:

#1.查询哪个城市没有部门
SELECT
	L.city,
	D.department_id 
FROM
	locations L
	LEFT OUTER JOIN departments D ON D.location_id = L.location_id 
WHERE
	department_id IS NULL;
#2.查询部门名为BAL或IT的员工信息
SELECT
	E.*,
	department_name 
FROM
	departments D 
	LEFT OUTER JOIN employees E ON E.department_id = D.department_id 
WHERE
	department_name = 'SAL' 
	OR department_name = 'IT';
发布了25 篇原创文章 · 获赞 2 · 访问量 5452

猜你喜欢

转载自blog.csdn.net/qq_41644888/article/details/104771152
今日推荐