sql 99标准
语法:
select 查询列表
from 表1 别名 [连接类型]
join 表2 别名
on 表间连接条件
[where 筛选条件]
[group by分组]
[having 筛选条件]
[order by 排序列表]
内连接
分类:等值、非等值、自连接
特点:可添加排序、分组;inner可省略;inner join和 sql92语法中等值连接是一样的
语法:
select 查询列表
from 表1 别名
[innner] join 表2 别名
on 连接条件
#查询员工名、部门名
SELECT e.last_name,d.department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`;
#查询名字中包含e的员工名和工种名
SELECT e.last_name ,j.job_title
FROM employees e
INNER JOIN jobs j
ON e.`job_id`=j.`job_id`
WHERE e.`last_name` LIKE '%e%';
#查询部门个数>3的城市名和部门个数
SELECT city,COUNT(*)
FROM locations l
INNER JOIN departments d
ON l.`location_id`=d.`location_id`
GROUP BY city
HAVING COUNT(*)>3;
#查询员工名、部门名、工种名,并按部门名降序
SELECT last_name,department_name,job_title
FROM employees e JOIN jobs j ON e.`job_id`=j.`job_id` #inner被省略
JOIN departments d ON d.`department_id`=d.`department_id`
ORDER BY job_title DESC;
#查询员工得名字和上级的名字
SELECT e.last_name,m.last_name
FROM employees e
INNER JOIN employees m
ON e.`manager_id`=m.`employee_id`;
外连接
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
1 外连接的查询结果为主表中的所有记录
1)如果从表中有和它匹配的,则显示匹配的值
2)如果从表中没有和它匹配的,则显示null
3)外连接查询结果 = 内连接查询结果 + 主表中有而从表没有的记录
2 左外连接:left join 左边的是 主表
右外连接,right join 右边的是主表
3 左外和右外交换两个鼠标的顺序,可以实现同样的效果
#查询没有员工的部门
SELECT department_name ,last_name
FROM departments d
LEFT JOIN employees e
ON e.`department_id`=d.`department_id`
WHERE last_name IS NULL;
注:mysql 不支持全外连接
交叉连接 cross join : 笛卡尔乘积
总结: