#二、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';