1.链接查询分类sql
(1)表A inner join 表B:ui
表A与表B匹配的行会出如今结果中。spa
(2)表A left join 表B:code
表A与表B匹配的行会出如今结果中,外加表A中独有的数据,未对应的数据使用null填充。it
(3)表A right join 表B:class
表A与表B匹配的行会出如今结果中,外加表B中独有的数据,未对应的数据使用null填充。select
注意:即便没有外键约束,两表之间也能进行链接查询!!!!!语法
2.链接查询注意事项
数据
(1) 在查询或条件中推荐使用“表名.列名”的语法。查询
(2)若是多个表中列名不重复能够省略“表名.”部分。
(3)若是表的名称太长,能够在表名后面使用' as 简写名'或' 简写名',为表起个临时的简写名称。
3.实例:查询每一个学生每一个科目的分数
分析:学生姓名来源于students表,科目名称来源于subjects,分数来源于scores表,怎么将3个表放到一块儿查询,并将结果显示在同一个结果集中呢?
答:当查询结果来源于多张表时,须要使用链接查询。关键在于找到表间的关系,当前的关系是students表的id---scores表的stuid,subjects表的id---scores表的subid。
则上面问题的答案是:
select students.sname,subjects.stitle,scores.score from scores //此处将scores改成students或subjects皆可,固然这会影响到inner join处的语句 inner join students on scores.stuid=students.id //inner join 后的表必须与on后的语句相关,且不可与from语句后的表相同 inner join subjects on scores.subid=subjects.id;
结论:当须要对有关系的多张表进行查询时,须要使用链接join。
4.代码演示
查询学生的姓名、平均分 select students.sname,avg(scores.score) from scores inner join students on scores.stuid=students.id group by students.sname; //最后一句可改成group by stuid,这样改能够避免学生姓名重名带来的错误 //stuid其实能够不用加上scores的前缀,由于该字段只在scores中存在 //stuid进行分组时,因为一个id能肯定只对应一个学生name,所以学生name能够被获取显示;但因为一个学生id对应多行scores表数据,所以这多行数据只能被获取,没法被直接显示 查询男生的姓名、总分 select students.sname,avg(scores.score) from scores inner join students on scores.stuid=students.id where students.gender=1 group by students.sname; //此处说明group后的语句部分不用与from后的表名相关 查询科目的名称、平均分 select subjects.stitle,avg(scores.score) from scores inner join subjects on scores.subid=subjects.id group by subjects.stitle; 查询未删除科目的名称、最高分、平均分 select subjects.stitle,avg(scores.score),max(scores.score) from scores inner join subjects on scores.subid=subjects.id where subjects.isdelete=0 group by subjects.stitle;
6.子查询
子查询支持嵌套使用
查询未被删除的学号最小的学生的全部信息 select * from students where id=(select min(id) from students where isDelete=0);