多表查询
等值连接:
表先做笛卡尔积,在进行筛选,筛选条件为等值筛选
查询员工名字以及部门
select s1.last_name,s2.name from s_emp s1,s_dept s2 where s1.dept_id=s2.id;
(量表的公共字段必须声明表名,非公共字段可以不写,为提高可读性,建议都写)
不等值连接
where后面条件用非等于号连接(<,>,<>,!=,>=,<=)
自连接
自己连接自己
select s1.last_name,s2.last_name manager from s_emp s1,s_emp s2 where s1.manager_id=s2.id;
外连接(sql92):
左外连接
select s1.last_name,s2.name from s_emp s1,s_dept s2 where s1.dept_id=s2.id(+);
显示所有员工名字与其对应的部门,以及没有部门的员工名字(s1单独存在,在s2中没有id与s1中的dept_id对应)
右外连接
select s1.last_name,s2.name from s_emp s1,s_dept s2 where s1.dept_id(+)=s2.id;
显示所有员工名字与其对应的部门,以及没有员工的部门名字(s2单独存在,在s1中没有dept_id与s2中的id对应)
自然连接(sql99):
笛卡尔积:(cross join 专门用来查看笛卡尔积)
select * from s_emp cross join s_dept;
筛选:
等值筛选(要筛选的字段名必须相同)
(natural join 按照两表所有同名同值字段进行筛选)
select * from s_emp natural join s_dept;
(inner join…using(字段))按照指定字段名相同去筛选
select * from s_emp inner join s_dept using (id);
按照两表的id值相同进行筛选
(inner join…on 字段a=字段b)按照指定字段进行筛选(字段名不需要相同)
select * from s_dept s1 inner join s_emp s2 on s1.id=s2.dept_id;
查找s_emp的idept_id与s_dept的id
外连接(outer join)outer可以省略
左外连接
select * from s_dept s1 left outer join s_emp s2 on s1.id=s2.dept_id;
显示所有员工名字与其对应的部门,以及没有部门的员工名字(s1单独存在,在s2中没有id与s1中的dept_id对应)
右外连接
select * from s_dept s1 right outer join s_emp s2 on s1.id=s2.dept_id;
显示所有员工名字与其对应的部门,以及没有员工的部门名字(s2单独存在,在s1中没有dept_id与s2中的id对应)
全外连接
select * from s_dept s1 full outer join s_emp s2 on s1.id=s2.dept_id;
显示所有员工名字与其对应的部门,以及没有员工的部门名字和没有部门的员工名字