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;

     

     
  • 相关阅读:
    Firemonkey 控件设定字型属性及颜色
    ListView 使用 LiveBindings 显示超过 200 条记录
    Firemonkey ListView 获取项目右方「>」(Accessory) 事件
    XE7 Update 1 选 iOS 8.1 SDK 发布 iPhone 3GS 实机测试
    Firemonkey Bitmap 设定像素颜色 Pixel
    Firemonkey 移动平台 Form 显示使用 ShowModal 范例
    XE7 提交 App(iOS 8)提示「does not contain the correct beta entitlement」问题修复
    XE7 Android 中使用 MessageDlg 范例
    导出 XE6 预设 Android Style (*.style) 档案
    修正 Memo 設定為 ReadOnly 後, 無法有複製的功能
  • 原文地址:https://www.cnblogs.com/sq45711478/p/5991978.html
Copyright © 2011-2022 走看看