MySQL 进阶语法:函数、约束、多表查询、事务

目录

一、MySQL 常用函数

1. 字符串函数

1.1 基本字符串操作

1.2 字符串截取与处理

1.3 字符串搜索与替换

2. 数值函数

2.1 基本数学运算

2.2 数学计算

2.3 随机数与符号

3. 日期时间函数

3.1 获取当前时间

3.2 日期时间计算

3.3 日期时间提取

3.4 日期时间格式化

4. 条件函数

4.1 流程控制函数

4.2 聚合函数

5. 窗口函数 (MySQL 8.0+)

6. JSON 函数 (MySQL 5.7+)

7. 系统信息函数

8. 加密函数

二、MySQL 约束

1. 主键约束 (PRIMARY KEY)

1.1 基本用法

1.2 修改表添加主键

1.3 自增主键

2. 外键约束 (FOREIGN KEY)

2.1 基本用法

2.2 级联操作

2.3 修改表添加外键

3. 唯一约束 (UNIQUE)

3.1 基本用法

3.2 多列组合唯一

3.3 修改表添加唯一约束

4. 非空约束 (NOT NULL)

4.1 基本用法

4.2 修改表添加非空约束

5. 默认值约束 (DEFAULT)

5.1 基本用法

5.2 修改表添加默认值

6. 检查约束 (CHECK)

6.1 基本用法

6.2 命名检查约束

6.3 修改表添加检查约束

7. 约束管理

7.1 查看约束

7.2 删除约束

三、多表查询

1. 内连接 (INNER JOIN)

2. 左外连接 (LEFT JOIN)

3. 右外连接 (RIGHT JOIN)

4. 全外连接 (FULL OUTER JOIN) - MySQL不支持,可用UNION模拟

5. 交叉连接 (CROSS JOIN)

6. 自连接 (SELF JOIN)

7. 自然连接 (NATURAL JOIN)

8. USING 子句

9. 子查询

9.1 WHERE子句中的子查询

(1)标量子查询(返回单个值)

(2)列子查询(返回单列多行)

(3)行子查询(返回单行多列)

9.2 FROM子句中的子查询(派生表)

9.3 SELECT子句中的子查询(标量子查询)

9.4 HAVING子句中的子查询

9.5 EXISTS和NOT EXISTS子查询

10. 集合操作

10.1 UNION 和 UNION ALL

10.2 INTERSECT (MySQL 8.0.31+)

10.3 EXCEPT/MINUS (MySQL 8.0.31+)

四、事务 (Transaction)

1. 事务的基本特性 (ACID)

2. 事务控制语句

3. 事务隔离级别

4. 事务并发问题

(1)脏读 (Dirty Read)

(2)不可重复读 (Non-repeatable Read)

(3)幻读 (Phantom Read)

5. 保存点 (SAVEPOINT)


一、MySQL 常用函数

MySQL 提供了丰富的内置函数,可以用于数据处理、计算和转换。这些函数主要分为以下几类:

1. 字符串函数

1.1 基本字符串操作
 -- 连接字符串
 SELECT CONCAT('Hello', ' ', 'World'); -- 输出: Hello World
 SELECT CONCAT_WS('-', '2023', '01', '01'); -- 用分隔符连接: 2023-01-01
 ​
 -- 字符串长度
 SELECT LENGTH('MySQL'); -- 字节数: 5
 SELECT CHAR_LENGTH('MySQL'); -- 字符数: 5
 ​
 -- 大小写转换
 SELECT UPPER('mysql'); -- MYSQL
 SELECT LOWER('MySQL'); -- mysql
1.2 字符串截取与处理
 -- 截取字符串
 SELECT SUBSTRING('MySQL', 2, 3); -- ySQ (从第2个字符开始,取3个)
 SELECT LEFT('MySQL', 2); -- My
 SELECT RIGHT('MySQL', 3); -- SQL
 ​
 -- 去除空格
 SELECT TRIM('  MySQL  '); -- 'MySQL'
 SELECT LTRIM('  MySQL'); -- 'MySQL'
 SELECT RTRIM('MySQL  '); -- 'MySQL'
 ​
 -- 填充字符串
 SELECT LPAD('5', 3, '0'); -- 005
 SELECT RPAD('Hi', 5, '!'); -- Hi!!!
1.3 字符串搜索与替换
 -- 查找位置
 SELECT INSTR('MySQL', 'SQL'); -- 3 (SQL在MySQL中的位置)
 SELECT LOCATE('SQL', 'MySQL'); -- 3
 ​
 -- 替换字符串
 SELECT REPLACE('MySQL', 'SQL', 'Database'); -- MyDatabase
 ​
 -- 正则表达式
 SELECT 'MySQL' REGEXP '^My'; -- 1 (匹配成功)
 SELECT REGEXP_REPLACE('abc123', '[0-9]', 'X'); -- abcXXX

2. 数值函数

2.1 基本数学运算
 -- 四舍五入
 SELECT ROUND(3.14159, 2); -- 3.14
 SELECT ROUND(123.456, -1); -- 120 (小数点左侧舍入)
 ​
 -- 取整
 SELECT CEIL(3.14); -- 4 (向上取整)
 SELECT FLOOR(3.14); -- 3 (向下取整)
 SELECT TRUNCATE(3.14159, 2); -- 3.14 (截断)
 ​
 -- 绝对值
 SELECT ABS(-10); -- 10
2.2 数学计算
 -- 幂运算
 SELECT POWER(2, 3); -- 8 (2的3次方)
 SELECT SQRT(16); -- 4 (平方根)
 ​
 -- 对数
 SELECT LOG(2, 8); -- 3 (以2为底8的对数)
 SELECT LN(10); -- 自然对数
 SELECT LOG10(100); -- 2
 ​
 -- 三角函数
 SELECT SIN(PI()/2); -- 1
 SELECT COS(0); -- 1
 SELECT TAN(PI()/4); -- 约等于1
2.3 随机数与符号
 -- 随机数
 SELECT RAND(); -- 0到1之间的随机数
 SELECT FLOOR(1 + RAND() * 10); -- 1-10的随机整数
 ​
 -- 符号判断
 SELECT SIGN(-10); -- -1
 SELECT SIGN(0); -- 0
 SELECT SIGN(10); -- 1

3. 日期时间函数

3.1 获取当前时间
 SELECT NOW(); -- 当前日期和时间 (2023-01-01 12:34:56)
 SELECT CURDATE(); -- 当前日期 (2023-01-01)
 SELECT CURTIME(); -- 当前时间 (12:34:56)
 SELECT UNIX_TIMESTAMP(); -- 当前UNIX时间戳
3.2 日期时间计算
 -- 日期加减
 SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); -- 加1天
 SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH); -- 减1个月
 SELECT NOW() + INTERVAL 1 HOUR; -- 加1小时
 ​
 -- 日期差
 SELECT DATEDIFF('2023-12-31', '2023-01-01'); -- 364 (天数差)
 SELECT TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-12-31'); -- 11 (月数差)
3.3 日期时间提取
 -- 提取日期部分
 SELECT YEAR(NOW()); -- 2023
 SELECT MONTH(NOW()); -- 1-12
 SELECT DAY(NOW()); -- 1-31
 SELECT HOUR(NOW()); -- 0-23
 SELECT MINUTE(NOW()); -- 0-59
 SELECT SECOND(NOW()); -- 0-59
 ​
 -- 星期和季度
 SELECT DAYNAME(NOW()); -- Monday
 SELECT DAYOFWEEK(NOW()); -- 1=周日, 2=周一,...,7=周六
 SELECT QUARTER(NOW()); -- 1-4
3.4 日期时间格式化
 -- 格式化日期
 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2023-01-01
 SELECT DATE_FORMAT(NOW(), '%H:%i:%s'); -- 12:34:56
 SELECT DATE_FORMAT(NOW(), '%W, %M %e, %Y'); -- Sunday, January 1, 2023
 ​
 -- 解析日期字符串
 SELECT STR_TO_DATE('01-01-2023', '%d-%m-%Y'); -- 2023-01-01

4. 条件函数

4.1 流程控制函数
 -- IF函数
 SELECT IF(1 > 0, 'True', 'False'); -- True
 SELECT IFNULL(NULL, 'Default'); -- Default
 SELECT NULLIF(10, 10); -- NULL (两值相等返回NULL)
 ​
 -- CASE WHEN
 SELECT 
     score,
     CASE 
         WHEN score >= 90 THEN 'A'
         WHEN score >= 80 THEN 'B'
         WHEN score >= 70 THEN 'C'
         ELSE 'D'
     END AS grade
 FROM students;
4.2 聚合函数
 -- 基本聚合
 SELECT COUNT(*) FROM users; -- 记录数
 SELECT AVG(price) FROM products; -- 平均值
 SELECT SUM(quantity) FROM order_items; -- 总和
 SELECT MAX(salary) FROM employees; -- 最大值
 SELECT MIN(age) FROM customers; -- 最小值
 ​
 -- 分组聚合
 SELECT department_id, AVG(salary)
 FROM employees
 GROUP BY department_id
 HAVING AVG(salary) > 5000;

5. 窗口函数 (MySQL 8.0+)

 -- 排名函数
 SELECT 
     name, salary,
     RANK() OVER (ORDER BY salary DESC) AS rank,
     DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank,
     ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
 FROM employees;
 ​
 -- 分区计算
 SELECT 
     department_id, name, salary,
     AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary
 FROM employees;
 ​
 -- 累计计算
 SELECT 
     order_date, amount,
     SUM(amount) OVER (ORDER BY order_date) AS running_total
 FROM orders;

6. JSON 函数 (MySQL 5.7+)

 -- 创建JSON
 SELECT JSON_OBJECT('name', 'John', 'age', 30);
 SELECT JSON_ARRAY(1, 'a', TRUE, NULL);
 ​
 -- 提取JSON值
 SELECT JSON_EXTRACT('{"name": "John", "age": 30}', '$.name'); -- "John"
 SELECT JSON_UNQUOTE(JSON_EXTRACT('{"name": "John"}', '$.name')); -- John
 ​
 -- 修改JSON
 SELECT JSON_SET('{"name": "John"}', '$.age', 30); -- {"name": "John", "age": 30}
 SELECT JSON_REMOVE('{"name": "John", "age": 30}', '$.age'); -- {"name": "John"}

7. 系统信息函数

 -- 数据库信息
 SELECT DATABASE(); -- 当前数据库名
 SELECT USER(); -- 当前用户
 SELECT VERSION(); -- MySQL版本
 ​
 -- 连接信息
 SELECT CONNECTION_ID(); -- 连接ID
 SELECT LAST_INSERT_ID(); -- 最后插入的ID
 ​
 -- 性能分析
 SELECT BENCHMARK(1000000, MD5('test')); -- 执行MD5 100万次

8. 加密函数

 -- 哈希函数
 SELECT MD5('password'); -- 32字符MD5哈希
 SELECT SHA1('password'); -- 40字符SHA1哈希
 SELECT SHA2('password', 256); -- 64字符SHA256哈希
 ​
 -- 加密解密
 SELECT AES_ENCRYPT('secret', 'key');
 SELECT AES_DECRYPT(encrypted_data, 'key');
 ​
 -- 密码函数
 SELECT PASSWORD('mypass'); -- 已废弃,不推荐使用

二、MySQL 约束

约束是用于限制表中数据类型的规则,确保数据的准确性和可靠性。MySQL 支持多种约束类型,以下是简要介绍:

1. 主键约束 (PRIMARY KEY)

1.1 基本用法
 -- 创建表时定义单列主键
 CREATE TABLE users (
     user_id INT PRIMARY KEY,
     username VARCHAR(50) NO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值