1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
-- ########################################################
-- # 第11章: 使用数据处理函数
-- ########################################################
-- 注意: 函数的可移植性不强
-- 大多数SQL实现支持如下类型的函数:
-- 用于处理文本串,
-- 用于在数值数据上进行算术操作,
-- 用于处理日期和时间值
-- 返回DBMS正在使用的特殊信息的系统函数。
-- 文本处理函数
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- RTrim()
-- Upper()将文本转换为大写;
-- Left()返回串左边的字符
-- Right()
-- Locate()找出串的一个子串(Locate定位)
-- Lower()
-- SubStrig() 返回子串的字符
select vend_name, Upper(vend_name) AS vend_name_upcase from vendors;
-- 补充:字符串处理函数
char_length(s) -- 返回字符串的字符数
length -- 返回字符串长度 (指所占用的内存空间,指的是占多少字节)
concat_ws(x,s1,s2,...) -- 以指定分隔符连接字符串
concat(s1,s2,...) -- 将字符串合并为一个字符串
left(s,n)/right(s,n) -- 返回字符串的前/后n个字符
lpad(s1, len, s2)/ -- 将字符串s1用s2填充到指定的len
rpad(s1, len, s2)
ltrim/rtrim/trim(s)
trim(s1 from s) -- 去掉字符串s中开始处和结尾处的字符串s1
repeat(s,n) -- 输出,重复s字符串n次
space(n) -- 输出,n个空格
replace(s,s1,s2) -- 将字符串s中的s1替换成s2;(搜索时区分大小写)
strcmp(s1,s2) -- 比较字符串,忽略大小写
substring(s,n,len) -- 在字符串s中从n位置开始截取len长度。从1开始
reverse(s) -- 翻转字符串
elt(n,s1,s2,...) -- 返回指定位置的的字符串。返回后面列出的字符串第几个位置的字符串
更多函数见麦子学院。
;
-- 比较这两者的差别
select char_length('maizi') AS 字符串的字符数量, length('maizi') AS 字符串长度(字节);
select char_length('啊') AS 字符串的字符数量, length('啊') AS 字符串长度(字节);
-- 拼接示例
select concat('Hello ','world');
-- 当拼接的字符串中有null结果为null
select concat('Hello ','world', null);
-- 同时注意以下连接
select concat_ws('^_^','Hello','你好','Daling');
select concat_ws('','Hello','你好','Daling');
select concat_ws(null,'Hello','你好','Daling'); -- 结果为null
select concat_ws('^_^','Hello','你好','Daling',null); -- 结果不为null
-- 几个示例
select left('abcde',2), right('abcde',2);
select lpad('a',5,'?'), rpad('a',5,'!');
select trim('a' from 'abcda');
select substring('abcde',2,2);
select elt(2,'a','b','c'); -- 返回后面列出的字符串第几个位置的字符串
-- 日期处理函数
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- 一般,应用程序不使用用来存储日期和时间的格式,因此与其相关的函数总是被用来读取和处理这些值。
-- AddDate() 增加一个日期(天、周等)
-- AddTime() 增加一个时间(时、分等)
select CurDate()AS 返回当前日期;
select Now() AS 返回当前的时间日期;
select CurTime() AS 当前时间;
select hour(curtime()) AS 时间的小时;
select minute(Now()) AS 时间的分钟; -- 传入时间日期也是可以的
select second(curtime()) AS 时间的秒数;
select Date(Now()) AS 返回时间的日期部分; -- 注释语句一定是 -- 加一个空格
select Year(CurDate()) AS '日期的年份';
select DateDiff(CurDate(),'1992-01-01') '大概活了多少天'; -- 计算两个日期之差
-- Date_Add() -- 高度灵活的日期运算函数
select Data_Format('yyyy年mm月dd' , Now()); -- 返回一个格式化的日期或时间串
select Day(CurDate()) AS 该月的第几天; -- 返回一个日期的天数部分
select DayOfWeek(CurDate()) AS '日期在一周内的第几天'; -- 对于一个日期,返回对应的所在的一周内的第几天,其中星期天是第一天。
select month(CurDate()) AS 日期中月份;
select monthname(CurDate()) AS 日期中月份名称;
select dayname(CurDate()) AS 日期是星期几;
select weekday(CurDate()) AS 日期是星期几; -- 0代表星期一
select week(CurDate()) AS 日期是一年中的第几个星期; -- 0代表第一周
-- MySQL使用的日期格式: yyyy-mm-dd。 此为日期的首选格式。
select * from orders where order_date = '2005-09-01';
-- 上面忽略了时间。其中order_date的数据类型为datetime。当时间不为 00:00:00是匹配不到的。
desc orders;
show create table orders;
insert into orders(order_date, cust_id) values(Now(), 10002);
select * from orders;
select * from orders where order_date = Date(Now()); -- 比如此句就匹配不到结果
-- 使用Date()解决上面的问题,Date()的参数是 datetime类型。
update orders set order_date=Date(Now()) where order_num = 20010;
select * from orders where Date(order_date) = Date(Now());
-- 检索2005-09月的所有订单
select cust_id, order_num from orders
where Date(order_date) between '2005-09-01' and '2005-09-30';
-- 方式二:
select cust_id, order_num from orders
where Year(order_date)= 2005 and Month(order_date) = 9;
-- 数值处理函数
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- 仅处理数值数据。 代数,三角,几何运算; 用的比较少, 具有讽刺意味的是
-- 在主要DBMS的函数中,数值函数是最一致最统一的函数。
select Abs(-22); -- 绝对值
select Cos(0); -- 返回角度的余弦
-- Exp(); -- 一个数的指数值
select Mod(5,2); -- 返回操作的余数
select Pi(); -- 返回pi
select Rand(Second(Now())); -- 返回一个随机数, 可指定种子数
select Sin(0); -- 正弦值
select Sqrt(4); -- 平方根
select Tan(45); -- 正切
|