【数据库】select、from、where、group by、having、order by、limit的组合用法

29 篇文章 42 订阅

         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值时,不会参与行数计算。

【2】select与group by的一个原则

当select后出现的列中没有使用到聚合函数时,那么尽量出现在group by中。否则的话,查询会变得没有意义。比如查询课程分类下的选课人数 

select 课程类别 ,sum(人数) from 选课表 where 班级='嵌入式1511' group by 课程类别;

【3】待补充

  • 17
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
group by、order by和limit是SQL查询语句中常用的关键字,用于对查询结果进行分组、排序和限制返回的记录数量。 按照引用中提到的优先级顺序,group by的优先级最高,其次是order by,最后是limit。这意味着在执行查询时,先应用group by对结果进行分组,然后再按照order by指定的条件进行排序,最后通过limit限制返回的记录数量。 根据引用中提到的执行顺序,先执行from子句,然后依次执行where、group by、havingselectorder by和limit。这意味着在查询语句中,group by应该在order by和limit之前使用。 而根据引用中提到的语法顺序,select应该在from、where、group by、havingorder by和limit之前使用。 综上所述,正确的使用顺序是先使用group by对结果进行分组,然后使用order by对分组后的结果进行排序,最后使用limit限制返回的记录数量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [select 与 where、group by、order by、limit 子句执行优先级比较](https://blog.csdn.net/challenglistic/article/details/128987155)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [mysqlselect、from、where、group by、havingorder by 、limit执行顺序](https://blog.csdn.net/J_M_S_H_T/article/details/119423764)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunAlwaysOnline

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值