1.操作数

常数

1'abc'2019-08-16 17:10:43

列名

test1

函数调用

NOW()

子查询


表达式

(col - 5) / 3

2.操作符

算数操作符

+-*/DIV(除法商取整)、%(除法取余)、-(负号)

比较操作符

=
<>!=
<<=>>=
BETWEEN(位于之间)、NOT BETWEEN(位于之间)
IN(列表中某一项)、NOT IN(不是列表中某一项)
IS NULL(为空)、IS NOT NULL(不为空)
LIKE(模糊匹配)、NOT LIKE(模糊不匹配)

逻辑操作符

AND(且)、OR(或)、XOR(仅一真为真)

3.表达式

表达式 = 操作数 + 操作符

作为列名

对某列数据进行处理

SELECT number, `subject`, score + 100 计算分数 FROM student_score; # score 列所有值 + 100
SELECT CONCAT('学号-科目-成绩:', number, '-', `subject`, '-', score) AS 成绩描述 FROM student_score; # 按列拼接值

作为搜索条件

对某表数据进行过滤

SELECT number, `subject`, score FROM student_score WHERE score > 90;

4.隐式转换

操作符隐式转换

1 + 2 # -> 3
'1' + 2 # -> 3
'1' + '2' # -> 3

函数隐式转换

CONCAT('1', '2') # -> '12'
CONCAT('1', 2) # -> '12'
CONCAT(1, 2) # -> '12'

新增数据隐式转换

CREATE TABLE test(i1 TINYINT, i2 VARCHAR(100));
INSERT INTO test(i1, i2) VALUES('100', 200); # -> 100、'200'

5.统计函数

在 WHERE 过滤后执行,不能放在搜索条件中

指定列行数

COUNT(*) # -> 6(包含值为 null 的行)
COUNT(列名) # -> 5(不包含值为 null 的行)

SELECT COUNT(DISTINCT department) 去重后专业数量, AVG(number) 学号平均值
	FROM student_info
	WHERE number > 0020180101; # 在 学号>0020180101 的记录中计算 去重后专业数量、学号平均值

指定列最大值

MAX(列名) # -> 100

指定列最小值

MIN(列名) # -> 45

指定列值之和

SUM(列名) # -> 585

指定列平均值

AVG(列名) # -> 73.1250

6.字符串函数

长度

LENGTH('abc')  # -> 3

转换大小写

LOWER('Abc') # -> 'abc'
UPPER('Abc') # -> 'ABC'

左/右去空格

LTRIM(' abc') # -> 'abc'
RTRIM('abc ') # -> 'abc'

左/右截取指定长度的子串

# 参数1:字符串
# 参数2:截取长度
LEFT('abc123', 3) # -> 'abc'
RIGHT('abc123', 3) # -> '123'

指定位置截取指定长度的子串

# 参数1:字符串
# 参数2:字符串索引,从1开始
# 参数3:截取长度
SUBSTRING('abc123', 2, 3) # -> 'bc1'

拼接

CONCAT('abc', '123', 'xyz') # -> 'abc123xyz'

7.日期时间函数

获取当前日期时间

NOW() # -> 2019-08-16 17:10:43

获取当前日期

CURDATE() # -> 2019-08-16

获取当前时间

CURTIME() # -> 17:10:43

获取指定日期

DATE('2019-08-16 17:10:43') # -> 2019-08-16

根据 format 转换日期时间

# 年月日
  # %Y:4位数字形式的年(例如 2019)
  # %y:2位数字形式的年(例如 19)
  # %M:英文月份(例如 January、February、...、December)
  # %b:简写英文月份(例如 Jan、Feb、...、Dec)
  # %m:数值月份(例如 00~12)
  # %D:英文日期(例如 0th、1st、2nd、...、31st)
  # %d:数值日期(例如 00~31)
# 时分秒
  # %H:24小时制 (例如 00~23)
  # %h:12小时制 (例如 01~12)
  # %i:分钟(例如 00~59)
  # %S:秒(例如 00~59)
  # %s:秒(例如 00~59)
  # %f:微秒(例如 000000~999999)
# 其他
  # %p:上午或下午(例如 AM、PM)
  # %W:英文星期(例如 Sunday、Monday、...、Saturday)
  # %w:数值星期(例如 0=星期日、1=星期一、 6=星期六)
DATE_FORMAT(NOW(),'%m-%d-%Y') # -> 08-16-2019

获取两个日期间隔的天数

负数代表前一个参数代表的日期比较小

DATEDIFF('2019-08-16', '2019-08-17') # -> -1

获取指定间隔之前/后的日期时间

# YEAR 年
# QUARTER 季度
# MONTH 月
# WEEK 星期
# DAY 天
# HOUR 小时
# MINUTE 分钟
# SECOND 秒
# MICROSECOND 毫秒
DATE_SUB('2019-08-16 17:10:43', INTERVAL 2 DAY) # -> 2019-08-14 17:10:43
DATE_ADD('2019-08-16 17:10:43', INTERVAL 2 DAY) # -> 2019-08-18 17:10:43

8.数学函数

绝对值

ABS(-1) # -> 1

回圆周率

PI() # -> 3.141593

随机数

RAND() # -> 0.7537623539136372

e 指定次幂

EXP(1) # -> 2.718281828459045

除法余数

MOD(5, 2) # -> 1

平方根

SQRT(9) # -> 3

正弦

SIN(PI() / 2) # -> 1

余弦

COS(PI())	# -> -1

正切

TAN(0) # -> 0
此文档贡献者: 嗷大张