select、from、where、group by、having、order by、limit组合用法
一、关键词意义
【1】select 用来指定查询哪些列,可以使用聚合函数。
【2】from 用来指定查询哪张表。
【3】where用来指定过滤条件,针对原表,那么条件中的列名只能是是原表的列名,不可以是别名或者使用聚合函数。
【4】group by 用来对结果集进行分组,条件中的列可以使用原名,也可以使用别名。
【5】having 用来指定对分组后的数据进行再次过滤的条件,条件中的列可以使用原名,也可以使用别名。
【6】order by 对结果集中某一列进行排序,默认降序。有 asc 升序,desc 降序两种选择。条件中的列可以使用原名,也可以使用别名。
【7】limit 用来取出结果集中的某些行.limit m,n取出的是从第m+1行开始一共n行的数据。limit n相当于limit 0,n
oracle中返回前10条数据不用limit,而是用where rownum<=10;
二、sql语句编写顺序
select .. from ..是必须的,其他的关键词可选。
那么他们的组合顺序为
select ... from .. where ... group by ... having ... order by ... limit ...
三、sql语句执行顺序
【1】from 用于指定待查询的表
【2】where 由where后面的提交过滤表中的数据,形成结果集1
【3】group by 由后面的列对结果集1中的数据进行分组,形成结果集2
【4】having 对结果集2再次进行过滤,形成结果集3
【5】order by 对结果集3进行排序操作,形成结果集4
【6】limit 取结果集4中的某些行,返回最终结果集
四、一个简单的例子
(1)数据库建表语句
CREATE TABLE `t_score` (
`sc_id` int(11) NOT NULL auto_increment COMMENT '自增序号',
`sc_student_id` varchar(20) NOT NULL COMMENT '学号',
`sc_student_name` varchar(20) NOT NULL COMMENT '姓名',
`sc_course_name` varchar(50) NOT NULL COMMENT '课程名称',
`sc_course_credit` double(3,1) NOT NULL COMMENT '课程学分',
`sc_course_nature` varchar(10) NOT NULL COMMENT '课程性质',
`sc_score` varchar(10) NOT NULL COMMENT '总评成绩',
`sc_remark` varchar(20) default NULL COMMENT '备注',
`sc_gpa` double(3,1) default NULL COMMENT '绩点',
`sc_make_up_score` varchar(10) default NULL COMMENT '补考成绩',
`sc_rebuild_score` varchar(10) default NULL COMMENT '重修成绩',
`sc_class_name` varchar(20) NOT NULL COMMENT '班级',
`sc_class_belong` varchar(10) default NULL COMMENT '课程归属',
`sc_rebuild_mark` int(11) default NULL COMMENT '重修标记',
`sc_select_course_id` varchar(50) NOT NULL COMMENT '选课课号',
`sc_edu_year` varchar(12) NOT NULL COMMENT '学年',
`sc_edu_term` varchar(2) NOT NULL COMMENT '学期',
`sc_academy_name` varchar(20) NOT NULL COMMENT '学生所属学院',
PRIMARY KEY (`sc_student_id`,`sc_select_course_id`),
KEY `sc_id` (`sc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)数据截图,数据量还是比较大的,有15万条数据。
(3)查询嵌入式1511这个班级中,平均绩点高于2.6前三位同学以及他们的平均绩点
select sc_student_name as name,avg(sc_course_credit) as avg_credit from t_score where sc_class_name='嵌入式1511' group by name having avg_credit>2.6 order by avg_credit desc limit 0,3;
查询结果:
五、几点注意
【1】count
count(*)会返回结果集中的所有行数,即使有一行全为null,也会参与行数计算。
count(列名)当列名出现null值时,不会参与行数计算。
select 课程类别 ,sum(人数) from 选课表 where 班级='嵌入式1511' group by 课程类别;