学习sql Part 2

2018/04/14 数据库

学习sql Part 2


7、创建计算字段

7.1 计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式。我们需要直接从数据库中检索出转换、计算或者格式化过的数据,而不是检索出数据,然后从客户端应用程序中重新格式化。

这就是计算字段可以排上用场的地方了。计算字段并实际存在于数据库中,而是运行在SELECT语句内创建的。

字段(field):基本与列的意思相同,但是数据库的列一般称为列,而字段通常用来描述计算字段。

7.2 拼接字段

拼接:将值联结在一起构成单个值;

MYSQL中需要用到Concat函数来联结:

SELECT Concat(1, '(', 2, ')')
From 

去除空格: RTRIM()[去掉字符串左边的空格]、TRIM()[去掉字符串两边的空格]、LTRIM()[去掉字符串左边的空格];

用到某一列或者计算字段上都可以

使用别名:上面生成的数据,没有名称,导致客户端应用是无法引用他的,这就需要为它设置一个别名。

别名(alias)是一个字段或者值的替换名,别名用AS关键词赋予。

SELECT Concat(1, '(', 2, ')') as 新列名
From 

7.3 执行算术计算

可以对SQL的字段进行加减乘数(+、-、*、/)

SELECT 1 * 2 as 新列名
From ;

7.4 测试计算

SELECT除了可以用来从表中索引数据,还可以用来简单地访问和处理表达式。

例如:

--计算200+100
SELECT 200+100

--计算当前日期和时间
SELECT NOW();

8、使用函数处理数据

8.1 函数

和大多数其他计算机语言一样,SQL也可以用来处理数据。函数一般是在数据上执行的,为数据的转换和处理提供了方便。

前面提到的TRIM()就是函数。值得注意的是,不同的DBMS中,函数的定义和用法都有差异。

8.2 文本处理函数

常用的文本处理函数:

函数 说明
SUBSTRING(field, m, n) 提取字符串子串
LEFT(field, n) 返回field左边n个字符
RIGHT(field, n) 取field右边n个字符
LOWER(field) field转换成小写
UPPER(field) field转换成小写
LTRIM(field) 去掉field左边的空格
RTRIM(field) 去掉field右边的空格
TRIM(field) 去掉field两端的空格
LENGTH(field) 返回field字段的长度

8.3 日期时间处理函数

日期和时间采用相应的数据类型存储在表中,每种DBMS都有自己的特殊形式。应用程序一般不适用日期和时间的存储格式,因此日期和时间函数总是用来读取、统计、处理这些值。

函数 描述
NOW() 返回当前的日期和时间
CURDATE() 返回当前的日期
CURTIME() 返回当前的时间
DATE() 提取日期或日期/时间表达式的日期部分
EXTRACT() 返回日期/时间按的单独部分
DATE_ADD() 给日期添加指定的时间间隔
DATE_SUB() 从日期减去指定的时间间隔
DATEDIFF() 返回两个日期之间的天数
DATE_FORMAT(t) 用不同的格式显示日期/时间
YEAR(time) 返回time的年份
MONTH(time) 返回time的月份(范围是1到12)
DAY(time) 返回time的日期(范围是1到31)
HOUR(time) 返回time的小时(范围是0到24)
MINUTE(time) 返回time的分钟数(范围是0到59)
SECOND(time) 返回time的秒数(范围是0到59)

具体的函数参考:这里

8.4 数值处理函数

函数 描述
ABS() 绝对值
COS() COS
EXp() 指数
PI() 圆周率
SIN() SIN
SQRT() 开方
TAN() 正切
CEIL() CEIL
FLOOR() FLOOR
MOD() 取余数
RAND() 0-1的随机数
TRUNCATE() 截断为某位长度的小数

具体的函数参考:这里

9、聚集函数

函数 描述
AVG() 均值
MAX() 最大值
MIN() 最小值
SUM() 求和
COUNT() 返回行数

10、分组数据

10.1 数据分组

使用分组可以将数据分为多个逻辑组,然后对每个组进行聚集运算。

10.2 创建分组

分组是使用SELECT语句的GROUP BY 子句创建的,例子如下:

SELECT COUNT(*) AS NUM_PRODS
FROM PRODUCTS
GROUP BY VENDER_ID;

上面的sql语句计算每个不同的vender_id的数据条数

GROUP BY的规定

  • GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,从而得到更细致地进行数据分组;
  • 如果GROUP BY 中嵌套了分组,数据将在最后指定的分组上进行汇总。
  • GROUP BY子句中列出的每一列都必须是检索列或者有效的表达式,不能是聚集函数。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名
  • 大多数SQL实现不允许GROUP BY 列带有长度可变的数据类型;
  • 如果分组列中包含具有NULL值的列,则NULL将作为一个分组返回,如果列中有多行NULL值,他们将作为一组。
  • GROUP BY 语句出现在where语句之后,ORDER BY 语句 之前。

10.3 过滤分组

SQL允许进行过滤分组,即规定包括哪些分组,排除哪些分组。注意WHERE是不能用来过滤分组的。

SQL用来过滤分组的子句是HAVING, HAVING 类似于WHERE,基本上可以代替WHERE。WHERE用来过滤行,而HAVING用来过滤分组。

HAVING继承了WHERE的所有功能。

HAVING 放在GROUP BY 语句之后。

10.4 分组和排序

GROUP BY 和 ORDER BY 一起使用。

10.5 SELECT 子句的顺序

selcet 要返回的列或表达式

from 从中检索数据的表

where 行级过滤

group by 分组说明

having 组级过滤

order by 输出排列顺序 ASC正序排列 DESC 倒序排列

搜索

    Table of Contents