> 文章列表 > 表达式和函数

表达式和函数

表达式和函数

表达式

将数字和运算符连接起来的组合称为表达式。我们可以将数字称为操作数,单个操作数也可以被看作是一个表达式。

操作数:常数,列名,函数调用,其他表达式

运算符:算数运算符,比较运算符,逻辑运算符

介绍几个比较哦特殊的:

a DIV b:除法, 取商的整数部分

a XOR b:a和b有且只有一个为真时,表达式为真。

在上一章我们学到比较表达式。又比较运算符连接而成的表达式也称为布尔表达式,除非表达式中包含NULL,否则布尔表达式的结果只能是1或者0

表达式的使用:

把这些操作数和运算符相互结合起来就可以组成表达式 

1.作为计算字段放在select子句中

查询列表处的每个表达式都会被当作结果集中的一个列。

2.作为搜索条件放在where子句中

其实在where子句中可以放置任意的表达式,在读取某条记录时,只要where子句中表达式的结果不为0或者NULL,那么该纪录就会被加入到结果集。

表达式中的NULL:
NULL作为算数运算符的操作时,表达式的结果都为NULL。

除<=>,is NULL,is not NULL 外,NULL作为其余比较运算符的操作数时,表达式的结果都为NULL。

函数:
字符串处理函数:

left('abc123', 3): 给定字符串从左边取指定长度的子串。

right(.....................给定.....从右边...............

length('abc') 给定字符串占用的字节数量

lower(’ABC') 给定字符串转换成小写

upper('abc') 给定字符串转换成大写

ltrim('     abc') 给定字符串左边空格去除后的格式

rtrim('abc     ') 给定字符串后边空格去除后的格式

substring('abc123', 2, 3)给定字符串从指定位置截取指定长度的子串

concat(‘abc', '123', 'xyz')将给定的各个字符串拼接成一个新的字符串

char_length(’狗哥') 给定字符串的字符数量。

日期和时间处理函数:

now()返回当前日期和时间

curdate()返回当前日期

curtime()返回当前时间

date()将给定的日期和时间值的日期提取出来

date_add()将给定的日期和时间值添加指定的时间间隔;

date_sub(‘.....' interval * 单位)将给定的日期和时间值减去指定的时间间隔

datediff()返回两个日期之间的天数(负数表示前一个参数代表的日期比后一个参数代表的日期小)

data_format(now(), '%m-%d-%y')用给定的格式显示日期和时间

year()提取年份

month()提取月份

day()提取日

hour()提取小时

minute()提取分钟

second()提取秒

在使用date_add和sub的时候注意我们的单位有这些:
microsecond 毫秒

second 秒

minute 分钟

hour 小时

day 天

week 周

month 月

quarter 季度

year 年

在使用date_format是我们可以通过一些所谓的格式符来自定义显示格式:

%b, 简写的月份名称(jan,feb....)

%D, 带有英文后缀的月份中的日期(0st, 1st, 2st....)

%d, 数字格式的月份中的日期(00,01.....)

%f 微秒

%H 24小时制的小时(00~24)

%h 12小时制的小时(00~12)

%i 数值格式的分钟(00~59)

%M 月份名(january,February.....)

%m 数值形式的月份(00~12)

%p 上午或下午

%s 秒(00~59)
%S 秒(00~59)

%W 星期名(sunday,monday....)

%w 周内第几天(0=星期日,1=星期1, .....)

%Y 四位数数字形式的年(例如2023)

%y 两位数数字形式的年(例如23)

数值处理函数:
abs()取绝对值

pi()返回圆周率

cos ()返回一个角度的余弦

sin()返回一个角度的正弦

tan()返回一个角度的正切

pow()返回某个数的指定次幂

sqrt()返回一个数的平方根

mod() 返回除法的余数

rand() 返回一个随机数

ceil()返回不小于给定值的最小整数

floor()返回不大于给定值的最大整数

流程控制表达式和函数:
语法:
case when 表达式1 then 结果1[when 表达式2 then 结果2.....] else 默认结果 end

当表达式1为true时就返回结果1

一定要记得写末尾的end!!

mysql> select *,
    -> case when score<60 then 'bujige'
    -> when score<90 then 'hege'
    -> else 'youxiu' end as level
    -> from student_score;
+-----------+--------------------+-------+-------+
| number    | subject            | score | level |
+-----------+--------------------+-------+-------+
| 220101101 | 计算机是怎样运行的 |    78 | hege  |
| 220101102 | 计算机是怎样运行的 |    79 | hege  |
| 220101103 | 计算机是怎样运行的 |    78 | hege  |
| 220101104 | 计算机是怎样运行的 |    77 | hege  |
| 220101105 | 计算机是怎样运行的 |    77 | hege  |
+-----------+--------------------+-------+-------+
5 rows in set (0.01 sec)

if语句:

语法:if(表达式1, 表达式2, 表达式3)

含义是当表达式1为true时,返回值就为表达式2, 否则为表达式3

ifnull语句:
语法:ifnull(表达式1, 表达式2)

含义是当表达式1为NULL时,返回值就为表达式2,否则返回表达式1.

nullif语句:
语法:nullif(表达式1, 表达式2)

含义是当表达式1的值和表达式2的值相同时,函数返回值为NULL,否则返回表达式1.

汇总函数:

max(表达式)

从匹配的结果中返回表达式对应列的最大值;

mysql> select max(score) from student_score;
+------------+
| max(score) |
+------------+
|         79 |
+------------+
1 row in set (0.01 sec)

min(表达式)

从匹配结果中返回表达式对应列的最大值

sum(表达式)
求和的意思

avg(表达式)

取平均数

count(操作数)

对列中的某个值进行计数

mysql> select count(1) from student_score;
+----------+
| count(1) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

隐式类型转换:

只要某个表达式的类型与上下文要求的类型不符合,MySQL就会根据上下文环境中需要的类型对该表达式进行类型转换。由于这些类型转换是MySQL自动完成的,所以也称为隐式类型转换。

1.将操作数类型转换为运算符需要的类型

比如把字符串’1‘和1进行相加,MySQL就会自动把字符串’1‘ 自动转换为1的整形进行相加

如果字符串中包含其他字符或者字母的话就会从第一个字符进行判断最长的数字是多少就是多少你,比如’123asd‘,这个就会转换成123.其实,当字符串类型的表达式与其他类型的表达式进行算数运算,比较大小,已经进行逻辑判断时,都会被转换成double类型。

2.将函数参数转换成该函数期望的类型

3.在where子句中,单独的字符串类型的表达式会被转换为double类型的数值

mysql> select 5 where '2a';
+---+
| 5 |
+---+
| 5 |
+---+
1 row in set, 1 warning (0.01 sec)

这里的2a就转换成了2,所以查询结果不为空集

4存储数据时,把某个值转换成某个列所需要的类型