一、等值连接
/*
①多表的等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③多表的顺序没有要求
④一般需要起别名
⑤可以搭配所有子句使用,比如排序,分组,筛选
*/
select 。。。。。。
from。。。。。。
where 表1名.列名 = 表2名.列名
当表名过长,过多的时候,最好起别名
可以这样 from 表1名 别名1,表2名 别名2
而且select 列名(列名如果存在于两个表中,则在前加上表名.,否则会报错)
二、非等值连接
我个人认为非等值连接的意思就是表面看上去列名不同但还是有某种对应的关系(映射)
比如员工工资和工资级别
筛选条件就可以写成where salary between sal_level.low_sal and sal_level.high_sal
三、自连接
多次使用表中的某些列,注意给表起别名区分
四、sql99语法
/*
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 链接条件
【where 筛选条件】
【group by分组条件】
【having 筛选条件】
【order 】
连接类型分类:
内连接:innner
外连接:
左外:left 【outer】
右外:right 【outer】
全外:full【outer】
交叉连接:cross
*/
①内连接
语法:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;
特点
添加排序、分组、筛选
inner可以省略
筛选条件可放在where后面,连接条件放在on后面,提高分离性,便于阅读
inner join连接在sql92语法中的等值连接效果一样,都是查询多表的交集
分类:
等值,非等值,自连接
//查询员工名,部门名
select last_name,department_name
from employee e
inner join departments d
on e.department_id = d.department_id;
//查询名字中包含e的员工名和工种名
selsect last_name,job_title
from employee e
inner join jobs j
on e.job_id = j.job_id
where e.last_name like '%e%';
//查询部门个数>3的城市名和部门个数
select city,count(*) 部门个数
from departments d
inner join locations l
on d.location_id = l.location_id
group by city
having count(*)>3;
//查询哪个部门的员工个数>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 conunt(*) desc;