GROUP BY
- 列函数对于group by字句定义的每个组各返回一个结果
- 如果用group by ,那么你的select语句中选出的列要么是你groupby里用到的列,要么就是带有count,sum,min等列函数的列。
查询所有同学的学号,选课数,总成绩
select student_id, count(course_id),sum(score)
from score
group by student_id
- group by语句后出现某个表的字段,select语句后要么是该字段,要么是别的表里的列或者带有函数的列。
查询所有同学的学号,姓名,选课数,总成绩
select s.student_id, stu.name, count(s.course_id),sum(s.score)
from score s, student stu
where s.student_id = stu.student_id
group by s.student_id
HAVING
- 通常和group by语句一起使用。
- where语句过滤行,having语句过滤组
- 出现的顺序,where>group by>having
查询平均成绩大于60分的同学的学号和平均成绩
select student_id ,avg(score)
from score
group by student_id
having avg(score) > 60
ORDER BY
ORDER BY子句中指定的列对上一步输出的虚拟表进行排列,返回新的虚拟表。还可以在ORDER BY子句中指定SELECT列表中列的序列号,如
select student_id , score
from score
order by 2,1;
等同于
select student_id , score
from score
order by score ,student_id ;
当然通常我们的用法是
ORDER BY create_time DESC;
LIMIT
应用LIMIT子句,表中选出从指定位置开始的指定行数据。对于没有应用ORDER BY的LIMIT子句,结果同样可能是无序的,因此LIMIT子句通常和ORDER BY子句一起使用。
LIMIT n, m
例如有表数据
//student1
student_id score
1 88
2 61
3 93
4 79
5 99
//student2
student_id score
1 43
2 68
3 91
4 71
6 65
left join
返回包括左表中的所有记录和右表中联结字段相等的记录
select * from student1
left join student2
on student1.student_id = student2.student_id
student_id | score | student_id(student2) | score(student2) |
---|---|---|---|
1 | 88 | 1 | 43 |
2 | 61 | 68 | |
3 | 93 | 3 | 91 |
4 | 79 | 4 | 71 |
5 | 99 | null | null |
right join
返回包括右表中的所有记录和左表中联结字段相等的记录
select * from student1
right join student2
on student1.student_id = student2.student_id
student_id | score | student_id(student2) | score(student2) |
---|---|---|---|
1 | 88 | 1 | 43 |
2 | 61 | 2 | 68 |
3 | 93 | 3 | 91 |
4 | 79 | 4 | 71 |
null | null | 6 | 65 |
inner join
只返回两个表中联结字段相等的行
select * from student1
inner join student2
on student1.student_id = student2.student_id
student_id | score | student_id(student2) | score(student2) |
---|---|---|---|
1 | 88 | 1 | 43 |
2 | 61 | 2 | 68 |
3 | 93 | 3 | 91 |
4 | 79 | 4 | 71 |
网友评论