连接查询
班级Class表的数据:
id | number |
1 | 032011 |
2 | 032012 |
3 | 032013 |
学生表student的数据:
id | name | classid |
1 | Li | 1 |
2 | Zhang | 1 |
3 | Yao | 1 |
4 | Qian | 2 |
5 | Liu | 2 |
6 | Chen | 3 |
7 | Qiu | null |
表随便做的,只为说明事情。学生表的classid字段参照Class表的id字段。
连接有内连接,外连接,交叉连接三种。交叉就是不带ON的连接查询,返回的是两表的笛卡尔积,外连接有左外,右外和全外三种。内连接的形式就像下面这样:
FROM
TABLE_a
INNER
JOIN
TABLE_b
[
ON join_condition
]
我用的SQL Server数据库,一定要有ON子句。ON是用来指定连接条件的,我们经常用的Where是用来指定查询条件的,这里先做一个等值内连接:(连接条件:c.id = s.classid )
select
*
from
class
as
c
inner
join
student
as
s
on
c.id
=
s.classid ;
不等值的情况就是把连接条件改成:c.id != s.classid。我们经常写语句是这样的:
select
*
from
class
as
c, student
as
s
where
c.id
=
s.classid ;
其实和上面的等价。内连接返回的是符合连接条件和查询条件的行,而外连接返回的是符合查询条件但并不一定符合连接条件的行,返回的结果集中会包含左表(左外连接)或者右表(右外连接)或者两表(全外连接)中符合查询条件但不符合连接条件的行。外连接的语法:
FROM
TABLE_a
FULL
|
RIGHT
|
LEFT
OUTER
JOIN
TABLE_b
[
ON join_condition
]
结果跑出来就知道怎么回事,如果你使用左连接,那么除符合查询条件的行以外,还有包含剩余的左表数据的行,这些行对应右表的字段全为NULL。其它的情况依此类推。你也可以使用where来指定连接条件,其中*=表示左连接,=*表示右连接。