MYSQl数据库详细知识点和在Navicat中的具体操作

MySQL数据库

数据库--->服务器

核心功能是用来存储数据的

List、Dictionary集合----->对象是存储在内存当中,当程序停止或者服务停止时,存储在内存当中的数据就消失了,

对于一些重要的数据(用户)是需要永久保存的,数据可以存储到文件中,而文件是存储在硬盘上。

数据库本质上就是一个文件系统,首先需要先创建一个数据库(database),创建的数据库它是一个

文件夹,在数据库中创建的它是一个文件。

MY 我的

SQL----> Struct Query Language 结构化 查询 语言

对于数据库来说,我们可以分类:

(根据数据库中存储的数据是否按照二维表行列存储),我们可以把数据库简单的分为:关系型数据

库和非关系型数据库

MYSQL它属于关系型数据库

根据sql的功能不同,我们可以把sql大致上分为四类:

•DDL: Data Definition Language 数据定义语言,主要是用来操作数据库和表 关键字:create alter drop

•DML:Data Manipulation Language 数据操作语言,主要是用于进行对表增、删、改操作 关键字:insert delete update

•DCL:Data Control Language 数据控制语言,主要是用于对数据库的用户权限和安全级别进行设置控制。

•DQL:Data Query Language 数据查询语言,主要用于对数据库中的表进行查询操作。 select from where

1.打开Navicat软件

2.选择你所对应的数据库

3.根据电脑和个人密码进行登录

4.新建数据库

5.设定数据库名称和编码格式

6.创建表

7.设置所需的字段信息

8.设置表的具体数据内容

数据库操作

用户:root---超管 超级管理员

用户:admin---管理员 具有普通的权限

sql 复制代码
-- ---------------数据库操作 ---------------
​
-- 两个短划线+空格 是Mysql的注释
​
-- 创建数据库 create database 数据库
-- CREATE DATABASE student;
​
-- 创建数据库指定编码字符集 create database 数据库名称 character set 编码字符集;
​
-- 查看数据库 show create database 数据库名称;
-- SHOW CREATE DATABASE student;
​
-- 删除数据库 drop database 数据库名称;
-- drop database student;
​
-- 查看当前服务器下创建的所有数据库 show databases;
-- SHOW DATABASES;
​
-- 使用数据库 use 数据库名称;
-- USE student;
​
-- 查看操作的数据库 select database();
-- SELECT DATABASE();

表的操作

表中的数据类型

•整数类型:可以存储整数值,一般用int类型

•小数类型:可以存储小数值,一般用double类型

•日期类型:可以存储日期类型,一般用datetime类型

•文本二进制类型:可以存储字符串和字节数据,一般用varchar类型

分类 类型名称 说明
整数类型 tinyint 很小的整数
整数类型 smallint 小的整数
整数类型 mediumint 中等大小的整数
整数类型 int(integer) 普通大小的整数
小数类型 float 单精度浮点数
小数类型 double 双精度浮点数
小数类型 decimal (m,d) 压缩严格的定点数,m 表示总位数,d 表示小数点几位
日期类型 year YYYY 1901~2155
日期类型 time HH:MM:SS -838:59:59~838:59:59
日期类型 date YYYY-MM-DD 1000-01-01~9999-12-31
日期类型 datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59
日期类型 timestamp YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07UTC
文本、二进制类型 CHAR(M) M 为 0~255 之间的整数
文本、二进制类型 VARCHAR(M) M 为 0~65535 之间的整数
文本、二进制类型 TINYBLOB 允许长度 0~255 字节
文本、二进制类型 BLOB 允许长度 0~65535 字节
文本、二进制类型 MEDIUMBLOB 允许长度 0~167772150 字节
文本、二进制类型 LONGBLOB 允许长度 0~4294967295 字节
文本、二进制类型 TINYTEXT 允许长度 0~255 字节
文本、二进制类型 TEXT 允许长度 0~65535 字节
文本、二进制类型 MEDIUMTEXT 允许长度 0~167772150 字节
文本、二进制类型 LONGTEXT 允许长度 0~4294967295 字节
文本、二进制类型 VARBINARY(M) 允许长度 0~M 个字节的变长字节字符串
文本、二进制类型 BINARY(M) 允许长度 0~M 个字节的定长字节字符串
常用约束

约束就是对表中的数据进行操作的一种限制,一般是为了保证数据的一种安全。

  • 主键约束:唯一性,非空性 添加关键字:primary key

  • 唯一约束:唯一性,可以为空,但是只能有一个 添加关键字:unique

  • 默认约束:给字段添加默认值,如果给表中的字段赋值时没有赋值,就会使用你自己设置的默认值赋值 添加关键字:default

  • 自增长:类型一般都是整数类型,一般用于主键自动增长

  • 非空约束:数据不能为空,添加关键字:not null

约束名称 SQL 表示 说明
主键约束 primary key 具备唯一性、非空性
唯一约束 unique 具备唯一性,可空但空值只能存在一个
默认约束 default 字段未赋值时,自动使用预设的默认值
自增长 auto_increment 通常用于整数类型的主键,实现自动增长
非空约束 not null 字段数据不允许为空
sql 复制代码
-- ---------------表的操作---------------
​
-- 主键约束:唯一性,非空性 添加关键字:primary key
-- 唯一约束:唯一性,可以为空,但是只能有一个 添加关键字:unique
-- 默认约束:给字段添加默认值,如果给表中的字段赋值时没有赋值,就会使用你自己设置的
-- 默认值赋值 添加关键字:default
-- 自增长: 类型一般都是整数类型,一般用于主键自动增长
-- 非空约束:数据不能为空,添加关键字:not null
​
-- 创建表
-- create table 表名(
-- 字段名 类型(长度) [约束],
-- 字段名 类型(长度) [约束],
-- 字段名 类型(长度) [约束]
-- ...
-- );
​
-- 使用数据库
-- USE school;
​
-- 创建学生表
--  CREATE TABLE student (
--  id int(15) primary key,
--  sname varchar(20),
--  age int(3),
--  address varchar(30)
-- );
​
-- 查看当前数据库中的表
-- show tables;
​
-- 查看表结构 desc 表名;
-- DESC student;
​
-- 删除表 drop table 表名;
​
-- 修改表
-- 1. 添加1列 alter table 表名 add 字段名 类型(长度)[约束];
-- ALTER TABLE student ADD sex VARCHAR(2);
-- 2. 修改列的类型(长度,类型)
-- alter table 表名 modify 要修改的字段名 类型(长度)[新约束];
-- 3. 修改列名
-- alter table 表名 change 旧列名 新列名 类型(长度)[约束];
-- 4. 删除表中的列 alter table 表名 drop 列名;
-- 5. 修改表名 rename table 旧表名 to 新表名;
-- 6. 修改表的字符集 alter table 表名 character set 编码字符集;
-- 7. 查看你当前创建的表结构 show create table 表名;
-- SHOW CREATE TABLE student;
​
-- 退出mysql服务 quit

数据库中的记录(数据)操作

sql 复制代码
-- ---------------数据库中的记录(数据)操作---------------
-- 增删改查
​
-- 1. 插入记录 insert
-- 第一种写法: 指定具体的插入字段值, 没有指定的不能赋值
-- INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
-- 第二种写法: 批量插入(高效,减少IO)
-- INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1-1, 值1-2, ...), (值2-1, 值2-2, ...), ...;
-- 第三种写法: 省略字段(按表结构顺序插入,需包含所有非自增/非默认字段)
-- INSERT INTO 表名 VALUES (值1, 值2, ...);
-- 第四种写法: 插入并忽略重复(主键/唯一索引冲突时跳过)
-- INSERT IGNORE INTO 表名 (字段1, ...) VALUES (...);
-- 第五种写法: 插入或更新(主键/唯一索引冲突时更新指定字段)
-- INSERT INTO 表名 (字段1, ...) VALUES (...) ON DUPLICATE KEY UPDATE 字段1=新值1, 字段2=新值2;
​
-- 2. 修改表记录带有条件 update
-- update 表名 set 字段名1=值1,字段名2=值2,...where 条件;
​
-- 3. 删除表记录带条件 delete 
-- delete from 表名 where 条件
​
-- 4. 删除表记录不带条件--->删除表中的所有数据
-- delete from 表名; 不会删除之前的自增序列
-- 或者 
-- truncate  table 表名; 会自动删除自增的序列
​
-- 5. 查询操作 select
-- 查询所有 select * form 表名;
-- 查询指定列信息 select 列名1,列名2,.. from 表名;
-- 查询所有信息使用表的别名 select * from 表名 as 别名;
-- 查询列信息使用列别名 select 字段名 as 别名 from 表名;
-- 查询去掉重复 select distinct(字段名) from 表名;
-- 将所有的学生的年龄+5进行显示
-- select id,snmae,age+5,address from student;

条件查询

运算分类 运算符表示 说明
比较运算符 >、<、>=、<=、=、!=、<>(等价于!=)、<=> 基本数值 / 字符串比较,包含大于、小于、大于 (小于) 等于、不等于
范围运算符 BETWEEN ... AND ...、IN(set)、NOT IN(set) 显示在某一区间(含头含尾)或列表中的值;NOT IN 表示排除列表内的值,例:IN (100,200)
模糊查询运算符 LIKE、NOT LIKE 模糊查询,含两个通配符:% 匹配多个字符(例:first_name like 'a%');*匹配一个字符(例:first_name like 'a_');NOT LIKE 为排除匹配结果
空值判断运算符 IS NULL、IS NOT NULL 判断字段是否为空;IS NULL 对应判断为空,IS NOT NULL 对应判断不为空
逻辑运算符 and、or、not 多条条件组合:and 为同时成立,or 为任一成立,not 为不成立(例:where not (salary>100));优先级:NOT > AND > OR
sql 复制代码
-- ---------------条件查询---------------
​
-- 查询学生表中地址为清华的学生信息
-- select * from stutable where address = '清华';
​
-- 查询年龄大于20岁的学生信息
-- select * from stutable where age > 20;
​
-- 查询姓名中包含"小"的学生信息 模糊查询
-- select * from stutable where sname like '%三%';
​
-- 或者下面写法
-- select * from stutable where username like "%" '三' "%";
​
-- 查询年龄在(22,24,26)范围的学生信息
-- select * from stutable where age in(22,24,26);
​
-- 查询年龄在(18,22)之间的所有的学生信息
-- select * from stutable where age between 18 and 22;
​
-- 查询学生名称带有三并且id为(6,10)之间的学生信息
-- select * from stutable where username like '%三%' and id between 6 and 10;
​
-- 查询id为5或者为6的学生信息
-- select * from stutable where id = 5 or id = 6;
​
-- 按照id进行降序排序展示
-- select * from stutable order by id desc;
​
-- 按照年龄进行降序排序展示 降序(DESC)
-- select * from stutable order by age desc;
​
-- 按照年龄进行升序排序展示 升序(ASC)
-- select * from stutable order by age asc;
​
-- 查询地址中带有河的并且按照年龄进行降序排序
-- select * from stutable where address like '%河%' order by age desc;

聚合函数查询

sql 复制代码
-- -------------聚合函数查询-----------------
-- count() 统计
-- max() 最大值
-- min() 最小值
-- sum() 求和
-- avg() 平均值
-- 查询学生表中年龄总和为多少?
-- select sum(age) as 年龄总和 from student;
​
-- 查询学生表中年龄的平均值为多少?
-- select avg(age) as 平均年龄 from student;
​
-- 查询学生表中学生的个数?
-- select count(id) as 总数量 from student;

分组操作

sql 复制代码
-- ---------------分组操作---------------
-- 分组操作  group by
​
-- 根据地址进行分组分别统计各个组人数有多少?
-- select address,count(id) as '总人数'from student GROUP BY address;
​
-- 根据地址字段分组,分组后统计学生的平均年龄,并且平均年龄大于20的信息
-- 分组操作不能和where连起来使用,如果分组后还需要过滤条件,需要使用having关键字添加过滤条件
-- select address,avg(age) as avgAge from student GROUP BY address having avgAge > 20

分页操作

sql 复制代码
-- ---------------分页操作limit---------------
-- select * from student limit a,b
-- 其中a代表的是从第几条记录开始查询,b代表的是查询多少条记录
-- 如果a是5,那么记录的条数就是从第6条开始
-- 当显示的内容小于b的时候,sql不会发生错误,会正常显示剩余所有的条数记录
-- 从第四条记录开始,查询15条记录
-- select * from student limit 3,15;

多表查询

表与表关系:一对一、一对多、多对多

一对多:部门表与员工表

多对多:

sql 复制代码
-- ---------------多表查询---------------
-- 多表联查操作
-- insert into department values (null,'开发部'); 
-- insert into department values (null,'教学部'); 
-- insert into department values (null,'网络部'); 
-- insert into department values (null,'运维部'); 
-- insert into department values (null,'市场部'); 
-- insert into staff values (null,'张三工程师',1); 
-- insert into staff values (null,'李四老师',2); 
-- insert into staff values (null,'王五装电脑',3); 
-- insert into staff values (null,'可老师',2); 
-- insert into staff values (null,'ss老师',2); 
-- insert into staff values (null,'li老师',2); 
-- insert into staff values (null,'lili网管',3); 
-- insert into staff values (null,'lucy工程师',1); 
-- insert into staff values (null,'pl',4); 
​
-- select * from department;
-- select * from staff;
​
-- 1.交叉连接(基本不用) 笛卡尔积 查询出来的记录数:n*m
-- 使用关键字 cross join 可以省略为","
-- select * from staff cross join department;
-- select * from staff,department;
​
-- 2.内连接查询
-- 使用关键字 inner join inner可以省略不写
​
-- 隐式内连接
-- SELECT * FROM department d,staff s where d.id = s.did;
-- SELECT s.name 员工姓名,d.name 部门名称 FROM department d,staff s WHERE d.id =s.did;
​
-- 显式内连接
-- 如果使用显式内连接 后面关联条件需要用on关键字不能使用where关键字
-- SELECT * FROM department as d INNER JOIN staff as s on d.id = s.did where s.id > 3;
​
-- 3.外连接查询
-- 关键字是outer join outer可以省略不写,外连接要用on不能用where
​
-- 左外连接 以左表为主表,右表为副表 查询的时候以左表的记录为查询记录(记录总数不确定),右表的数据满足条件为数据,不满足条件显示为null
-- SELECT * FROM staff s LEFT JOIN department d on d.id = s.did;
​
-- 右外连接 以右表为主表,左表为副表 查询的时候以右表的记录为查询记录(记录总数不确定),左表的数据满足条件显示为数据,不满足条件显示为null
-- SELECT * FROM staff s RIGHT JOIN department d on d.id = s.did;
​
-- 4. 子查询方式  父子查询
-- 嵌套结构 一个查询的结果可以作为另外一个查询的条件值
-- 查询教学部中有哪些员工信息
-- 第一步:先查询部门表中教学部的id是多少
-- select id from department where name='教学部'; d_id =1  d_id = 4
-- select * from staff as s where s.d_id in (select d.d_id from department as d where d.d_name = '教学部');

查询总结

● select 一般后面的内容都是要查询的字段 *----> 查询所有字段,如果查询指定字段,写上指定字段名,如果有多个字段中间用逗号隔开

● from 后面跟的是表名

● where 后面跟的是条件 id = 1 username like '% 小 %'

● group by 后面的是依据什么字段进行分组 分组统计总数

● having 分组后如果带有条件不能使用 where 只能用 having 带条件

● order by 后面跟的是依据什么字段排序 放的位置一般在 sql 语句中最后面

标量函数(单行函数)

MySQL 标量函数(Scalar Function)是对单个输入值进行操作,每行数据返回一个唯一输出值 的函数,与聚合函数(如 SUMCOUNT,多行返回一个值)完全不同。标量函数广泛用于数据转换、逻辑判断、字符串处理、日期计算等场景,是 SQL 查询中最常用的函数类型。

(一)字符串函数(最常用)

用于字符串的拼接、截取、替换、转换等操作,处理 CHARVARCHARTEXT 类型数据。

函数名 语法 功能描述 参数说明 示例 结果
CONCAT CONCAT(str1, str2, ..., strN) 拼接多个字符串,遇到 NULL 则返回 NULL str1~strN:要拼接的字符串(列名、字面量均可) CONCAT('Hello', ' ', 'MySQL') Hello MySQL
CONCAT_WS CONCAT_WS(separator, str1, ..., strN) 用分隔符拼接字符串,忽略 NULL 值 separator:分隔符;str1~strN:要拼接的字符串 CONCAT_WS('-', '2025', '12', '03') 2025-12-03
SUBSTRING(别名 SUBSTR SUBSTRING(str, pos[, len]) 截取字符串片段 str:原字符串;pos:起始位置(1 开始,负数表示从末尾倒数);len:截取长度(可选,默认到末尾) SUBSTRING('MySQL', 2, 3)``SUBSTRING('MySQL', -3) ySQ``SQL
TRIM TRIM([direction] remstr FROM str) 去除字符串首尾指定字符(默认去除空格) direction:可选(LEADING 前 /TRAILING 后 /BOTH 首尾,默认 BOTH);remstr:要去除的字符(默认空格);str:原字符串 TRIM(' MySQL ')``TRIM(LEADING 'x' FROM 'xxMySQLxx') MySQL``MySQLxx
LENGTH LENGTH(str) 返回字符串的字节数(UTF-8 下中文占 3 字节,英文占 1 字节) str:目标字符串 LENGTH('MySQL')``LENGTH('中文') 5``6
CHAR_LENGTH(别名 CHARLEN CHAR_LENGTH(str) 返回字符串的字符数(与编码无关,中文 / 英文均算 1 个字符) str:目标字符串 CHAR_LENGTH('中文')``CHAR_LENGTH('MySQL') 2``5
UPPER/LOWER UPPER(str) / LOWER(str) 字符串转大写 / 小写 str:目标字符串 UPPER('mysql')``LOWER('MySQL') MYSQL``mysql
REPLACE REPLACE(str, old, new) 将字符串中所有 old 子串替换为 new str:原字符串;old:要替换的子串;new:替换后的子串 REPLACE('MySQL', 'My', 'Your') YourSQL
INSTR INSTR(str, substr) 返回 substrstr 中首次出现的位置(1 开始,未找到返回 0) str:原字符串;substr:要查找的子串 INSTR('MySQL', 'SQL')``INSTR('MySQL', 'Oracle') 3``0
LEFT/RIGHT LEFT(str, len) / RIGHT(str, len) 从字符串左侧 / 右侧截取 len 个字符 str:原字符串;len:截取长度 LEFT('MySQL', 2)``RIGHT('MySQL', 3) My``SQL
(二)数值函数

用于数值计算(取整、绝对值、随机数等),处理 INTDECIMALFLOAT 等数值类型。

函数名 语法 功能描述 参数说明 示例 结果
ABS ABS(num) 返回数值的绝对值 num:数值(列值或字面量) ABS(-10.5)``ABS(20) 10.5``20
ROUND ROUND(num[, decimals]) 四舍五入到指定小数位(默认 0 位,即整数) num:数值;decimals:保留小数位数(可选,负数表示整数位四舍五入) ROUND(3.1415, 2)``ROUND(123.45, -1) 3.14``120
FLOOR FLOOR(num) 向下取整(返回小于等于数值的最大整数) num:数值 FLOOR(3.9)``FLOOR(-3.1) 3``-4
CEIL/CEILING CEIL(num) 向上取整(返回大于等于数值的最小整数) num:数值 CEIL(3.1)``CEIL(-3.9) 4``-3
MOD MOD(num1, num2) 返回 num1 除以 num2 的余数(同 num1 % num2 num1:被除数;num2:除数(不能为 0) MOD(10, 3)``MOD(7, 2) 1``1
POWER POWER(base, exp) 返回 baseexp 次方 base:底数;exp:指数(可为小数) POWER(2, 3)``POWER(4, 0.5) 8``2
SQRT SQRT(num) 返回数值的平方根(num 必须非负) num:非负数值 SQRT(16)``SQRT(2) 4``1.4142...
RAND RAND([seed]) 返回 0~1 之间的随机浮点数(带种子则生成固定序列) seed:随机数种子(可选,整数,相同种子返回相同序列) RAND()``RAND(10) 随机值固定值
TRUNCATE TRUNCATE(num, decimals) 截断数值到指定小数位(不四舍五入) num:数值;decimals:保留小数位数(负数表示截断整数位) TRUNCATE(3.1415, 2)``TRUNCATE(123.45, -1) 3.14``120
(三)日期时间函数(高频使用)

用于日期 / 时间的提取、计算、格式化,处理 DATETIMEDATETIMETIMESTAMP 类型。

函数名 语法 功能描述 参数说明 示例(当前时间:2025-12-03 10:30:00) 结果
NOW() NOW() 返回当前日期 + 时间(DATETIME 类型) 无参数 NOW() 2025-12-03 10:30:00
CURDATE()/CURRENT_DATE() CURDATE() 返回当前日期(DATE 类型) 无参数 CURDATE() 2025-12-03
CURTIME()/CURRENT_TIME() CURTIME() 返回当前时间(TIME 类型) 无参数 CURTIME() 10:30:00
YEAR/MONTH/DAY YEAR(date) 提取日期中的年 / 月 / 日(返回整数) date:日期类型或字符串(需符合日期格式) YEAR(NOW())``MONTH(CURDATE()) 2025``12
HOUR/MINUTE/SECOND HOUR(time) 提取时间中的时 / 分 / 秒(返回整数) time:时间类型或字符串(需符合时间格式) HOUR(CURTIME())``MINUTE(NOW()) 10``30
DATE_ADD DATE_ADD(date, INTERVAL expr unit) 给日期 / 时间添加指定时间间隔 date:基准日期 / 时间;expr:数值;unit:单位(DAY/HOUR/MINUTE等) DATE_ADD(NOW(), INTERVAL 7 DAY) 2025-12-10 10:30:00
DATE_SUB DATE_SUB(date, INTERVAL expr unit) 给日期 / 时间减去指定时间间隔 DATE_ADD DATE_SUB(NOW(), INTERVAL 1 HOUR) 2025-12-03 09:30:00
DATEDIFF DATEDIFF(date1, date2) 返回 date1 - date2 的天数差(仅计算日期,忽略时间) date1/date2:日期类型或字符串 DATEDIFF('2025-12-10', '2025-12-03') 7
TIMESTAMPDIFF TIMESTAMPDIFF(unit, start, end) 返回 end - start 的时间差(支持多单位,如年、月、小时) unit:单位(YEAR/MONTH/HOUR等);start/end:起始 / 结束时间 TIMESTAMPDIFF(MONTH, '2024-01-01', NOW()) 23
STR_TO_DATE STR_TO_DATE(str, format) 将字符串按指定格式转为日期 / 时间(格式不匹配返回 NULL) str:待转换字符串;format:格式符(如下表) STR_TO_DATE('2025-12-03', '%Y-%m-%d') 2025-12-03
DATE_FORMAT DATE_FORMAT(date, format) 将日期 / 时间按指定格式转为字符串 STR_TO_DATEformat DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分') 2025年12月03日 10时30分
日期格式符(常用)
格式符 含义 示例
%Y 4 位年份 2025
%y 2 位年份 25
%m 2 位月份(01-12) 12
%d 2 位日期(01-31) 03
%H 24 小时制(00-23) 10
%h 12 小时制(01-12) 10
%i 2 位分钟(00-59) 30
%s 2 位秒(00-59) 00
(四)转换函数

用于不同数据类型之间的转换,核心是 CASTCONVERT(功能基本一致,语法略有差异)。

函数名 语法 功能描述 支持的目标类型 示例 结果
CAST CAST(expr AS type) 将表达式转为指定类型 CHARDATEDATETIMEDECIMAL(n,m)INTFLOAT CAST(123 AS CHAR)``CAST('2025-12-03' AS DATE) '123'``2025-12-03
CONVERT CONVERT(expr, type)CONVERT(expr USING charset) 类型转换或字符集转换 CASTUSING charset 用于字符集转换(如 utf8mb4 CONVERT('123.45', DECIMAL(5,2))``CONVERT('中文' USING utf8mb4) 123.45``'中文'(utf8mb4 编码)
注意:
  • 转换失败返回 NULL(如 CAST('abc' AS INT)NULL);

  • DECIMAL(n,m)n 是总位数,m 是小数位数(如 DECIMAL(5,2) 支持 123.45)。

(五)条件函数(逻辑判断)

用于基于条件返回不同结果,核心是 IFIFNULLNULLIFCASE WHEN

函数名 语法 功能描述 示例(表 usersagestatus 列) 结果
IF IF(condition, true_val, false_val) 条件成立返回 true_val,否则返回 false_val(支持嵌套) IF(age > 18, '成年', '未成年')``IF(age > 60, '老年', IF(age > 18, '成年', '未成年')) 按年龄返回对应标签
IFNULL IFNULL(expr1, expr2) expr1 是 NULL,返回 expr2;否则返回 expr1(处理 NULL 缺省值) IFNULL(phone, '未填写')phone 为 NULL 时返回未填写) 非 NULL 则返回原值,否则返回缺省值
NULLIF NULLIF(expr1, expr2) expr1 = expr2,返回 NULL;否则返回 expr1(用于过滤特定值) NULLIF(username, 'admin')(用户名是 admin 时返回 NULL) 相等返回 NULL,否则返回 expr1
CASE WHEN 简单形式:CASE expr WHEN val1 THEN res1 [WHEN val2 THEN res2] ELSE resN END搜索形式:CASE WHEN cond1 THEN res1 [WHEN cond2 THEN res2] ELSE resN END 多条件判断(搜索形式更灵活,支持复杂条件) 简单形式:CASE status WHEN 1 THEN '正常' WHEN 0 THEN '禁用' ELSE '未知' END搜索形式:CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END 按条件返回对应结果
重点:
  • CASE WHEN 是标准 SQL 语法,兼容性更好,优先用于复杂条件;

  • 所有条件函数的返回值类型需一致(如避免同时返回字符串和数值)。

(六)系统函数(获取系统信息)

用于获取 MySQL 系统信息或会话状态。

函数名 语法 功能描述 示例 结果
USER() USER() 返回当前登录用户(格式 用户@主机 USER() root@localhost
DATABASE() DATABASE() 返回当前使用的数据库 DATABASE() test(当前库名)
VERSION() VERSION() 返回 MySQL 版本号 VERSION() 8.0.36(版本示例)
LAST_INSERT_ID() LAST_INSERT_ID() 返回当前会话最后插入的自增 ID(仅对 AUTO_INCREMENT 列有效) INSERT INTO users(username) VALUES('test'); SELECT LAST_INSERT_ID(); 插入记录的自增 ID
(七)其他常用标量函数
函数名 语法 功能描述 示例 结果
MD5 MD5(str) 对字符串进行 MD5 加密(32 位小写) MD5('123456') e10adc3949ba59abbe56e057f20f883e
SHA1 SHA1(str) 对字符串进行 SHA1 加密(40 位) SHA1('123456') 7c4a8d09ca3762af61e59520943dc26494f8941b
UUID() UUID() 生成全球唯一标识符(36 位字符串) UUID() 550e8400-e29b-41d4-a716-446655440000
ISNULL ISNULL(expr) 判断表达式是否为 NULL(返回 1/0) ISNULL(NULL)``ISNULL('test') 1``0

标量函数使用注意事项

  1. 区分标量函数与聚合函数 :标量函数每行返回一个值(如 UPPER(username)),聚合函数多行返回一个值(如 COUNT(*)),不可混用(如 SUM(UPPER(username)) 报错)。

  2. NULL 值处理:

    • CONCAT+ 等遇到 NULL 返回 NULL;

    • CONCAT_WSIFNULL 可忽略或替换 NULL,需根据需求选择。

  3. 字符串长度函数选择:

    • 统计字符个数用 CHAR_LENGTH(如中文计数);

    • 统计存储字节数用 LENGTH(如判断字段存储是否超限)。

  4. 日期函数格式符%Y(4 位年)和 %y(2 位年)、%H(24 小时制)和 %h(12 小时制)不可混用,否则导致转换失败。

  5. 性能优化:

    • 避免在 WHERE 子句中对索引列使用标量函数(如 WHERE UPPER(username) = 'TEST' 会导致索引失效);

    • 复杂嵌套函数(如多层 DATE_FORMAT+DATE_ADD)在大数据量下会影响性能,尽量简化或在应用层处理。

  6. 函数嵌套 :支持多层嵌套,如 DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 DAY), '%Y-%m-%d')(获取明天日期并格式化)。

希望本文章对大家有所帮助, 感谢大家的关注和点赞。

相关推荐
GeekyGuru1 小时前
C#:游戏开发的高效利器
开发语言·c#
小陈phd1 小时前
langgraph从入门到精通(一)——langgraph概念解析
linux·运维·数据库
涔溪1 小时前
深入了解 Node.js 性能诊断工具 Clinic.js 的底层工作原理
开发语言·javascript·node.js
JienDa1 小时前
JienDa聊PHP:PHP 8革命性特性深度实战报告:枚举、联合类型与Attributes的工程化实践
android·开发语言·php
一起养小猫1 小时前
MySQL数据库操作全攻略:从创建表到增删改查
数据库·mysql
尋有緣1 小时前
力扣1083-销售分析II
leetcode·oracle·数据库开发
.小小陈.1 小时前
C++初阶5:string类使用攻略
开发语言·c++·学习·算法
瀚高PG实验室1 小时前
search_path 的使用说明
数据库·瀚高数据库
JSON_L1 小时前
PHP安装GMP扩展
开发语言·php