mysql-sq199语法
语法
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.1、等值连接
案例1.查询员工名、部门名
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_tltle 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 CONT(*)>3;
案例4.查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序排名(添加排序)
#1.查询每个部门的员工个数 SELECT COUNT(*),department_name FROM employees e INNER JOIN departments d ON e.'department_id'=d.'department_id' GROUP BY department_name #2.在1的结果上筛选员工个数>3的记录,并排序 SELECT COUNT(*),department_name FROM employees e INNER JOIN departments d ON e.'department_id'=d.'department_id' GROUP BY department_name HAVING COUNT(*)>3 ORDER BY COUNT(*) DESC;
1.2、非等值连接
案例1.查询员工的工资级别
SELECT salary,grade_level FROM employees e JOIN job_grades g ON e.'salary' BETWEEN g.'lowest_sal' AND g.'highest_sal';
案例2.查询每个工资级别的个数>20的个数,并按工资级别降序排序
SELECT COUNT(*),grade_level FROM employees e JOIN job_grades g ON e.'salary' BETWEEN g.'lowest_sal' AND g.'highest_sal' GROUP BY grade_level HAVING COUNT(*)>20 ORDER BY grade_level DESC;
1.3、自连接
案例.查询员工的名字、上级的名字
SELECT e.last_name,m.last_name FROM employees e JOIN employees m ON e.'manager_id' = m.'employee_id';
2.外连接
/*
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
a.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
b.左外连接,left join 左边的是主表
右外连接,right join 右边的是主表
c.左外和右外交换两个表的顺序,实现同样的效果
d.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
*/
2.1、左外连接
案例.查询哪个部门没有员工
SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.'department_id' = e.'department-id' WHERE e.'employee_id' IS NULL;
2.2、右外连接
案例.查询哪个部门没有员工
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;
2.3、全外连接
3.交差连接