zoukankan      html  css  js  c++  java
  • MySQL必知必会笔记(三)SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询

    第十章  创建计算字段

        计算字段

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

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

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

        拼接字段

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

            生成供应商  columnOne(columnTwo)  的格式

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

        使用别名

             别名使用AS关键字赋予

        执行算术运算

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

            例如:检索出column_id 为2005的columnOne乘以columnTwo的值

            SELECT column_id, columnOne, columnTwo, columnOne*columnTwo AS column_price FROMtable WHERE column_id = 2005

        操作符   + - *  /

            SELECT 3*2;将返回6

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

     

     

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

        SQL实现了一下类型的函数

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

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

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

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

        文本处理函数

            Upper()  将文本转换为大写

            SELECT vend_name, Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BYvend_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-05 15:23: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 FROM orders 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 ANDMonth(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_cust FROM customers;

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

            SELECT MAX()  AS max_price FROM products;

        MIN()  与MAX()函数一样

        SUM() 函数

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

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

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

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

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

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

     

     

    第十三章  分组数据

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

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

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

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

        GROUP BY 一些重要规定

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

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

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

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

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

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

     

        过滤分组

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

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

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

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

        分组和排序区别

            ORDER BY                       GROUP BY

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

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

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

            不一定需要

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

        SELECT order_num , SUM(quantity* item_price)  AS ordertotal  FROM orderitems GROUP BYorder_num HAVING SUM(quantity*item_price) >= 50;

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

     

        SELECT 子句顺序

            SELECT         要返回的列或表达式

            FROM           从中检索数据的表

            WHERE         行级过滤

            GROUNP BY  分组说明

            HAVING         组级过滤

            ORDER BY    输出排序顺序

            LIMIT           要检索的行数

     

    第十三章  使用子查询

     

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

        利用子查询进行过滤

            SELECT cust_id FROM orders WHERE order_num IN(

            SELECT order_num FROM 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_id FROM orders WHERE order_num IN  (

        SELECT order_num FROM 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

            ) AS orders FROM customers ORDER BY cust_name;

     

     
  • 相关阅读:
    Live2d Test Env
    Live2d Test Env
    Live2d Test Env
    图神经网络入门
    CommandLineRunner 可能会导致你的应用宕机停止,我劝你耗子尾汁
    不使用 MQ 如何实现 pub/sub 场景?
    为什么 @Value 可以获取配置中心的值?
    vite + ts 快速搭建 vue3 项目 以及介绍相关特性
    给 Mac 添加右键菜单「使用 VSCode 打开」
    【Python】连接常用数据库
  • 原文地址:https://www.cnblogs.com/sq45711478/p/5991978.html
Copyright © 2011-2022 走看看