zoukankan      html  css  js  c++  java
  • MySQL——准备更好的检索

    禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!

    计算字段

    为什么需要计算字段?因为在数据库中的数据不是马上拿来就用的,而是有可能要对这些数据处理。对于客户端和服务器来说,都可以实现对数据的处理,但是往往在服务器中使用 DBMS 来数据处理更为方便。所以计算字段的存在就是数据处理的方式,它并不实际存在于数据库中,而是在检索的时候顺手创建的。

    拼接

    所谓拼接就是将多个值拼接到一起构成单个值。在 MySQL 中使用 Concat() 函数来拼接,Concat() 函数的作用是将 2 个字符串拼接为一个字符串,字符串之间用逗号隔开:

    此处可以用 RTrim() 函数或 LTrim() 函数删除左边或右边的空格(如果需要的话)。

    别名

    若我们使用了拼接功能,将创建新的字段,但是这个字段是没有字段名的。这个是我们不愿意看到的,首先不利于我们的感性认知,接着客户机没办法直接地使用一个没有字段名的字段,因此我们要为这个新建的字段取名。使用 AS 关键字,可以将字段名替换为我们取的新名字。当然别名也可以用于有字段名的字段,可以取一个更有代表性的别名来用。

    这就像是新建了一个列一样,客户机就可以用别名来引用字段了。

    算术运算

    计算字段也可以用于直接对检索的数据进行计算,支持四则运算的操作。

    函数

    SQL 支持以下几类函数:

    1. 字符串函数;
    2. 数字处理与计算函数;
    3. 日期函数;
    4. 其他高级函数。

    可以去菜鸟教程——MySQL函数看一下详细的函数列表,下面仅看一些简单的实例。

    字符串函数

    字符串拼接

    使用 Concat() 可以实现:

    大小写转换

    使用 Upper() 函数可以实现:

    日期函数

    因为客户端很少对时间进行处理,因此在数据库中对日期的处理很重要,MySQL 中的日期格式必须为:年-月-日,更详细地说是:yyyy-mm-dd。看个简单的检索:

    不过日期记录的方式是有很多的,有时候我们只想知道几月几号,有时候却需要精确到几点几分,如果仅仅使用 WHERE 来检索容错性极差!

    检索日期

    使用 Date() 函数可以进行日期的紧缩,当只需要检索日期是可以使用:

    也可以在一个日期区间进行查找:

    检索月份或年份

    可以分别使用 Year() 函数和 Month() 函数来检索:

    数值聚合

    我们有时候检索数据,不是为了使用数据本身,而是要进行数据分析,例如求和、求平均数,因此经常需要对数据进行处理。

    平均数

    使用 Avg() 函数来计算列的平均值,可以是所有列也可以是特定列,该函数仅能确定特定列的平均值。

    • 函数会直接忽略 NULL 的行。

    计数

    使用 Count() 函数来计算列的行数,可以统计所有行:

    也可以统计特定数值的行:

    最值

    使用 Max() 函数和 Min() 函数可以得到最值:

    求和

    使用 Sum() 函数可以求和:

    对不同值聚合

    由于函数默认对所有值聚合,但是有时候我们只对不同值聚合,此时可以在聚合函数指定 DISTINCT 参数来令函数仅操作不同的值。

    数据分组

    有时候我们倾向于把检索的的数据按照一定的特点进行分组,通过分组后将有助于进行数据分析。

    创建分组

    分组使用 CROUP BU 子句建立,该子句可以根据我们给定的规则将检索结果分为不同的组。CROUP BU 子句有比较多的使用规则:

    1. 该子句可以包含任意数目的列;
    2. 子句中列出的每个列都必须是检索的列,或者是有效的表达式,但是不能是聚集函数;
    3. 聚集语句以外的字段都必须在子句中给出;
    4. 分组中值为 NULL 的元素将被分在同一组;
    5. 建立分组时,所有包含的列一并进行计算,即使存在分组也不能够从中提取数据。

    例如下面的代码就可以把行按照相同的值分为几组:

    再对照一下数据库本身的数据:

    在上述例子中,我们可以看到数据根据我们指定的字典被分了组,并且统计了每组的数据元素个数。

    分组过滤

    我们在前面熟悉了用 WHERE 子句对行进行过滤,但是不能用来过滤分组。想要过滤分组,就需要使用 HAVING 子句来完成,同时这个子句也可以胜任 WHERE 能完成的所有工作,他们的用法是相通的。

    那么怎么理解两种非常类似的语句呢?除了操作对象的不同,它们也有着次序的不同,WHERE 子句在 SELECT 中的位置先于 HAVING 子句,也就是对于一次检索的过滤顺序为先对行过滤,再对分组过滤。这是因为我们可能只是想提取检索到的数据中的部分数据,然后根据这些数据再来创建分组。

    当然我们也可以观察出一个显然的事情,GROUP 子句的顺序也在 HAVING 子句前面,因为我得先有分组才能操作之。

    分组排序

    好像 CROUP BU 子句本身在在分组的同时也会进行排序,但是我们还是需要 ORDER BY 子句的联合使用。CROUP BU 子句是对分组进行排序,不过这并不是规范所要求的功能:

    而 ORDER BY 可以针对某一字段来排序:

    SELECT 语法框架

    SELECT column_name,column_name…
    FROM table_name
    [WHERE]
    [GROUP BY]
    [HAVING]
    [ORDER BY]
    [LIMIT]
    

    参考资料

    《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社
    菜鸟教程——MySQL函数

  • 相关阅读:
    Windows环境安装tesseract-ocr 4.00并配置环境变量
    iis6手工创建网站后无法运行php脚本
    spring boot集成websocket实现聊天功能和监控功能
    spring boot2.0.4集成druid,用jmeter并发测试工具调用接口,druid查看监控的结果
    springboot2.1.5集成单节点elasticsearch6.4.0
    spring boot集成netty-服务端和客户端demo
    spring boot集成mongo统计活跃用户数
    spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例
    spring cloud分布式配置中心案例
    spring cloud--zuul网关和zuul请求过滤
  • 原文地址:https://www.cnblogs.com/linfangnan/p/12889160.html
Copyright © 2011-2022 走看看