一.多表连接的方式
1.内连接
连接两个表,通过相等或不等判断链接列,称为内链接。在内连接中典型的连接运算包括=,<>等,包括等值连接和自然连接。
SQL86:
等值连接
非等值连接
自连接
SQL99(语法结构改变,性能没有任何的提升):
交叉链接(CROSS JOIN)
内链接(INNER JOIN)
自然链接(MATURAL JOIN)
2.外连接
左外连接
右外连接
全外连接(mysql不支持)
二.笛卡尔乘积
1.两个集合X,Y。返回结果是两个集合元素数量的乘积
2.避免笛卡尔乘积
笛卡尔乘积产生的数据没有任何用,需要在where后面添加过滤条件。
三.连接语法
1.语法结构
select 表名1.列名,表名2.列名,
(两表的列名相同时前面加表名,不相同时可以不加,但加上可以提升检索的效率)
from 表名1,表名2
where 表名1.列名=表名2.列名
2.定义连接
当数据从多表中查询是,要使用连接条件。
3.连接原则
( 1)在写一个连接表的select语句时,在列名前面加表名或表别名使语义清楚,加快数据库的访问。
(2)连接n个表,至少有n-1个连接条件。
四.等值连接
1.等值连接也称为简单连接或内连接,通过等号来判断连接条件中的数据值是否相匹配。
2.除了连接外,还可以用where子句在连接中限制一个或多个表中的行
五.表别名
1.使用表别名简化查询语句的长度
2.别名命名原则
(1)表别名最多可以有30个字符
( 2)如果from子句中表别名被用于指定的表,那么整个select语句中都可以使用表别名。
(3)表别名应该有意义
(4)表别名只对当前的select语句有效
六.非等值连接
1.不使用等值连接的都属于等值连接
2.select 列名 from 表名1 ,表名2 where 列名 非等值条件
七.自连接
1.使用一个表连接它自身的操作
2.查询每个员工的名字和经理的名字
select work.last_name,manager.last_name from employees worker,employees manager where worker.manager_id=manager.employee_id
八.外连接
1.外连接是指查询出符合连接条件的数据同时还包含孤儿数据左外连接包含左表的孤儿数据,有外连接包含右表的孤儿数据,全外连接包含两个表的孤儿数据。
2.孤儿数据
孤儿数据是被连接的列的值为空的数据
3.外连接类型
左外:包含左表的孤儿数据
实列:查询员工名字和他们坐在部门称,包含哪些没有部门的员工
select e.last_name,d.department from employees e left outer join department d on e.department_id=d.department
右外:包含右表的孤儿数据
实列:用右连接查询员工的名字以及他们所在部门的名称,包含哪些没有员工的部门。
select e.last_name,d.department_name from employees e rigth outer join department d on e.department_id=d.department_id
全外:包含两个表的孤儿数据
实列:查询所有员工和部门,包含哪些没有没有员工的部门和么有部门的员工
select e.last_name,d.department_name from employees e full outer join dapartment d where e.partment_id=d.partment_id
九.Oracle扩展的外连接
1.在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不现实孤儿
数据而另一侧显示孤儿数据,这种写法只能在oracle数据库中使用
2.查询员工名字和他们坐在部门名称,包含哪些没有部门的员工
select e.last_name,d.department from employees e department d e.department_id = d.department(+)
3.查询员工的名字以及他们所在部门的名称,包含哪些没有员工的部门。
select e.last_name,d.department from employees e department d e.department_id (+) = d.department
十.SQL99的其他连接
1.交叉连接
2.自然连接(与等值连接的性能相同)
natural join连接两个表中的相同字段。
注意事项:
如果有多个列都相同,就都进行匹配,隐式的用and进行连接。
如果字段名相同,数据类型不同,将返回一个错误。
实列:
select d.department_id,department_name,
l.city from departments d natural join location l;
3.用using创建连接
(1)有多个列匹配时,using匹配唯一的列。
(2)某列在using中使用,引用该列时就不能表名或则别名
(3)natural join 和using是相互排斥的
实列:
查询location_id为1800的部门名称以及他们所在城市名称,指定location_id为连接列。
select d.department_name,l.city from department d join locations l using (location_id) where location_id=1800;
4.内链接 inner join
通过inner join建立连接,用inner join作为表的连接,用on子句给定连接条件。与等值连接没有性能优势
实列:查询员工id为202的员工名称,部门名称,以及工作的城市。
等值连接:
select e.last_name,d.department_name, l.city from employees e,department d, location l where e.department_id = d.partment_id and d.location_id =l.location and e.employee_id=202
内连接:
select e.last_name,d.department_name, l.city from employees e inner join department d on e.department_id = d.partment_id inner join location l d.location_id =l.location where e.employee_id=202