史上最简单的 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 条评论
登录 后参与评论

相关文章

来自专栏维C果糖

详述 SQL 中的 distinct 和 row_number() over() 的区别及用法

1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库...

2067
来自专栏Albert陈凯

2018-11-22 10 个实战及面试常用 Shell 脚本编写

注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格;多加注释说明。 3)命名建议规则:变量名大写、局部变量小写,函数名小写,名...

912
来自专栏PingCAP的专栏

TiDB 源码阅读系列文章(六)Select 语句概览

Select 语句只会讲解最简单的情况:全表扫描+过滤,暂时不考虑索引等复杂情况,更复杂的情况会在后续章节中介绍。语句为:

4518
来自专栏王旭的专栏

Web 开发 MYSQL 常用方法整理 (上)

最近在记录Web开发MYSQL常用方法,本篇记录希望数据插入、数据查询这两方面,,后面还会对数据更新以及如何在SQL中实现排行进行整理,希望对初期接触Web 开...

3780
来自专栏腾讯数据库技术

听原作者为你深度解读InnoDB批量建索引原理

2843
来自专栏恰同学骚年

Hadoop学习笔记—9.Partitioner与自定义Partitioner

  在第四篇博文《初识MapReduce》中,我们认识了MapReduce的八大步凑,其中在Map阶段总共五个步骤,如下图所示:

672
来自专栏小尘哥的专栏

要“鱼”也要“渔”-java手写代码生成器

思路:依然依赖mp组件,因为mp已经提供了对应的BaseService,BaseMapper等,但是本文重点不在于“怎么用”,而在于“怎么写”。“怎么写”属于自...

1132
来自专栏农夫安全

注入学习之sqli-labs-4(第三关)

前言 说明一下问什么没有less2、less3、less4的讲解? 前两篇如果你弄懂了,第2、3、4关卡原理都是一样的,无非是sql语句的稍微不同 比如: 第一...

3386
来自专栏L宝宝聊IT

数据库和表的管理

1353
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch DSL中Query与Filter的不同

Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询。 举个DSL例子 GET _search ...

2065

扫码关注云+社区