《MYSQL必知必会》—10~13.创建计算字段、使用数据处理函数、使用聚集函数汇总数据,使用GROUP BY与HAVING分组数据及过滤
文章目录
- 1.如何创建计算字段以及怎样从应用程序中使用别名引用它们
- 1.1 什么是计算字段
- 1.2 拼接字段—concat()
- 1.3 使用别名—AS
- 1.4 执行算术运算
- 2.MySQL支持何种数据处理函数以及如何使用这些函数
- 2.1 文本处理函数
- 2.2 日期和时间处理函数
- 2.3 数值处理函数
- 3. 介绍SQL的聚集函数以及如何利用它们汇总表的数据
- 3.1 介绍聚集函数
- 3.1.1 AVG()函数
- 3.1.2 COUNT()函数
- 3.1.3 MAX()函数
- 3.1.4 MIN()函数
- 3.1.5 SUM()函数
- 3.2 聚集不同的值—DISTINCT 的使用
- 3.3 组合聚集函数
- 4.如何分组数据,以便能汇总表内容的子集
- 4.1 数据分组
- 4.1.1 创建分组—GROUP BY子句
- 4.2 过滤分组—HAVING子句
- 4.3 分组与排序—GROUP BY和ORDER BY
- 4.4 SELECT子句顺序
1.如何创建计算字段以及怎样从应用程序中使用别名引用它们
1.1 什么是计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式。我们需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。
可在SQL语句内完成的许多和格式化工作都可以直接在客户机应用程序内完成。一般来说,在数据库服务器上完成这些操作比在客户机中完成要快得多,因为DBMS是设计来快速有效地完成这种处理的。
1.2 拼接字段—concat()
在MySQL的SELECT语句中,可使用concat()
函数来拼接两个列。
# name (location)这样的格式列出供应商报表
SELECT Concat(vend_name,' (',vend_country,')') FROM vendors ORDER BY vend_name;
Concat()
拼接串,即把多个串连接起来形成一个较长的串。Concat()
需要一个或多个指定的串,各个串之间用逗号分隔。
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') FROM vendors ORDER BY vend_name;
RTrim()
函数去掉值右边的所有空格。通过使用RTrim(),各个列都进行了整理。
LTnim()函数
去掉串左边的空格
Trim()函数
去掉串左右两边的空格
1.3 使用别名—AS
SQL支持列别名,别名用AS关键字
赋予
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;
SELECT语句本身与以前使用的相同,只不过这里的语句中计算字段之后跟了文本AS vend_title
。它指示SQL创建一个包含指定计算的名为vend_title的计算字段。从输出中可以看到,结果与以前的相同,但现在列名为vend_title,任何客户机应用都可以按名引用这个列,就像它是一个实际的表列一样。
1.4 执行算术运算
计算字段的另一常见用途是对检索出的数据进行算术计算。
SELECT prod_id,quantity,item_price FROM orderitems WHERE order_num = 20005;
计算汇总物品的价格
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20005;
输出中显示的expanded_price
列为一个计算字段,此计算为quantity*item_price
。客户机应用现在可以使用这个新计算列,就像使用其他列一样。
MySQL支持表列出的基本算术操作符。此外圆括号可用来区分优先顺序。
SELECT Now()
利用Now()函数返回当前日期和时间
2.MySQL支持何种数据处理函数以及如何使用这些函数
如果你决定使用函数,应该保证做好代码注释,以便以后你(或其他人)能确切地知道所编写SQL代码的含义。
大多数SQL实现支持以下类型的函数:
- 用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
- 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
- 用于处理日期和时间值并从这些值中提取特定成分(例如返回两个日期之差,检查日期有效性等)的日期和时间函数。
- 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。
2.1 文本处理函数
下面列出常用的文本处理函数
表中的SOUNDEX需要做进一步的解释。SOUNDEX
是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。虽然SOUNDEX不是SQL概念,但MySQL(就像多数DBMS一样)都提供对SOUNDEX的支持。下面给出一个使用Soundex()函数的例子
SELECT cust_name,cust_contact FROM customers WHERE cust_contact = 'Y. Lie';
使用Soundex()
函数进行搜索,它匹配所有发音类似于Y.Lie的联系名:
SELECT cust_name,cust_contact FROM customers WHERE Soundex(cust_contact)= Soundex('Y Lie');
# Upper()将文本转换为大写
SELECT vend_name,Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
2.2 日期和时间处理函数
下面是常用的日期和时间处理函数
前面我们都是用比较数值和文本的WHERE子句过滤数据,但数据经常需要用日期进行过滤。
用日期进行过滤需要注意一些问题:
首先需要注意的是MySQL使用的日期格式。无论你什么时候指定一个日期,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为格式yyyy-mm-dd。因为它排除了多义性
日期比较
SELECT cust_id,order__num FROM orders WHERE order_date = '2005-09-01';
如果存储的order_date值为2005-09-01 11:30:05
,则WHERE order date = '2005-09-01’失败。即使给出具有该日期的一行,也不会把它检索出来,因为WHERE匹配失败。必须使用Date()函数。Date(order _date)
指示MySQL仅提取列的日期部分SELECT cust_id,order_num FROM orders WHERE Date(order_date) = '2005-09-01';
如果你想检索出2005年9月下的所有订单,即匹配月份中的天数。有几种解决办法:
BETWEENSELECT cust_id,order_num FROM orders WHERE Date(order_date) BETWEEN '2005-09-01’ AND '2005-09-30';
Year()与Month()
SELECT cust_id,order_num FROM orders WHERE Year(order_date) =2005 AND Month(order_date) = 9;
分别返回年份与月份,再
AND
在一起
2.3 数值处理函数
数值处理函数仅处理数值数据。这些函数一般主要用于代数、三角或几何运算,因此没有串或日期-时间处理函数的使用那么频繁。下面列出一些常用的数值处理函数
3. 介绍SQL的聚集函数以及如何利用它们汇总表的数据
3.1 介绍聚集函数
聚集函数(aggregate function):运行在行组上,计算和返回单个值的函数。下面列出常用的SQL聚集函数
3.1.1 AVG()函数
AVG ()通过对表中行数计数并计算特定列值之和,求得该列的平均值。AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。
AVG()可用来返回所有列的平均值
# 使用AVG()返回products表中所有产品的平均价格
SELECT AVG(prod_price) AS avg_price FROM products;
AVG()也可以用来确定特定列或行的平均值
SELECT AVG (prod_price) AS avg_price FROM products WHERE vend_id = 1003;
这条SELECT语句与前一条的不同之处在于它包含了WHERE子句。此WHERE子句仅过滤出vend_id为1003
的产品,因此avg price中返回的值只是该供应商的产品的平均值。
AVG ()
函数忽略列值为NULL的行。
3.1.2 COUNT()函数
COUNT()函数进行计数。可利用COUNT ()
确定表中行的数目或符合特定条件的行的数目。
cOUNT()函数有两种使用方式:
- 使用
COUNT(*)
对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。 - 使用
COUNT (column)
对特定列中具有值的行进行计数,忽略NULL值。
# 返回customers表中客户的总数
SELECT COUNT(*) AS num_cust FROM customers;
# 对具有电子邮件地址的客户计数
SELECT COUNT(cust_emai1) AS num_cust FROM customers;
3.1.3 MAX()函数
MAX()
返回指定列中的最大值。MAX()要求指定列名
SELECT MAX(prod_price) AS max_price FROM products;
虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。
在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。
并且MAX()函数忽略列值为NULL的行
3.1.4 MIN()函数
与MAX()函数
相反
3.1.5 SUM()函数
SUM()用来返回指定列值的和(总计)
SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;
函数SUM( quantity)
返回订单中所有物品数量之和,WHERE子句
保证只统计某个物品订单中的物品。
sUM ()也可以用来合计计算值
SELECT SUM(item_price*quantity) AS tota1_price FROM orderitems WHERE order_num = 20005;
函数SUM(item price*quantity)
返回订单中所有物品价钱之和,WHERE子句
同样保证只统计某个物品订单中的物品。
SUM()函数
忽略列值为NULL的行
3.2 聚集不同的值—DISTINCT 的使用
以上5个聚集函数都可以如下使用:
- 对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为)
- 只考虑不同的值,指定DISTINCT参数
# 它与上面的SELECT语句相同,但使用了DISTINCT参数,因此平均值只考虑各个不同的价格:
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003;
注意,如果指定列名,则
DISTINCT
只能用于COUNT()
. DISTINCT不能用于COUNT(*)
,因此不允许使用 COUNT (DISTINCT),否则会产生错误。
3.3 组合聚集函数
SELECT语句可根据需要包含多个聚集函数
SELECT COUNT(*)AS num_items,MIN(prod_price) AS price_min,MAX(prod_price) AS price_max,AVG(prod_price) AS price_avg
FROM products;
这里用单条SELECT语句执行了4个聚集计算,返回4个值(products表中物品的数目,产品价格的最高、最低以及平均值)。
4.如何分组数据,以便能汇总表内容的子集
这涉及两个新SELECT语句子句,分别是GROUP BY子句
和HAVING子句
。
4.1 数据分组
目前为止,所有计算都是在表的所有数据或匹配特定的WHERE子句的数据上进行的。
如果要返回每个供应商提供的产品数目怎么办?或者返回只提供单项产品的供应商所提供的产品,或返回提供10个以上产品的供应商怎么办?
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
4.1.1 创建分组—GROUP BY子句
分组是在SELECT语句的GROUP BY子句中建立的
SELECT vend_id,COUNT(*)AS num_prods FROM products GROUP BY vend_id;
GROUP BY子句
指示MySQL按vend_id排序并分组数据。这导致对每个vend_id而不是整个表计算num prods一次。GROUP BY子句
指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。
在具体使用GROUP BY子句
前,需要知道一些重要的规定:
GROUP BY子句
可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。- 如果在
GROUP BY子句
中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。GROUP BY子句
中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。- 除聚集计算语句外,SELECT语句中的每个列都必须在
GROUP BY子句
中给出。- 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
GROUP BY子句
必须出现在WHERE子句之后
,ORDER BY子句之前
使用WITH ROLLUP关键字
,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值,
SELECT vend id, COUNT(*) AS num-prods
FROM products
GROUP BY vend id WITH ROLLUP;
4.2 过滤分组—HAVING子句
WHERE子句
不能完成任务,因为WHERE过滤指定的是行而不是分组。HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。
# 列出至少具有2个订单的所有顾客
SELECT cust_id,COUNT(*) AS ordersFROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
HAVING和WHERE的差别:
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
同时使用WHERE和HAVING子句
# 返回过去12个月内具有两个以上订单的顾客
SELECT vend_id,COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*)>= 2;
4.3 分组与排序—GROUP BY和ORDER BY
虽然GROUP BY
和ORDER BY
经常完成相同的工作,但它们是非常不同的。下面汇总了它们之间的差别
我们经常发现用GROUP BY分组的数据确实是以分组顺序输出的。但情况并不总是这样,它并不是SQL规范所要求的。此外,用户也可能会要求以不同于分组的顺序排序。仅因为你以某种方式分组数据(获得特定的分组聚集值),并不表示你需要以相同的方式排序输出。应该提供明确的ORDER BY子句,即使其效果等同于GROUP BY子句也是如此。
SELECT order_num,SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item price) >= 50;
为按总计订单价格排序输出,需要添加ORDER BY子句
# 按总计订单价格排序输出,需要添加ORDER BY子句
SELECT order_num,SUM(quantity*item_price) AS ordertota1
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item _price) >= 50
ORDER BY ordertotal;
GROUP BY子句
用来按订单号(order_num列)分组数据,以便SUM(quantity*item _price)
函数能够返回总计订单价格。HAVING子句
过滤数据,使得只返回总计订单价格大于等于50的订单。最后,用ORDER BY子句
排序输出。
4.4 SELECT子句顺序
下面展示SELECT子句
中使用时必须遵循的次序,列出迄今为止所学过的子句。
如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!
《MYSQL必知必会》—10~13.创建计算字段、使用数据处理函数、使用聚集函数汇总数据,使用GROUP BY与HAVING分组数据及过滤相关推荐
- 《Mysql必知必会》
<Mysql必知必会> 第10章 创建计算字段 (1)使用Concat拼接串 SELECT Concat(name,'(',address,')') FROM school ORDER B ...
- mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)
站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...
- MySQL必知必会pdf
下载地址:网盘下载 内容简介 · · · · · · <MySQL必知必会>MySQL是世界上最受欢迎的数据库管理系统之一.书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结 ...
- MySQL必知必会学习历程(一)
MySQL必知必会学习历程(一) 前言 第1章 了解SQL 1.1 关键术语介绍 1.2 数据表解释实例 第2章 MySQL简介 2.1 关键术语介绍 2.2 安装mysql命令行实用程序(可选) 2 ...
- 【SQL】【读书笔记】《MySQL必知必会》
本文为<MySQL必知必会>[1]读书笔记,用于总结知识点和框架,仅供参考和交流,如有不妥请联系.由于软件版本更新,书中的一些代码已经不再适用,本文主要从SQL基本语句进行增删减.窗口函数 ...
- MySQL必知必会 代码+说明 全书整理
前不久收获一本<mysql必知必会>实体书,这周得空将整本书再次回顾了下. 整理了书中全部的代码,加上了必要的语句说明. 我所使用的软件版本:mysql workbench 8.0.15 ...
- Day5/7:2021-1-29 mysql必知必会【5-12】
文章目录 第5章 排序检索数据 5.1使用order by 子句对输出排序 第6章 过滤数据 6.1where 6.2where 6.2.2不匹配检查 6.2.3范围值检索,between A and ...
- 《SQL必知必会》读书笔记上(第1~15章)
目录 第1章 了解SQL 第2章 MySQL简介 第3章 使用MySQL 3.1 连接数据库 3.2 选择数据库 3.3 显示数据库和表 3.4 其他SHOW语句 第4章 检索数据 4.1 SELEC ...
- SQL必知必会1 查询部分 P1-P129
第1课 了解SQL 这一课程介绍SQL究竟是什么,它能做什么事情 1.1 数据库基础 你正在读这本SQL图书,表明你需要以某种方式与数据库打交道.SQL正是用来实现这一任务的语言,因此在学习SQL之前 ...
- 【读书笔记】SQL必知必会
章节 标题 页数 进度 完成时间 1 了解SQL 1~9 100% 2022-04-08 2 检索数据 SELECT 10~22 100% 2022-04-10 3 排序检索数据 ORDER BY ...
最新文章
- slf4j+log4j打印日志,控制台无日志输出
- python可以写桌面软件吗-Python学习,给自己的代码做个合集,定制自己的桌面软件!...
- java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
- 关于CoordinatorLayout的用法——复杂交互的克星
- cocos2d-x游戏实例(11)-触屏主角移动轨迹
- Java并发编程-volatile关键字介绍
- html模板安装到织梦,织梦网站安装教程 织梦模板通用安装图文教程
- notepad++格式化插件安装
- 个性化推荐算法-协同过滤
- L2-015. 互评成绩-PAT团体程序设计天梯赛GPLT
- Thinking in C++ ----第二章 对象的创建和使用
- abaqus Isight学习
- Dlib+Opencv库实现疲劳检测
- android 仿QQ相册
- 深入浅出golang的chan
- Red Giant 安装及爆炸效果详解
- 【Datawhale数据可视化组队学习】Task05 - 样式色彩秀芳华
- To install it, you can run: npm install --save @vue/composition-api/dist/vue-composition-api.mjs
- 基于大数据技术之电视收视率企业项目实战(hadoop+Spark)
- 一篇文章上手docker(原理,部署,使用,坑)