mysql里多表查询和子查询
1. union查询,联合查询,用于合并两个或多个select语句的结果集。不常用。
union查询的要求是,两边select语句的字段数必须一致,两边可以有不同数据类型的字段,字段名默认按照左边的表来展示。
用法:select 字段名 from table1 union select 字段名 from table2。
2. inner join,内连接或交集查询。
select student.id, student.name, score.math from student inner score。
以上语句执行结果是一个笛卡尔集。
通常联表查询时会在笛卡尔集的基础上加上两个表的字段条件,如下所示。
select student.name, score.math from student inner join score on student.id = score.id。
显示全部字段的写法如下。
select student.*, score.* from student inner join score on student.id = score.id。
3. left join,左连接。
left join关键字会返回左表的所有行,如果右表中没有匹配的结果显示为null。
select student.*, score.* from student left join score on student.id = score.id。
4. right join,右连接。
右表有的都显示出来,左表中没有匹配的结果显示为null。
select student.*, score.* from student right join score on studnet.id = score.id。
5. 联表查询的一个综合应用,计算男生和女生的数学平均分。
select student.*, score.* from student inner join score on student.id = score.id。
select student.sex, group_concat(student.name), group_concat(score.math) from student inner join score on student.id = score.id group by student.sex。
select student.sex round(avg(score.math), 2) from student inner join score on student.id = score.id。
6. 三表查询。
三表查询其实就是在后面多加inner join或left join等。
select student.*, score.*, emp.* from student inner join score on student.id = score.id inner join student.id = emp.id。
7. 子查询。
查找每个城市,年龄最大的学生。
select * from student where birthday in (select min(birthday) from student group by city)。
查找学生数学成绩大于60分的学生。
select * from student where id in (select id from score where math > 60)。
查找学生数学成绩大于60分的学生和对应成绩。
select student.*, score.* from student inner join score on stduent.id = score.id where student.id in (select id from score where math > 60)。