sql语法基础(3)

一. Date函数

Mysql Date 函数

函数 描述
NOW() 返回当前的日期和时间
CURDATE() 返回当前的日期
CURTIME() 返回当前的时间
DATE() 提取日期或日期/时间表达式的日期部分
EXTRACT() 返回日期/时间的单独部分
DATE_ADD() 向日期添加指定的时间间隔
DATE_SUB() 从日期减去指定的时间间隔
DATEDIFF() 返回两个日期之间的天数
DATE_FORMAT() 用不同的格式显示日期/时间

Mysql Date数据类型

类型 格式
DATE YYYY-MM-DD
DATETIME YYYY-MM-DD HH:MM:SS
TIMESTAMP YYYY-MM-DD HH:MM:SS
YEAR YYYY 或 YY

日期处理
不涉及时间,比较容易,Orders表如下:

OrderId ProductName OrderDate
1 Geitost 2008-11-11
2 Camembert Pierrot 2008-11-09
3 Mozzarella di Giovanni 2008-11-11
4 Mascarpone Fabioli 2008-10-29
选取一定的OrderDate
SELECT * FROM Orders WHERE OrderDate='2008-11-11'

但是如果时间部分类似2008-11-11 13:23:44那么,同样的语句不能使用,因为缺少时间部分
因此,一般不要加时间部分。

二. null值/null函数

代表遗漏的未知数据,默认可以存放null值;
无法比较null和0,二者不等价
无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>
is null能够选取null的值
is not null能够选取非null得值

SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL

IFNULL()/COALESCE

SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products

如果例子中的UnitsOnOrder是null,那么IFNULL或者COALESCE的结果就是后边规定的参数,0

三. 通用数据类型

在MySQL中,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。

Text类型

数据类型 描述
CHAR(size) 保存固定长度的字符串(可包含字母、数字以及特殊字符)。
在括号中指定字符串的长度。最多 255 个字符。
VARCHAR(size) 保存可变长度的字符串(可包含字母、数字以及特殊字符)。
在括号中指定字符串的最大长度。最多 255 个字符。
注释:如果值的长度大于 255,则被转换为 TEXT 类型。
TINYTEXT 存放最大长度为 255 个字符的字符串。
TEXT 存放最大长度为 65,535 个字符的字符串。
BLOB 用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。
MEDIUMTEXT 存放最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB 用于 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字节的数据。
LONGTEXT 存放最大长度为 4,294,967,295 个字符的字符串。
LONGBLOB 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
ENUM(x,y,z,etc.) 允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。
如果列表中不存在插入的值,则插入空值。注释:这些值是按照您输入的顺序排序的。
可以按照此格式输入可能的值: ENUM('X','Y','Z')
SET 与 ENUM 类似,不同的是,SET 最多只能包含 64 个列表项且 SET 可存储一个以上的选择。

Number 类型
整数类型默认包含正负,可以添加UNSIGNED,范围从0开始了

类型 描述
TINYINT(size) -128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。
SMALLINT(size) -32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。
MEDIUMINT(size) -8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。
INT(size) -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。
BIGINT(size) -9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。
FLOAT(size,d) 带有浮动小数点的小数字。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DOUBLE(size,d) 带有浮动小数点的大数字。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DECIMAL(size,d) 作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

Date 类型

数据类型 描述
DATE() 日期。格式:YYYY-MM-DD
注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'
DATETIME() *日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'
TIMESTAMP() *时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC)至今的秒数来存储。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC
TIME() 时间。格式:HH:MM:SS
注释:支持的范围是从 '-838:59:59' 到 '838:59:59'
YEAR() 2 位或 4 位格式的年。
注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。
DATETIME和TIMESTAM不同
TIMESTAM在update和insert中,会把自身自动设置为当前时间,也可以接受不同的格式:YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD

还有其他的数据类型

数据类型 描述
sql_variant 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。
uniqueidentifier 存储全局唯一标识符 (GUID)。
xml 存储 XML 格式化数据。最多 2GB。
cursor 存储对用于数据库操作的指针的引用。
table 存储结果集,供稍后处理。

四.函数

4.1 函数

Aggregate函数,从列中取值,返回一个单一的值,有用的Aggregate函数如下:

  • AVG() 返回平均值
  • COUNT() 返回行数
  • FIRST() 返回第一个记录的值
  • LAST() 返回最后一个记录的值
  • MAX() 返回最大值
  • MIN() 返回最小值
  • SUM() 返回总和

Scalar 函数,基于输入值,返回一个单一的值

  • UCASE() 将某个字段转换为大写
  • LCASE() 将某个字段转换为小写
  • MID() 从某个文本字段提取字符
  • LEN() 返回某个文本字段的长度
  • ROUND() 对某个数值字段进行指定小数位数的四舍五入
  • NOW() 返回当前的系统日期和时间
  • FORMAT() 格式化某个字段的显示方式

4.2 Aggregate函数

AVG函数

SELECT AVG(column_name) FROM table_name
SELECT site_id, count FROM access_log
WHERE count > (SELECT AVG(count) FROM access_log);

COUNT() 函数

SELECT COUNT(*) FROM table_name;

查找这列的不同类型的数量

SELECT COUNT(DISTINCT column_name) FROM table_name;

FIRST() 函数 limit

SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 1;

LAST() 函数 limit

SELECT column_name FROM table_name ORDER BY column_name DESC LIMIT 1;

MAX() 函数

SELECT MAX(column_name) FROM table_name;

MIN() 函数

SELECT MIN(column_name) FROM table_name;

SUM() 函数

SELECT SUM(column_name) FROM table_name;

4.3 group by

结合聚合函数,根据一个或多个列对结果集进行分组;

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

原表内容如下

+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+

针对site_id列进行group by

select * from access_log group by site_id;

效果和distinct一样,在每个site_id的值上都挑选了第一个记录

| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   4 |       2 |    10 | 2016-05-14 |
|   2 |       3 |   100 | 2016-05-13 |
|   6 |       4 |    13 | 2016-05-15 |
|   5 |       5 |   205 | 2016-05-14 |
+-----+---------+-------+------------+

执行了聚合语句,并把聚合后的新列作为展示列,对于聚合操作,是对group by后相同的值分别聚合;

select aid,site_id,count,date,count(site_id) from access_log group by site_id ;

group by多表连接,统计所有网站的访问的记录数
Websites表存所有的网站信息,access_log存网站的访问信息,join left ON基于网站的访问access_log,GROUP BY作用于结果整体

SELECT Websites.name,COUNT(access_log.aid) AS nums FROM access_log
LEFT JOIN Websites
ON access_log.site_id=Websites.id
GROUP BY Websites.name;

4.4 having

where子句中无法添加聚合函数,having筛选分组后的各组数据,筛选的是组;

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;

查找访问量大于200的网站,首先....SUM(access_log.count) access_log inner join websites ON access_log.site_id=Websites.id GROUP BY Websites.name
统计出各个网站的访问总量,然后HAVING SUM(access_log.count) > 200选出访问总量大于200的。

SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log
INNER JOIN Websites
ON access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;

4.5 Scalar函数

UCASE()/LCASE() 函数
UCASE把列内容转换为大写
LCASE把列内容转换为小写

SELECT UCASE(column_name) FROM table_name;
SELECT LCASE(column_name) FROM table_name;

MID() 函数
从文本中提取字符串

SELECT MID(column_name,start[,length]) FROM table_name;
参数 描述
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

比如:

SELECT MID(name,1,4) AS ShortTitle FROM Websites;

LEN() 函数
mysql中是LENGTH,返回文本字段中值的长度,数值,日期都可以用

SELECT LENGTH(column_name) FROM table_name;

ROUND() 函数

SELECT ROUND(column_name,decimals) FROM table_name;
参数 描述
column_name 必需。要舍入的字段。
decimals 必需。规定要返回的小数位数。

ROUND(X)四舍五入
ROUND(X,D)四舍五入到D位小数,如果D为0,结果没有小数的部分;

NOW() 函数
now返回得当前时间

SELECT name, url, Now() AS date FROM Websites;

FORMAT() 函数

SELECT FORMAT(column_name,format) FROM table_name;
参数 描述
column_name 必需。要格式化的字段。
format 必需。规定格式。

格式化日期

SELECT name, url, DATE_FORMAT(Now(),'%Y-%m-%d') AS date FROM Websites;

把Websites中的日期格式化为YYYY-MM-DD

SELECT name, url, date_format(now(),'%Y-%m-%d') AS date FROM websites;
posted @ 2016-08-17 15:06  zhangshihai1232  阅读(118)  评论(0)    收藏  举报