MySQL入门基础教程大全(9)

MySQL入门基础教程大全

select 字段1,字段2... from 主表 inner join 从表 on 主表.主键=从表.外键

例如:查询学生的信息[ 成绩、名字、班级 ]

我们给学生表添加一个学生信息,然后使用该学生的主键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填充

MySQL入门基础教程大全

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填充

MySQL入门基础教程大全

语法

select * from1 left join2 on1.列 = 表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来设置成别的名称。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e89071a8349d877d32dc0f176eafdb36.html