例如:查询学生的信息[ 成绩、名字、班级 ]
我们给学生表添加一个学生信息,然后使用该学生的主键id来连表查询成绩、名字和班级。
insert into student (name,sex,age,class,description) values ('刘德华',1,17,406,''); select achievement,name,class from student as a inner join achievement as b on a.id=b.sid where id=101; # 上面语句因位该学生只在学生表student中有数据,而成绩表中没有数据,所以使用内连接,连表查询的结果是 Empty set (0.00 sec)同样,如果从表有数据,而主表没有数据,则使用内连接查询一样无法查询到结果。
#例如,添加一个成绩记录,是不存在学生 insert into achievement (sid,cid,achievement) values (102,10,85); select achievement,name,class from student as a inner join achievement as b on a.id=b.sid where >102; 右连接查询(right join)只要从表有数据,不管主表是否有数据,都会查询到结果。[以从表的结果为主]
查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充
select 字段1,字段2... from 主表 right join 从表 on 主表.主键=从表.外键例如,上面的成绩id为102的学生, 我们使用右连接查询。
select achievement,name,class from student as a right join achievement as b on a.> 左连接查询(left join)只要主表有数据,不管从表是否有数据都会被查询出来。
查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充
语法
select * from 表1 left join 表2 on 表1.列 = 表2.列例如,使用左连接查询学生表与成绩表,查询学生姓名及分数
select achievement,name,class from student as a left join achievement as b on a.id=b.sid; 等同于 select achievement,name,class from achievement as b right join student as a on a.>总结:
三种连表查询,最常用的是 left join,然后inner join保证数据的一致性。右连接基本上都是使用左连接代替。 多表关联 select 表.字段1,表.字段2,表.字段3..... from 主表 left join 从表1 on 主表.主键=从表1.外键 left join 从表2 on 主表.主键=从表2.外键 # 这里和从表2连接的on条件看实际情况,也会出现从表1.主键=从表2.外键的情况 left join 从表3 on 主表.主键=从表3.外键 # 这里可以是(从表1或从表2).主键=从表2.外键的情况 left join ... 多表查询的缺点多表查询的效率,性能比单表要差。
多表查询以后,还会带来字段多了会引起字段覆盖的情况、
主表student 从表1 achievement 从表2 course
name xxx name
上面三张表如果连表,则出现主表的name覆盖从表2的name这种情况。
上面两个问题:
把多表查询语句可以替换成单表查询语句【需要优化的情况】
把重复的字段名,分别使用as来设置成别的名称。