史上最简单的 MySQL 教程(二十五)「数据的高级操作 之 查询(下)」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

数据的高级操作

查询数据(下)

having子句

having字句:where子句一样,都是进行条件判断的,但是where是针对磁盘数据进行判断,数据进入内存之后,会进行分组操作,分组结果就需要having来处理。思考可知,having能做where能做的几乎所有事情,但是where却不能做having能做的很多事情。

第 1 点:分组统计的结果或者说统计函数只有having能够使用

执行如下 SQL 语句,进行测试:

-- 求出表 student 中所有班级人数大于等于 2 的班级
select grade,count(*) from student group by grade having count(*) >= 2;
select grade,count(*) from student where count(*) >= 2 group by grade;
1

如上图所示,显然having子句可以对统计函数得到的结果进行筛选,但是where却不能。

第 2 点:having能够使用字段别名,where则不能

执行如下 SQL 语句,进行测试:

-- 求出表 student 中所有班级人数大于等于 2 的班级
select grade,count(*) as total from student group by grade having total >= 2;
select grade,count(*) as total from student where total >= 2 group by grade;
2

如上图所示,显然咱们的结论得到了验证。究其原因,where是从磁盘读取数据,而磁盘中数据的名字只能是字段名,别名是数据(字段)进入到内存后才产生的。值得注意的是,在上述 SQL 语句中咱们使用了字段别名,这在无意中就优化了 SQL 并提高了效率,因为少了一次统计函数的计算

order by子句

order by子句:根据某个字段进行升序或者降序排序,依赖校对集

  • 基本语法order by + [asc/desc];

其中,asc为升序,为默认值;desc为降序。

执行如下 SQL 语句,进行测试:

-- 将表 student 中的数据按年龄 age 进行排序
select * from student order by age;
3

此外,咱们可以进行「多字段排序」,即先根据某个字段进行排序,然后在排序后的结果中,再根据某个字段进行排序

执行如下 SQL 语句,进行测试:

-- 将表 student 中的数据先按年龄 age 升序排序,再按班级 grade 降序排序
select * from student order by age,grade desc;
4

limit子句

limit子句:是一种限制结果的语句,通常来限制结果的数量

  • 基本语法limit + [offset] + length;

其中,offset为起始值;length为长度。

第 1 种:只用来限制长度(数据量)

执行如下 SQL 语句,进行测试:

-- 查询表 student 中的全部记录
select * from student;
-- 查询表 student 中的 3 条记录
select * from student limit 3;
00

第 2 种:限制起始值,限制长度(数据量)

执行如下 SQL 语句,进行测试:

-- 查询表 student 中的记录
select * from student limit 0,2;
-- 查询表 student 中的记录
select * from student limit 2,2;
01

第 3 种:主要用来实现数据的分页,目的是为用户节省时间,提高服务器的响应效率,减少资源的浪费

大致设计:

  • 对于用户来讲,可以通过点击页码按钮,如123等来进行选择;
  • 对于服务器来讲,可以根据用户选择的页码来获取不同的数据。

其中,

  • length:表示每页的数据量,基本不变;
  • offset:表示每页的起始值,公式为offset=(页码-1)*length.

如果大家感兴趣的话,可以结合PHP或者其他语言进行测试。


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程心路

SSH框架之旅-struts2(1)

struts2 框架在 struts1 和 WebWork的技术上合并而来的,全新的struts2 框架是以 WebWork 框架为核心,采用拦截器的机制来处理...

703
来自专栏java闲聊

Activiti与SpringBoot (二)

1547
来自专栏java思维导图

数据库常见的面试题大全

触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可...

654
来自专栏同步博客

浅谈PHP异常处理

  PHP中的异常的独特性,即PHP中的异常不同于主流语言C++、java中的异常。在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有不...

723
来自专栏你不就像风一样

史上超全面的Elasticsearch使用指南

elasticsearch简写es,es是一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。

2952
来自专栏别先生

基于jsp+servlet图书管理系统之后台用户信息插入操作

前奏:   刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长...

1856
来自专栏蓝天

从程序员角度看ELF

原文:http://xcd.blog.techweb.com.cn/archives/222.html

794
来自专栏个人随笔

MySQL数据库设计

  mysql:    dbs  数据库系统    bdms  数据库管理系统    bda   数据库管理员    db    数据库    dba通过d...

25811
来自专栏屈定‘s Blog

Java--为什么需要主动关闭文件?

在Java编程中,对于一些文件的使用往往需要主动释放,比如InputStream,OutputStream,SocketChannel等等,那么有没有想过为什么...

1789
来自专栏性能与架构

mysql查询语句执行顺序

Mysql SQL查询处理的顺序: (8)select (9)distinct <select_list> (1)from <left_table> (3...

2695

扫码关注云+社区