mysql分组条件有null_mysql的排序、分组、null的处理



一、排序

如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪中方式来进行排序,再返回搜索结果。

本章节使用的数据库结构及数据下载:RUNOOB.sql。

语法

以下是 SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:

SELECT field1,field2,...fieldN table_name1,table_name2...ORDER BY field1,[field2...][ASC[DESC]]

你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。

你可以设定多个字段来排序。

你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。

你可以添加 WHERE...LIKE 子句来设置条件。

二、分组

在命令提示符中使用 ORDER BY 子句

以下将在 SQL SELECT 语句中使用 ORDER BY 子句来读取MySQL 数据表 runoob_tbl 中的数据:

实例

尝试以下实例,结果将按升序排列

root@host# mysql -u root -p password;Enterpassword:*******mysql>useRUNOOB;Databasechanged

mysql>SELECT*fromrunoob_tbl ORDER BY runoob_author ASC;+-----------+---------------+---------------+-----------------+|runoob_id|runoob_title|runoob_author|submission_date|+-----------+---------------+---------------+-----------------+|2|LearnMySQL|AbdulS|2007-05-24||1|LearnPHP|JohnPoul|2007-05-24||3|JAVATutorial|Sanjay|2007-05-06|+-----------+---------------+---------------+-----------------+3rowsinset(0.00sec)mysql>SELECT*fromrunoob_tbl ORDER BY runoob_author DESC;+-----------+---------------+---------------+-----------------+|runoob_id|runoob_title|runoob_author|submission_date|+-----------+---------------+---------------+-----------------+|3|JAVATutorial|Sanjay|2007-05-06||1|LearnPHP|JohnPoul|2007-05-24||2|LearnMySQL|AbdulS|2007-05-24|+-----------+---------------+---------------+-----------------+3rowsinset(0.00sec)mysql>

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

GROUP BY 语法SELECT column_name,function(column_name)FROM table_name

WHERE column_nameoperatorvalue

GROUP BY column_name;

实例演示

本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。SET NAMES utf8;SET FOREIGN_KEY_CHECKS=0;--------------------------------Tablestructurefor`employee_tbl`------------------------------DROP TABLE IF EXISTS`employee_tbl`;CREATE TABLE`employee_tbl`(`id`int(11)NOT NULL,`name`char(10)NOT NULL DEFAULT'',`date`datetime NOT NULL,`singin`tinyint(4)NOT NULL DEFAULT'0'COMMENT'登录次数',PRIMARY KEY(`id`))ENGINE=InnoDBDEFAULT CHARSET=utf8;--------------------------------Recordsof`employee_tbl`------------------------------BEGIN;INSERT INTO`employee_tbl`VALUES('1','小明','2016-04-22 15:25:33','1'),('2','小王','2016-04-20 15:25:47','3'),('3','小丽','2016-04-19 15:26:02','2'),('4','小王','2016-04-07 15:26:14','4'),('5','小明','2016-04-11 15:26:40','4'),('6','小明','2016-04-04 15:26:54','2');COMMIT;SET FOREIGN_KEY_CHECKS=1;

导入成功后,执行以下 SQL 语句:mysql>setnames utf8;mysql>SELECT*FROM employee_tbl;+----+--------+---------------------+--------+|id|name|date|singin|+----+--------+---------------------+--------+|1|小明|2016-04-2215:25:33|1||2|小王|2016-04-2015:25:47|3||3|小丽|2016-04-1915:26:02|2||4|小王|2016-04-0715:26:14|4||5|小明|2016-04-1115:26:40|4||6|小明|2016-04-0415:26:54|2|+----+--------+---------------------+--------+6rowsinset(0.00sec)

接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:mysql>SELECT name,COUNT(*)FROM employee_tbl GROUP BY name;+--------+----------+|name|COUNT(*)|+--------+----------+|小丽|1||小明|3||小王|2|+--------+----------+3rowsinset(0.01sec)

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:mysql>SELECT name,SUM(singin)assingin_count FROM employee_tbl GROUP BY name WITH ROLLUP;+--------+--------------+|name|singin_count|+--------+--------------+|小丽|2||小明|7||小王|7||NULL|16|+--------+--------------+4rowsinset(0.00sec)

其中记录 NULL 表示所有人的登录次数。

我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:selectcoalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

以下实例中如果名字为空我们使用总数代替:mysql>SELECT coalesce(name,'总数'),SUM(singin)assingin_count FROM employee_tbl GROUP BY name WITH ROLLUP;+--------------------------+--------------+|coalesce(name,'总数')|singin_count|+--------------------------+--------------+|小丽|2||小明|7||小王|7||总数|16|+--------------------------+--------------+4rowsinset(0.01sec)三、为null我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

为了处理这种情况,MySQL提供了三大运算符:IS NULL: 当列的值是NULL,此运算符返回true。

IS NOT NULL: 当列的值不为NULL, 运算符返回true。

<=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。

MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。

在命令提示符中使用 NULL 值

以下实例中假设数据库 RUNOOB 中的表 tcount_tbl 含有两列 runoob_author 和 runoob_count, runoob_count 中设置插入NULL值。

实例

尝试以下实例:root@host# mysql -u root -p password;Enterpassword:*******mysql>useRUNOOB;Databasechanged

mysql>create table tcount_tbl->(->runoob_author varchar(40)NOT NULL,->runoob_count INT->);QueryOK,0rows affected(0.05sec)mysql>INSERT INTO tcount_tbl->(runoob_author,runoob_count)values('mahran',20);mysql>INSERT INTO tcount_tbl->(runoob_author,runoob_count)values('mahnaz',NULL);mysql>INSERT INTO tcount_tbl->(runoob_author,runoob_count)values('Jen',NULL);mysql>INSERT INTO tcount_tbl->(runoob_author,runoob_count)values('Gill',20);mysql>SELECT*fromtcount_tbl;+-----------------+----------------+|runoob_author|runoob_count|+-----------------+----------------+|mahran|20||mahnaz|NULL||Jen|NULL||Gill|20|+-----------------+----------------+4rowsinset(0.00sec)mysql>

以下实例中你可以看到 = 和 != 运算符是不起作用的:mysql>SELECT*FROM tcount_tbl WHERE runoob_count=NULL;Emptyset(0.00sec)mysql>SELECT*FROM tcount_tbl WHERE runoob_count!=NULL;Emptyset(0.01sec)

查找数据表中 runoob_count 列是否为 NULL,必须使用IS NULL和IS NOT NULL,如下实例:mysql>SELECT*FROM tcount_tbl->WHERE runoob_count IS NULL;+-----------------+----------------+|runoob_author|runoob_count|+-----------------+----------------+|mahnaz|NULL||Jen|NULL|+-----------------+----------------+2rowsinset(0.00sec)mysql>SELECT*fromtcount_tbl->WHERE runoob_count IS NOT NULL;+-----------------+----------------+|runoob_author|runoob_count|+-----------------+----------------+|mahran|20||Gill|20|+-----------------+----------------+2rowsinset(0.00sec)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值