vlambda博客
学习文章列表

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)。