数据库笔记8:SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
2016-08-04 21:37
543 查看
第十章 创建计算字段 计算字段 存储在表中的数据一般不是应用程序所需要的格式。我们需要直接从数据库中检索出转换、计算或格式化的数据。而不只是检索出数据,然后再到应用程序或报告程序中区格式化。 这就发挥了计算字段的作用了。与前面的字段不同,计算字段并不实际存在于数据库中。计算字段是运行时在SELECT 语句中创建的。 需要注意的是,只有SELECT语句知道那些列是实际列,哪些列不是,客户机的角度来看,计算字段和其他字段是一样的。 拼接字段 拼接:将值联结到一起构成单个值。 生成供应商 columnOne(columnTwo) 的格式 SELECT Concat(columnOne, '(' ,columnTwo, ')') FROM table ORDER BYcolumnOne; 使用别名 别名使用AS关键字赋予 执行算术运算 另一常见的用途就是对检索出来的数据进行算术运算。 例如:检索出column_id为2005的columnOne乘以columnTwo的值 SELECT column_id, columnOne, columnTwo, columnOne*columnTwo AS column_price FROM table WHERE column_id = 2005 操作符 + -* / SELECT 3*2;将返回6 SELECT Now();返回当前的日期和时间
第十一章 使用数据处理函数 SQL实现了一下类型的函数 1 用于处理文本串,如删除、填充、装换大小写 2 用于数据上进行的算术操作,如返回绝对值,进行代数运算 3用于处理日期和时间值并从这些值中提取特定的成分,如返回两个日期差,检查日期有效性 4 返回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-0515: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 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 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供了更细致的控制 2 如果在GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上进行汇总,换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别列取回数据) 3 GROUP BY 子句列出的每个列都必须是检索列或有效的表达式,(但不能是聚集函数)如果。在SELECT 中使用了表达式,则必须在GROUPBY 子句中指定相同的表达式,不能使用别名。 4 除聚集计算语句外,SELECT语句中的每个列都必须在GROUPBY 子句中给出 5 如果分组列中具有NULL值,不管一个或多个都将作为一个分组返回 6 GROUP BY 子句必须出现在WHERE子句之后,GROUP BY子句之前 过滤分组 如想要得到大于3的不同产品订单 WHERE 是过滤指定的行而不是列。 HAVING 支持所有 WHERE操作符。 SELECT cust_id,COUNT(*) AS orders FROMorders GROUP BY cust_id HAVING COUNT(*) >3; 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;
第十一章 使用数据处理函数 SQL实现了一下类型的函数 1 用于处理文本串,如删除、填充、装换大小写 2 用于数据上进行的算术操作,如返回绝对值,进行代数运算 3用于处理日期和时间值并从这些值中提取特定的成分,如返回两个日期差,检查日期有效性 4 返回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-0515: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 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 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供了更细致的控制 2 如果在GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上进行汇总,换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别列取回数据) 3 GROUP BY 子句列出的每个列都必须是检索列或有效的表达式,(但不能是聚集函数)如果。在SELECT 中使用了表达式,则必须在GROUPBY 子句中指定相同的表达式,不能使用别名。 4 除聚集计算语句外,SELECT语句中的每个列都必须在GROUPBY 子句中给出 5 如果分组列中具有NULL值,不管一个或多个都将作为一个分组返回 6 GROUP BY 子句必须出现在WHERE子句之后,GROUP BY子句之前 过滤分组 如想要得到大于3的不同产品订单 WHERE 是过滤指定的行而不是列。 HAVING 支持所有 WHERE操作符。 SELECT cust_id,COUNT(*) AS orders FROMorders GROUP BY cust_id HAVING COUNT(*) >3; 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;
相关文章推荐
- 数据库笔记8:SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- 数据库笔记8:SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- MySQL必知必会笔记(三)SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- MySQL必知必会笔记(三)SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- 【MySQL】SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- MySQL必知必会笔记(三)SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- MySQL必知必会笔记(二)SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- MySQL必知必会笔记(二)SELECT语句 计算字段 数据处理函数 汇总函数 分组数据 子查询
- SQL必知必会(二) 计算字段、函数、汇总数据、分组数据、子查询
- 以数据库字段分组显示数据的sql语句
- 以数据库字段分组显示数据的sql语句(详细介绍)
- 以数据库字段分组显示数据的sql语句(详细介绍)
- MySQL基础(3)——计算字段、处理函数、聚集函数和数据分组
- Sqlite 常用函数封装:修改密码,创建数据库、获取表段、字段,取值、插入、删除数据、执行Sqlite指令
- Oracle Class2. SQL查询和SQL函数(Oracle数据类型,ddl,dml,dcl,事务控制语言tcl,sql操作符,sql函数,select语句,运算符,分析函数,临时表)
- SQL Server 学习笔记④ 查询某个数据所在数据库表中的哪个字段上出现过的存储过程
- MySQL取第一条数据方法:SQL语句分组的方法,使用Northwind 数据库为例子。
- 【SQL精彩语句】按某一字段分组取最大(小)值所在行的数据
- 【SQL精彩语句】按某一字段分组取最大(小)值所在行的数据
- 【sjj】[论文笔记]适用于云计算的面向查询数据库数据分布策略