❤️持续创作,加速成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情”
🎨 个人介绍
👉大家好,我是:旺仔不是程序员
👉认真分享技术,记录学习过程的点滴,如果我的分享能为你带来帮助,请支持我奥🍻
👉你的支持,是我每天更新的动力。
👉赞点:👍 留言:✍ 收藏:⭐
👉个人格言:想法一步一步的落实,才是你我前进最佳选择。
1. 条件判断函数
1. IF(expr,v1,v2)函数
- 说明:IF(expr, v1, v2):如果表达式expr是TRUE,则返回值为v1;否则返回值为v2
# 使用IF()函数进行条件判断,输入语句如下:
SELECT IF(12,2,3),
SELECT IF(1<2,'yes ','no')
#如果是0,判断为false ,非零为true
SELECT IF(STRCMP('test','test1'),'no','yes')
2. IFNULL(v1,v2)函数
说明:
- IFNULL(v1,v2):假如v1不为NULL,则IFNULL()的返回值为v1;否则其返回值为v2
- 如果报错,显示报错信息
# 使用IFNULL()函数进行条件判断,输入语句如下:
SELECT IFNULL(1,2), IFNULL(NULL,10), IFNULL(1/0, 'wrong');
3. CASE函数
# 使用CASE value WHEN语句执行分支操作,输入语句如下:
SELECT CASE 2
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'more'
END;
# 使用CASE WHEN语句执行分支操作,
# 当CASE 没有条件时,他会执行执行到第一个结果为ture的语句
# 输入语句如下:
SELECT CASE
WHEN 0<1 THEN 'true'
WHEN 1<2 THEN 'true1'
ELSE 'false'
END;
2. 系统信息函数
1. 获取MySQL版本号、连接数和数据库名的函数
SHOW PROCESSLIST的参数说明
- Id列,用户登录MySQL时,系统分配的是“connection id”
- User列,显示当前用户。如果不是root,这个命令就只显示用户权限范围内的SQL语句
- Host列,显示这个语句是从哪个IP的哪个端口上发出的,可以用来追踪出现问题语句的用户
- db列,显示这个进程目前连接的是哪个数据库
- Command列,显示当前连接执行的命令,一般取值为休眠(Sleep)、查询(Query)、连接(Connect)
- Time列,显示这个状态持续的时间,单位是秒
- State列,显示使用当前连接的SQL语句的状态,很重要的列。后续会有所有状态的描述,State只是语句执行中的某一个状态。一个SQL语句,以查询为例,可能需要经过Copying to tmp table、Sorting result、Sending data等状态才可以完成
- Info列,显示这个SQL语句,是判断问题语句的一个重要依据。
# 查看当前MySQL版本号,输入语句如下:
SELECT VERSION();
# 查看当前用户的连接数,输入语句如下:
SELECT CONNECTION_ID();
# 使用SHOW PROCESSLIST命令输出当前用户的连接信息,输入语句如下:
SHOW PROCESSLIST;
# 查看当前使用的数据库,输入语句如下:
SELECT DATABASE(),SCHEMA();
2. 获取用户名的函数
# 获取当前登录用户名称,输入语句如下:
# SYSTEM_USER(), SESSION_USER() 和 USER()返回的结果一样
SELECT USER(), CURRENT_USER, CURRENT_USER(), SYSTEM_USER(), SESSION_USER()
3. 获取字符串的字符集和排序方式的函数
# 使用CHARSET()函数返回字符串使用的字符集,输入语句如下:
SELECT CHARSET('abc')
SELECT CHARSET(CONVERT('abc' USING latin1))
SELECT CHARSET(VERSION())
# 使用COLLATION()函数返回字符串排列方式,输入语句如下:
SELECT COLLATION('abc'),COLLATION(CONVERT('abc' USING utf8))
4. 获取最后一个自动生成的ID值的函数
# 使用SELECT LAST_INSERT_ID查看最后一个自动生成的列值,执行过程如下:
# 1.一次插入一条记录
# 首先创建表worker,其Id字段带有AUTO_INCREMENT约束,输入语句如下:
CREATE TABLE worker (
Id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
Name VARCHAR(30)
);
# 分别单独向表worker中插入2条记录:
INSERT INTO worker VALUES(NULL, 'jimy');
INSERT INTO worker VALUES(NULL, 'Tom');
SELECT * FROM worker;
SELECT LAST_INSERT_ID();
# 2.一次同时插入多条记录
接下来,向表中插入多条记录,输入语句如下:
INSERT INTO worker VALUES (NULL, 'Kevin'),(NULL,'Michal'),(NULL,'Nick');
# 查询已经插入的的记录,
SELECT * FROM worker;
# 这里是记录INSERT INTO 的执行次数
# INSERT INTO worker VALUES (NULL, 'Kevin'),(NULL,'Michal'),(NULL,'Nick');这条语句INSERT INTO执行了一次
#所以最后的结果为3
SELECT LAST_INSERT_ID();
3. MySQL 8.0的新特性
1. 加密函数
# 使用MD5函数加密字符串,输入语句如下:
SELECT MD5 ('mypwd');
# 使用加密函数SHA2(str, hash_length)
SELECT SHA('tom12346')
# 使用加密函数SHA2(str, hash_length)
# hash_length支持的值为224、256、384、512和0。其中,0等同于256
# 不使用以上数字加密,返回null
SELECT SHA2('tom12346',384)
# 使用ENCODE加密字符串,输入语句如下:
# 在具体字段上加密,需要表的存在
SELECT ENCODE('secret','cry')
SELECT LENGTH(ENCODE('secret','cry'));
2. 窗口函数
# 创建公司部门表branch,包含部门的名称和部门人数两个字段,创建语句如下:
CREATE TABLE branch
(
name VARCHAR(128) NOT NULL,
brcount INT NOT NULL
)
# 插入数据
INSERT INTO branch(name,brcount) VALUES
('branch1',5),
('branch2',10),
('branch3',8),
('branch4',20),
('branch5',9)
# 查看数据
SELECT * FROM branch
#创建了名称为w1的窗口函数,规定对brcount字段进行排序
# 然后在SELECT子句中对窗口函数w1执行rank()方法,将结果输出为rank字段
SELECT *,RANK() OVER w1 AS 'rank' FROM branch window w1 AS (ORDER BY brcount)
# 查询部门总人数
SELECT *,SUM(brcount) over() as total_count FROM branch
# 可以一次性查询出每个部门的员工人数占总人数的百分比
SELECT *, (brcount)/(SUM(brcount) over()) AS rate FROM branch