联表查询分分为3类:
- 内连接
- 外连接
- 交叉连接
在查询多个表时,我们经常会用到“连接查询”;
连接是关系数据库的主要特点,也是它区别于其它类型数据库的一个标志;
连接一般是用作关联两张或两张以上的数据表时用的;
- 概念: 根据两个表或多个表的列之间的关系,从这些表中查询数据
- 目的: 实现多个表查询操作
连接标准语法:
FROM join_table join_type join_table[ON (join_condition)];
- 其中
join_table
指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。join_type
指出连接类型。join_condition
指连接条件。
- 其中
内连接
使用比较运算符(包括=
、>
、<
、<>
、>=
、<=
、!
>和!<
)进行表间的比较操作,查询与连接条件相匹配的数据。根据比较运算符不同,内连接分为等值连接和不等连接两种。
- 仅将两个表中满足连接条件的行组合起来作为结果集。
关键字:
inner join
等值连接
概念:在连接条件中使用等于号(
=
)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。select * from T_student s,T_class c where s.classId = c.classId 等于 select * from T_student s inner join T_class c on s.classId = c.classId
不等连接
概念:在连接条件中使用除等于号之外运算符(
>
、<
、<>
、>=
、<=
、!>
和!<
)。select * from T_student s inner join T_class c on s.classId <> c.classId
自然连接
- 它将表中具有相同名称的列自动进行记录匹配,自然连接不必指定任何同等连接条件。
- 自然连接自动判断相同名称的列,而后形成匹配。
缺点:虽然可以指定查询结果包括哪些列,但是不能人为地指定哪些列被匹配。另外,自然连接的一个特点是连接后的结果表中匹配的列只有一个。如上,在自然连接后的表中只有一列C。
外连接
外连接分为:
- 左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)
- 右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)
全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)
我们就简单的叫:左连接、右连接和全连接。左连接
概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值
null
。select * from T_student s left join T_class c on s.classId = c.classId
总结:左连接显示左表全部行,和右表与左表相同行。
右连接
概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值
null
。select * from T_student s right join T_class c on s.classId = c.classId
总结:右连接恰与左连接相反,显示右表全部行,和左表与右表相同行。
全连接
概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值
null
。select * from T_student s full join T_class c on s.classId = c.classId
总结:返回左表和右表中的所有行。
!注意:
mysql 暂时不支持全外连接。
交叉连接(笛卡尔积)
- 概念:当多表关联时,如果没有写关联条件,返回的结果集是这几张表条目数的乘积,就叫做笛卡尔积
多数情况下,笛卡尔积是无意义的,非常耗费资源,要尽量避免。
select * from T_student, T_class
总结:相当与笛卡尔积,左表和右表组合。
自连接
最后说一下自连接:
自连接是为了解决同类数据类型,但是又存在上下级关系的树状结构数据时使用。
- 使用场景:当前表的一条记录可以对应当前表的多条记录。
!自连接需要设置别名,否则无法查出正确结果集。