主要目的:
①表关联查询时,被关联的表 (就是没有外键的那个表) 需要使用多次(起多个别名) ,
这个表中的主键是一个复合主键(其中一个是那个外键,另一个是自己的一个...),
我们想得到这个关联的信息,同时条件是...,
还要 把这些数据在一行记录中显示!
②当第二个表中的数据不存在时,对应记录显示null(mesg) ,
同时 不会影响已查出来的数据。
(即,不会因为这个条件不符和,使查处的记录数为零)
(这个条件是AND C.stauts=2 )
具体意思直接看代码!
------------------------------------------------------------------------------------
创建表和数据:
create table studentMesg
(
id varchar(3),
stauts int,
mesg varchar(10),
primary key(id ,stauts)
);
insert into studentMesg values('001',1,'TomMesg1');
insert into studentMesg values('001',2,'TomMesg2');
insert into studentMesg values('001',3,'TomMesg3');
insert into studentMesg values('002',1,'JeckMesg1');
+-----+--------+-----------+
| id | stauts | mesg |
+-----+--------+-----------+
| 001 | 1 | TomMesg1 |
| 001 | 2 | TomMesg2 |
| 001 | 3 | TomMesg3 |
| 002 | 1 | JeckMesg1 |
+-----+--------+-----------+
create table student
(
id varchar(3) primary key,
name varchar(10),
age int,
foreign key(id) references studentMesg(id)
);
insert into student values('001','Tom',23);
insert into student values('002','Jeck',23);
insert into student values('003','Marry',23);//无法插入
+-----+------+------+
| id | name | age |
+-----+------+------+
| 001 | Tom | 23 |
| 002 | Jeck | 23 |
+-----+------+------+
------------------------------------------------------------------------------------------
执行查询:
SELECT A.id, A.name, A.age,B.mesg,C.mesg from Student AS A
LEFT OUTER JOIN studentMesg AS B
ON A.id = B.id
AND B.stauts=1
LEFT OUTER JOIN studentMesg AS C
ON A.id = C.id
AND C.stauts=2
WHERE A.id ='001 ';
结果1
+-----+------+------+----------+----------+
| id | name | age | mesg | mesg |
+-----+------+------+----------+----------+
| 001 | Tom | 23 | TomMesg1 | TomMesg2 |
+-----+------+------+----------+----------+
结果1, 说明:通过这种方式,表关联时,我们可以把数据整合在一行。
--------------------------------------------------------------------
SELECT A.id, A.name, A.age,B.mesg,C.mesg from Student AS A
LEFT OUTER JOIN studentMesg AS B
ON A.id = B.id
AND B.stauts=1
LEFT OUTER JOIN studentMesg AS C
ON A.id = C.id
AND C.stauts=2
WHERE A.id ='002 ';
结果2
+-----+------+------+-----------+------+
| id | name | age | mesg | mesg |
+-----+------+------+-----------+------+
| 002 | Jeck | 23 | JeckMesg1 | NULL |
+-----+------+------+-----------+------+
结果2, 说明:不会因为C中没有002的数据,从而使整个数据不存在。
写SQL时,一定要注意SQL条件的位置,是在JONI ON里面,还是在
最外面的WHERE里面。
在里面时,连接的数据如果不存在,也会查出数据,只是连接内容为空 ,
一定注意!!!
(以上内容2010年10月22日更新 )