Mysql高级:函数

目录

系统函数

聚焦函数

字符串函数

日期函数

数学函数

类型转换函数

流程控制函数

自定义函数

基本语法

流程控制

全局变量


系统函数

聚焦函数

聚集函数一般用作统计

- count([distinct]\*) 统计所有的行数(distinct 表示去重再统计,下同)

- sum([distinct]列名) 求一列的和(注意必须是数字类型的)

- avg([distinct]列名) 求一列的平均值(注意必须是数字类型)

- max([distinct]列名) 求一列的最大值

- min([distinct]列名) 求一列的最小值

例子

SELECT COUNT(*) FROM student

SELECT SUM(sid) FROM student

字符串函数

可以使用字符串函数来快速处理字符串

- substring(字符串, 起始位置, 结束位置) 注意下标是从 1 开始,下同

- length(字符串) 获取字符串长度(注意如果使用的是 UTF-8 编码格式,那么一个汉字占 3 字节,数字和字母占一个字节)

- left(字符串, 长度) 从最左边向右截取字符串

- right(字符串, 长度) 从最右边向左截取字符串

- upper(字符串) 字符串中的所有字母转换为大写字母

- lower(字符串) 字符串中的所有字母转换为小写字母

- replace(字符串, 原文, 替换文) 同 Java 中 String 的 replace 效果

SELECT LEFT(name, 1) FROM student

SELECT SUBSTRING(name, 2, 2) FROM student

SELECT UPPER('abcdfg')

SELECT REPLACE(`name`, '小', '大') FROM student

字符串也支持进行拼接,系统提供了字符串的拼接函数

- concat(字符串 1, 字符串 2) 连接两个字符串

SELECT concat(name, '子') FROM student

日期函数

快速将日期向前移动

单位有:year(年)、month(月)、day(日)、hour(小时)、minute(分钟)、second(秒)

- date_add(日期, interval 增量 单位)

SELECT DATE_ADD('2022-1-1',INTERVAL 5 day)

SELECT DATE_ADD('2022-1-1',INTERVAL -1 year)

快速计算日期的间隔天数

- datediff(日期 1, 日期 2)

SELECT DATEDIFF('2022-3-1','2022-2-1')

快速获取当前时间

- curdate() 当前的日期

- curtime() 当前的时间

- now() 当前的日期+时间

也可以单独获取时间中的某个值

- day(日期) 获取日期是几号

- month(日期) 获取日期是几月

- year(日期) 获取日期是哪一年

SELECT DAY(NOW())

数学函数

数学函数比较常规,基本与 Java 的 Math 工具类一致

- abs(x) 求 x 的绝对值

- ceiling(x) x 向上取整

- floor(x) x 向下取整

- round(x, 精度) x 取四舍五入,遵循小数点精度

- exp(x) e 的 x 次方

- rand() 0-1 之间的随机数

- log(x) x 的对数

- pi() π

- power(x, n) x 的 n 次方

- sqrt(x) x 的平方根

- sin(x) cos(x) tan(x) 三角函数

类型转换函数

MySQL 的类型转换也分为隐式类型转换和显示类型转换

SELECT CONCAT(1, '2')

SELECT 1+'2'

这里会产生隐式转换,第一个数字转换成字符串,第二个是字符串转换成数字

需要使用强制类型转换时就需要用到类型转换函数了

- cast(数据 as 数据类型)

convert 函数

数据类型

- BINARY[(N)] :二进制字符串,转换后长度小于 N 个字节

- CHAR[(N)] :字符串,转换后长度小于 N 个字符

- DATE :日期

- DATETIME :日期时间

- DECIMAL[(M[,N])] :浮点数,M 为数字总位数(包括整数部分和小数部分),N 为小数点后的位数

- SIGNED [INTEGER] :有符号整数

- TIME :时间

- UNSIGNED [INTEGER] :无符号整数

SELECT CAST(pi() AS SIGNED)

将字符串转换为数字,会自动进行扫描,一旦遇到非数字的字符,会停止扫描

SELECT CAST('123abc456' as SIGNED) -->123

流程控制函数

- if(条件表达式, 结果 1, 结果 2) 与 Java 中的三目运算符一致 a > b ? "AAA" : "BBB"

- ifnull(值 1, 值 2) 如果值 1 为 NULL 则返回值 2,否则返回值 1

- nullif(值 1, 值 2) 如果值 1 与值 2 相等,那么返回 NULL

- isnull(值) 判断值是否为 NULL

还有一个类似于 Java 中的 Thread.sleep 的函数,以秒为单位

SELECT sleep(10);

自定义函数

mysql可以自定义函数,并使用自定义的函数进行数据处理,唯一比较麻烦的就是函数定义后不能修改,只能删了重新写

基本语法

在定义函数之前记得定义结束符号

delimiter $$

deleimiter ;

一般形式

- create function 函数名称([参数列表]) returns 返回值类型

- begin 和 end 之间写函数的其他逻辑,begin 和 end 就相当于 Java 中的花括号`{ ... }`

- return 后紧跟返回的结果

CREATE FUNCTION test(i int) RETURNS INT

BEGIN

RETURN i;

END

定义一个局部变量

- declare 变量名称 变量类型 [, ...]

- declare 变量名称 变量类型 default 默认值

- set 变量名称 = 值

BEGIN

DECLARE a INT;

SET a = 10;

RETURN  a;

END

在函数内部使用`select`语句,它可以直接从表中读取数据,并可以结合 into 关键字将查询结果赋值给变量

BEGIN

DECLARE a INT;

-- select into from 语句

SELECT COUNT(*) INTO a FROM student;

RETURN a;

END

流程控制

IF 分支语句的格式为:

- if 判断条件 then ... else if 判断条件 then .... else ... end if;

BEGIN

DECLARE a INT DEFAULT 10;

IF a > 10 THEN

    RETURN 1;

ELSE

    RETURN 2;

END IF;

END

可以结合`exists`关键字来判断是否为 NULL

BEGIN

DECLARE a INT DEFAULT 0;

-- IF EXISTS(SELECT * FROM student WHERE sid = 100) THEN

IF NOT EXISTS(SELECT * FROM student WHERE sid = 100) THEN

    SET a = 10;

END IF;

RETURN a;

END

使用 switch 语句,与 Java 不同的是,它支持使用布尔表达式

- case 变量 when 具体值或是布尔表达式 then ... when \* then ... else ... end case;

BEGIN

DECLARE a INT DEFAULT 10;

CASE

    WHEN 1 < 5 THEN

        SET a = 5;

    ELSE

        SET a = 10;

END CASE;

RETURN a;

END

MySQL 提供了三种循环语句

WHILE 语句

- while 循环条件 do ... end while;

LOOP 循环(类似于 Java 中的 goto 写法)

- 循环名称 loop ...(可以插入 leave 语句结束) end loop 循环名称;

repeat 语句

- repeat ... until 结束循环条件 end repeat;

全局变量

可以直接在一次会话中直接定义变量并使用,这时它并不是位于函数内的,这就是全局变量,它无需预先定义,直接使用即可

set @x = 10;

系统默认也有很多的变量,自己定义的变量称为用户变量,系统默认变量称为系统变量

查看系统变量

show GLOBAL VARIABLES

<think>好的,我现在需要解决用户在Jupyter Notebook中使用plt.plot时无法输出图片,只显示类似[<matplotlib.lines.Line2D at 0x17d78fa2ff0>]的问题。首先,我应该回忆一下常见的原因和解决方法。 首先,可能用户没有正确导入matplotlib或者没有使用正确的魔术命令。在Jupyter中,通常需要%matplotlib inline来让图像内嵌显示。用户可能忘记了这个命令,或者没有在正确的位置调用它。需要检查用户的代码中是否有这一行。 其次,matplotlib的后端设置可能有问题。Jupyter Notebook默认使用inline后端,但有时候配置可能被修改,导致无法显示图像。这时候需要确认后端设置是否正确,或者尝试重启内核。 另外,用户可能没有调用plt.show()。不过在Jupyter中,如果使用了%matplotlib inline,通常不需要plt.show(),但如果没有使用这个魔术命令,可能需要。也有可能用户同时使用了其他IDE的设置,导致冲突。 还有可能是代码执行顺序的问题。比如,先画图再执行魔术命令,这时候需要确保%matplotlib inline在导入matplotlib之后,但在绘图之前执行。或者用户可能在同一个单元格中没有按顺序执行命令,导致设置未生效。 另外,检查是否有其他库或代码干扰了matplotlib的配置。例如,某些时候用户的matplotlib配置文件可能有自定义设置,导致图像无法显示。可以建议用户尝试重置配置,或者创建一个新的环境测试。 可能用户安装的matplotlib版本有问题,或者与Jupyter Notebook不兼容。这时候建议升级或重新安装matplotlib和notebook。 还可以检查是否有错误提示,有时候输出中会有异常信息,帮助定位问题。例如,缺少依赖库,或者后端无法加载。 总结一下,可能的解决步骤包括: 1. 确保正确使用%matplotlib inline魔术命令。 2. 检查导入顺序,先导入matplotlib,再设置魔术命令,再绘图。 3. 确认plt.show()是否需要调用。 4. 检查后端设置,尝试切换不同的后端。 5. 重启内核,重新运行所有单元格。 6. 检查版本兼容性,更新相关库。 7. 查看错误信息,排除其他依赖问题。 8. 重置matplotlib配置或使用新环境测试。 需要将这些步骤整理成用户容易理解的指导,分点说明,并提供示例代码。同时,注意使用中文,结构清晰,帮助用户一步步排查问题。</think>在Jupyter Notebook中使用 `plt.plot` 无法显示图片,通常由以下原因及解决方法导致: --- ### **1. 缺少魔术命令 `%matplotlib inline`** - **现象**:输出代码对象而非图像,例如:`[<matplotlib.lines.Line2D at 0x17d78fa2ff0>]` - **原因**:未启用Matplotlib的内嵌显示模式。 - **解决**: ```python # 在导入matplotlib后,绘图前添加以下命令 %matplotlib inline import matplotlib.pyplot as plt # 绘制图像 plt.plot([1, 2, 3], [4, 5, 6]) ``` --- ### **2. 代码执行顺序问题** - **现象**:即使添加了魔术命令仍不显示图像。 - **原因**:魔术命令 `%matplotlib inline` 需在导入库后执行,且需与绘图代码在同一单元格或提前运行。 - **解决**: ```python # 正确顺序示例 %matplotlib inline # 先启用内嵌模式 import matplotlib.pyplot as plt # 再绘图 plt.plot([1, 2, 3], [4, 5, 6]) plt.show() # 在非inline模式下可能需要此命令 ``` --- ### **3. 未调用 `plt.show()`** - **现象**:未使用 `%matplotlib inline` 时,需手动调用 `plt.show()`。 - **解决**: ```python import matplotlib.pyplot as plt plt.plot([1, 2, 3], [4, 5, 6]) plt.show() # 显示图像 ``` --- ### **4. 后端配置冲突** - **现象**:环境变量或配置文件指定了非交互式后端。 - **解决**: - 临时指定后端: ```python %matplotlib inline import matplotlib matplotlib.use('module://ipykernel.pylab.backend_inline') # 强制使用Jupyter后端 ``` - 重置配置文件:删除 `~/.matplotlib/matplotlibrc` 或使用默认配置。 --- ### **5. 内核未重启** - **现象**:修改配置后未生效。 - **解决**:重启Jupyter Notebook内核,重新运行代码。 --- ### **6. 依赖库缺失** - **现象**:提示缺少 `ipykernel` 或 `tkinter`。 - **解决**: ```bash # 安装必要依赖 pip install ipykernel sudo apt-get install python3-tk # Linux系统 ``` --- ### **完整示例代码** ```python # 步骤1:启用内嵌模式 %matplotlib inline # 步骤2:导入库 import matplotlib.pyplot as plt # 步骤3:绘制图像 plt.plot([1, 2, 3], [4, 5, 6]) plt.xlabel("X轴") plt.ylabel("Y轴") plt.title("示例图像") # 步骤4:显示图像(inline模式下可省略plt.show()) plt.show() ``` --- 通过以上步骤排查,通常可解决图像无法显示的问题。若问题依旧,可尝试更新库版本: ```bash pip install --upgrade matplotlib jupyter ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值