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

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

数据的高级操作

查询数据(中)

where子句

where字句:用来判断数据和筛选数据,返回的结果为0或者1,其中0代表false1代表truewhere是唯一一个直接从磁盘获取数据的时候就开始判断的条件,从磁盘中读取一条数据,就开始进行where判断,如果判断的结果为真,则保存,反之,不保存。

判断条件

  • 比较运算符:><>=<=<>=likebetween andinnot in
  • 逻辑运算符:&&||、和!.

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

-- 查询表 student 中 id 为 2、3、5 的记录
select * from student where id = 2 || id = 3 || id = 5;
select * from student where id in (2,3,5); 
1
-- 查询表 student 中 id 在 2 和 5 之间的记录
select * from student where id between 2 and 5;
2

如上图所示,咱们会发现:在使用between and的时候,其选择的区间为闭区间,即包含端点值。此外,and前面的数值必须大于等于and后面的数值,否则会出现空判断,例如:

3

group by子句

group by子句:根据表中的某个字段进行分组,即将含有相同字段值的记录放在一组,不同的放在不同组

  • 基本语法group by + 字段名;

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

-- 将表 student 中的数据按字段 sex 进行分组
select * from student group by sex;
4

观察上图,咱们会发现:表student在分组过后,数据“丢失”啦!实际上并非如此,产生这样现象原因为:group by分组的目的是为了(按分组字段)统计数据,并不是为了单纯的进行分组而分组。为了方便统计数据,SQL 提供了一系列的统计函数,例如:

  • cout():统计分组后,每组的总记录数;
  • max():统计每组中的最大值;
  • min():统计每组中的最小值;
  • avg():统计每组中的平均值;
  • sum():统计每组中的数据总和。

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

-- 将表 student 中的数据按字段 sex 进行分组,并进行统计
select sex,count(*),max(age),min(age),avg(age),sum(age) from student group by sex;
5

其中,count()函数里面可以使用两种参数,分别为:*表示统计组内全部记录的数量;字段名表示统计对应字段的非null(如果某条记录中该字段的值为null,则不统计)记录的总数。此外,使用group by进行分组之后,展示的记录会根据分组的字段值进行排序,默认为升序。当然,也可以人为的设置升序和降序。

  • 基本语法group by + 字段名 + [asc/desc];

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

-- 将表 student 中的数据按字段 sex 进行分组,并排序
select sex,count(*) from student group by sex;
select sex,count(*) from student group by sex asc;
select sex,count(*) from student group by sex desc;
6

通过观察上面数个分组示例,细心的同学会发现:咱们在之前的示例中,都是用单字段进行分组。实际上,咱们也可以使用多字段分组,即:先根据一个字段进行分组,然后对分组后的结果再次按照其他字段(前提是分组后的结果中包含此字段)进行分组

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

-- 将表 student 中的数据先按字段 grade 进行分组,再按字段 sex 进行分组
select *,count(*) from student group by grade,sex;
7

在这里,函数group_concat(字段名)可以对分组的结果中的某个字段值进行字符串连接,即保留该组某个字段的所有值。例如:

-- 将表 student 中的数据按字段 sex进行分组,并保留字段 name 的值
select sex,age,count(*),group_concat(name) from student group by sex;
8

此外,简单介绍回溯统计的概念:利用with rollup关键字(书写在 SQL 语句末尾),可以在每次分组过后,根据当前分组的字段进行统计,并向上一级分组进行汇报。例如:

-- 将表 student 中的数据按字段 sex进行分组,并进行回溯统计
select sex,count(*) from student group by sex with rollup;
9

观察上图,咱们会发现:在进行回溯统计的时候,会将分组字段置空


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


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

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

如有侵权,请联系 zhuanlan_guanli@qq.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python学习路

三、模型(一)

当我们的程序涉及到数据库相关操作时,我们一般都会这么做: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调...

3739
来自专栏数说戏聊

07-08 创建计算字段使用函数处理数据第7章 创建计算字段第8章 使用函数处理数据

上述例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化...

782
来自专栏Java呓语

第9章、语言结构

字符串是包含在单引号(')或双引号(")字符中的字节或字符序列。 以下几行例子是等同的:

663
来自专栏Java3y

Mybatis【配置文件】

映射文件 配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为Ma...

2765
来自专栏架构师之旅

Oracle的常见问题汇总(2)——​ORACLE IN与EXISTS语句的区别

1、第一种解释方法: select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一...

1748
来自专栏数据和云

MySQL的前缀索引及Oracle的类似实现

MySQL有一个很有意思的索引类型,叫做前缀索引,它可以给某个文本字段的前面部分单独做索引,从而降低索引的大小。 其实,Oracle也有类似的实现,对于文本,它...

3405
来自专栏IT杂记

INET_ATON()函数在MySQL5.6版本和5.7版本的差异

问题 ### The error occurred while setting parameters ### SQL: insert into t_gatewa...

1749
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十九天-加强1-Junit&类加载&反射&Properties&BeanUtils&xml&动态代理&数据库【悟空教程】

第二十九天-加强1-Junit&类加载&反射&Properties&BeanUtils&xml&动态代理&数据库【悟空教程】

1086
来自专栏逸鹏说道

sql server实现自定义分割月功能

本文目录列表: 1、为何出现自定义分割月需求 2、sql server实现自定义分割月功能 3、测试验证效果 4、总结语 5、参考清单列表 1、为何出现自定义分...

3206
来自专栏维C果糖

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

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

1687

扫描关注云+社区