考察点:left join 左外连接查询--以左表为主,左表中的所有数据均要显示,而右表中若有与之匹配的数据,则显示,若无,此时以null填充
知识点回忆:
连接查询:
1. 左外连接查询:left join
左表为主(左表中的所有数据均是结果所要的,而右表中若有与之匹配的数据,则显示,若无,此时以null填充)
2. 右外连接查询:right join
右表为主(右表中的所有数据均是结果所要的,左表中若有与之匹配的数据,则显示,若无,此时以null填充)
外连接的使用场景:不要滥用,题意中若出现以下字眼:eg:查询所有的xx;
3. 内连接查询: (inner) join -- 使用场景:从两表/多表中筛选出满足所有条件的数据
4. 等值连接查询: select xx from a,b where a.xx=b.xx
等值连接和内连接查询效果相同的,公司中通常用内连接
业务场景限制:
-
一个班级有多名学生,一名学生只属于一个班级
-
学生有可能没有成绩
题目:
-
查询所有人(包括没有成绩的学生)的课程分数(学号,姓名,性别,班级名称,语文分数,数学分数)
写sql的思路: 1. 若涉及多表查询,先确定表有哪些(从查询的字段确定)3表联查 SELECT stu_no,stu_name,stu_gender,class_name,chinese,math FROM student s JOIN class c ON s.class_id=c.id LEFT JOIN score sc ON s.id=sc.stu_id
-
查询语文分数比“张三”高的学生(学号,姓名,性别,班级名称,语文分 数)–3表联查
考点:嵌套查询(子查询) 1. 先查询出张三的语文分数 SELECT chinese FROM student s JOIN score sc ON s.id=sc.stu_id WHERE stu_name='张三' 多表内联查的语法: select xx from tableA join tableB join tableC on a.xx=b.xx and b.xx=c.xx SELECT stu_no,stu_name,stu_gender,class_name,chinese FROM student s JOIN class c JOIN score sc ON s.class_id=c.id AND s.id=sc.stu_id WHERE chinese> (SELECT chinese FROM student s JOIN score sc ON s.id=sc.stu_id WHERE stu_name='张三') 总结:多表联查中带条件查询语法顺序: select xx from a join b join c on a.xx=b.xx and b.xx=c.xx where xx>xx
-
查询各科都合格(分数>=60)的学生(学号,姓名,语文分数,数学分数) --2表联查
SELECT stu_no,stu_name,chinese,math FROM student s JOIN score sc ON s.id=sc.stu_id WHERE chinese>=60 AND math>=60
-
查询班级人数>=2的班级(班级编号,班级名称,人数)
查询每个xx的xx --通常都会涉及到使用分组 group by 很多情况下,聚合函数都会和分组(group by)配合使用 1. 需要查询出每个班级的人数 group by 班级 count(字段) 2. 对分组后的结果再次进行筛选,使用having关键字来筛选 SELECT class_id,class_name,COUNT(stu_no) cou FROM student s JOIN class c ON s.class_id=c.id GROUP BY class_id HAVING cou>=2
select match_date as '比赛日期',sum(if(Result = '胜',1,0)) as '胜',sum(if(Result = '负',1,0)) as '负' from match_record group by match_date;