数据库笔记8:SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

第十章 创建计算字段

   计算字段

       存储在表中的数据一般不是应用程序所需要的格式。我们需要直接从数据库中检索出转换、计算或格式化的数据。而不只是检索出数据,然后再到应用程序或报告程序中区格式化。

       这就发挥了计算字段的作用了。与前面的字段不同,计算字段并不实际存在于数据库中。计算字段是运行时在SELECT 语句中创建的。

       需要注意的是,只有SELECT语句知道那些列是实际列,哪些列不是,客户机的角度来看,计算字段和其他字段是一样的。

   拼接字段

   拼接:将值联结到一起构成单个值。

       生成供应商 columnOnecolumnTwo 的格式

       SELECT Concat(columnOne, '(' ,columnTwo, ')') FROM table ORDER BYcolumnOne;

   使用别名

        别名使用AS关键字赋予

   执行算术运算

       另一常见的用途就是对检索出来的数据进行算术运算。

       例如:检索出column_id2005columnOne乘以columnTwo的值

       SELECT column_id, columnOne, columnTwo, columnOne*columnTwo AS column_price FROM tableWHERE column_id = 2005

   操作符  + -* /

       SELECT 3*2;将返回6

       SELECT Now();返回当前的日期和时间



第十一章 使用数据处理函数

   SQL实现了一下类型的函数

      用于处理文本串,如删除、填充、装换大小写

      用于数据上进行的算术操作,如返回绝对值,进行代数运算

      3用于处理日期和时间值并从这些值中提取特定的成分,如返回两个日期差,检查日期有效性

      返回DBMS正使用的特殊信息,如用户登录信息,检查版本细节信息

   文本处理函数

      Upper() 将文本转换为大写

      SELECT vend_name, Upper(vend_name) ASvend_name_upcase FROM vendorsORDER BY vend_name;

   常用的文本处理函数

      Left()            返回串左边的字符

      Length()        返回串的长度

      Locate()        找出串的一个子串

      Lower()        将串转换为小写

      Right()          返回右边的字符

      Soundex()     返回串的SOUNDEX

      SubString()    返回串的字符

      Upper()         将串转换ewing大写

        Soundex()是一个将任何文字串转换为描述语音表示的字母数字模式的算法。他考虑了类似发信字符和音节,使得能对串进行发音的比较而不是字母比较,如:Y.lee搜索可以匹配Y.lie

      SELECT cust_name, cust_contact FROM customers WHERE Soundex(cust_contact) = Soundex('Y Lie')

   删除多余空格的函数

      RTrim()  LTrim()  Trim() 依次是删除 右边 左边 两边的空格

      SELECT Concat(RTrim(vend_name), '( ' ,RTrim(vend_country), ') FROM vendors ORDER BYvend_name;

 

   日期和时间处理函数

      日期和时间常用相应的数据类型和特色的格式存储,以便能快速和有效的排序或过滤,并节省物理存储空间。

      AddDate()     增加一个日期 天、周等   

      AddTime()     增加一个时间 时、分等

      CurDate()      返回当前日期

      CurTime()     返回当前时间

      Date()           返回日期时间的日期部分

      DateDiff()     计算两个日期之差      

      Date_Add()    高度灵活的日期或时间串   

      Date_Format()      返回一个格式的日期或时间串   

      Day()            返回一个日期的天数部分

      DayOfWeek() 对于一个日期,返回对于星期几

      Hour()           返回一个时间的小时部分

      Minute()        返回一个时间的分钟部分

      Moth()          返回一个日期的月份部分

      Now()           返回当前的日期和时间

      Second()       返回一个时间的秒部分

      Time()          返回一个日期时间的时间部分

      Year()           返回一个日期的年份部分

      MySQl日期格式必须为yyyy-mm-dd,2010-05-03。虽然其他日期格式也行,但这是首选格式,因为他排除了多义性。

      例如,存储的日期列中的日期是2010-11-051523:05 如果想找出2010-11-05这天的数据,使用前面的语句就不行了。这是要使用Date()函数指示mysql提取列的日期的部分

      SELECT cust_id,order_num FROM orders WHERE Date(order_date) = '2010-11-05';

      检索出2005-5月份的订单怎么办呢?可以使用BETWEEN

      SELECT cust_id,order_num FROMorders WHERE Date(order_date) BETWEEN '2005-05-01' AND'2005-05-30';

      还有一种不需要记住天数的函数Month(),使年份相等,再让月份相等就行了

      SELECT cust_id,order_num FROM orders WHERE Year(order_date) = 2005 AND Month(order_date) = 5;

 

   数值处理函数

      Abs()            返回一个数的绝对值

      Cos()            返回一个角度的余弦

      Exp()            返回一个数的指数值

      Mod()           返回除操作的余数

      Pi()             返回圆周率

      Rand()          返回一个随机数

      Sin()            返回一个角度的正弦值

      Sqrt()           返回一个数的平方根

      Tan()            返回一角度的正切



第十二章 汇总函数

Msyql提供这些函数以便分析和报表生成,这种类型的检索例子有以下几种:

   汇聚函数  运行在行组上,计算和返回单个值的函数

      1确定表中的行数(或者满足某个条件或包括某个特定的值的行数)

      2获得表中行组的和

      3找出表列(或所有行或某特定行的)最大值、最小值和平均值

   AVG()           返回某列的平均值

   COUNT()       返回某列的行数

   MAX()         返回某列的最大值

   MIN()           返回某列的最小值

   SUM()         返回某列值之和

   products表中产品的平均价格

      SELECT AVG(prod_price) AS avg_price FROM products;

   products表中编号为1003产品的平均价格

      SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 1003;

   AVG()函数只能用来确定特定数值列的平均值,而且名必须作为函数参数给出。为了获得多个平均值,必须使用多个AVG()函数,AVG()函数忽略列值为NULL的行

   COUNT()函数的两种使用方式:

      1 COUNT(*) 对表中的数目进行计数,不管表列中包含的是NULL值还是非空值

      2 COUNT(column)对特定的列中具有值的进行计数,忽略NULL

      SELECT COUNT(*) AS num_cust FROM customers;

      SELECT COUNT(cust_email)AS num_custFROMcustomers;

   MAX()函数 ,忽略列值为NULL的行

      SELECT MAX() AS max_price FROMproducts;

   MIN()  MAX()函数一样

   SUM() 函数

      SELECT SUM(quantity)AS items_ordered FROM orderitems WHERE order_num = 2005

   下面是mysql5以后的函数 mysql4中不能正常运行

   DISTINCT  参数,作用是返回不相同的值

   下面是返回供应商提供的产品的平均值,它与上面的SELECT 语句相同,但使用了DISTICT参数,因此平均值只考虑各个不同价格合起来的平均值

      SELECT AVG(DISTINCTprod_price) AS avg_price FROM products WHEREvend_id=10003

   如果指定了列名,DISTINCT参数只能用于COUNT(),DISTINCT参数不能用于COUNT(*)应为DISTINCT必须使用列名。



第十三章  分组数据

   分组允许把数据分成多个逻辑组,比便能对每个组进行聚集计算。

   分组是在SELECT语句的 GROUP BY子句中建立的。

   返回每个厂商提供了几个产品

   SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BYvend_id;

   GROUP BY 一些重要规定

      1 GROUP BY       子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供了更细致的控制

      如果在GROUP BY  子句中嵌套了分组,数据将在最后规定的分组上进行汇总,换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别列取回数据)

      3 GROUP BY       子句列出的每个列都必须是检索列或有效的表达式,(但不能是聚集函数)如果。在SELECT 中使用了表达式,则必须在GROUPBY 子句中指定相同的表达式,不能使用别名。

      除聚集计算语句外,SELECT语句中的每个列都必须在GROUPBY 子句中给出

      如果分组列中具有NULL值,不管一个或多个都将作为一个分组返回

      6 GROUP BY 子句必须出现在WHERE子句之后,GROUP BY子句之前

 

   过滤分组

      如想要得到大于3的不同产品订单

      WHERE 是过滤指定的行而不是列。 HAVING 支持所有 WHERE操作符。

      SELECT cust_id,COUNT(*) AS orders FROMorders GROUP BY cust_id HAVING COUNT(*) >;

      WHERE 是在分组前进行过滤, HAVING是在分组后进行过滤

   分组和排序区别

      ORDER BY                     GROUP BY

      排序产生的输出                 分组行,单输出可能不是分组的顺序

      任意列都可以使用(甚至   只可能使用选择列或表达式,而且必须使用每个选择列表达式

      是分选择列也可以使用)   如果与聚集哈思楠一起使用列(或表达式)则必须使用

      不一定需要

   例子:检索总计订单价格大于50的订单号和总计订单

   SELECT order_num , SUM(quantity*item_price) ASordertotal FROM orderitemsGROUP BY order_numHAVINGSUM(quantity*item_price) >= 50;

   按订单价格进行排序 ,后面加ORDER BY ordertotal;

 

   SELECT 子句顺序

      SELECT        要返回的列或表达式

      FROM          从中检索数据的表

      WHERE        行级过滤

      GROUNPBY 分组说明

      HAVING        组级过滤

      ORDER BY  输出排序顺序

      LIMIT          要检索的行数


第十三章  使用子查询

 

   Sql还允许使用子查询,即嵌套在其他查询中的查询。

   利用子查询进行过滤

      SELECT cust_idFROM orders WHERE order_num IN

      SELECT order_numFROM orderitems WHERE prod_id = 'TNT2'

      

      可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE 子句

      格式化sql   包含子查询的sql语句难以阅读,可以使用适当的缩进。

      得到了订购物品TNT2的所有客户ID,下一步是检索这些客户的信息,总语句是

      SELECT cust_name, cust_contact FROM customers WHERE cust_id IN(

   SELECT cust_idFROM orders WHERE order_num IN (

   SELECT order_numFROM orderitems WHERE prod_id = 'TNT2'

   )

      )

      列必须匹配 WHERE子句中使用子查询,应该保证SELECT语句具有WHERE 子句中相同数目的列。通常子查询将返回的单个列于单个列匹配,但如果需要也可以多个列。

      虽然子查询一般与IN操作符结婚使用,但也可以用于测试等于、不等于等符号

 

   作为计算字段使用子查询

      使用子查询的另一个方法是创建计算字段。

      假设需要显示sustomers表中每个客户的订单总数。

      SELECT cust_name cust_state,(

      SELECT COUNT(*) FROM orders WHERE orders,coust_id = customers .Cust_id

       ) ASorders FROM customers ORDER BYcust_name;


本文转自    风雨萧条 博客,原文链接:    http://blog.51cto.com/1095221645/1545901    如需转载请自行联系原作者


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
133 75
|
3月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
269 61
|
2月前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
52 1
|
2月前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
2月前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
62 5
|
3月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
19天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
5天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
73 42
|
23天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
169 0
|
2月前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
69 3

热门文章

最新文章