推荐链接
链接目录
查看数据库版本
SELECT VERSION ( ) ;
函数
CONCAT(字符串连接)
SELECT CONCAT ( 'Hello' , ' ' , 'World' ) AS result;
输出:Hello World
连接多个字符串:
SELECT CONCAT ( 'I' , ' ' , 'like' , ' ' , 'MySQL' ) AS result;
输出:I like MySQL
连接字段和字符串:
SELECT CONCAT ( first_name, ' ' , last_name) AS full_name FROM users;
上述示例中,first_name和last_name是表users中的两个列,CONCAT 函数将这两个列的值连接成一个完整的姓名。
CONCAT 函数还可以处理NULL 值。如果任意一个参数为NULL ,则返回的结果也为NULL 。
SELECT CONCAT ( 'Hello' , NULL , 'World' ) AS result;
输出:NULL
DATE_FORMAT (日期时间值按指定的格式进行格式化)
DATE_FORMAT ( date, format) ;
SELECT DATE_FORMAT ( order_date, '%Y-%m-%d' ) AS formatted_date
FROM orders;
获得具体的时间(当前日期的年月)
-- 获得当前时间的年月 2024 - 05
SET @month = CONCAT ( YEAR ( CURRENT_DATE ( ) ) , '-' , LPAD ( MONTH ( CURRENT_DATE ( ) ) , 2 , '0' ) ) ;
-- 方案二(性能更加优秀)
SET @month = DATE_FORMAT ( CURRENT_DATE ( ) , '%Y-%m' )
select @month
计算当前日期与日期列之间的天数差异
-- CURDATE ( ) 返回当前日期。
-- 如果 日期列中存储的日期是 2022 - 01 - 01 ,而当前日期是 2024 - 05 - 09 ,那么 DATEDIFF ( CURDATE ( ) , 日期列) 将返回 859 ,表示当前日期与 日期列之间相差 859 天。
DATEDIFF ( CURDATE ( ) , 日期列)
截至截止昨天近12个月的日期条件
'change_date' 是类似 20250908 这样的数据
WHERE
STR_TO_DATE ( CAST ( change_date AS CHAR ) , '%Y%m%d' ) BETWEEN
DATE_SUB ( CURDATE ( ) - INTERVAL 1 DAY , INTERVAL 12 MONTH ) AND
CURDATE ( ) - INTERVAL 1 DAY ;
保留小数点后 N 位,不进行四舍五入
SELECT id, TRUNCATE ( value, 3 ) AS value FROM ` table `
创建表
CREATE TABLE table_name (
id INT PRIMARY KEY AUTO_INCREMENT ,
f1 INT ,
f2 VARCHAR ( 50 ) NOT NULL ,
f3 VARCHAR ( 100 ) DEFAULT '默认值' COMMENT '备注' ,
f4 DECIMAL ( 10 , 2 ) ,
f5 DATE ,
f16 TEXT ,
INDEX idx_f1 ( f1) , -- 设置普通索引,索引名称idx_f2
CONSTRAINT idx_f2 UNIQUE ( f2) , -- 自主对索引的名称命名成为idx_f2
UNIQUE ( f3) -- 让系统自动为唯一索引命名
) AUTO_INCREMENT = 1 ; -- 自增的起始值为1
ALTER TABLE table_name AUTO_INCREMENT = 1 ; -- 设置了 AUTO_INCREMENT 的起始值为 1
SET @@auto_increment_increment= 2 ; -- 设置步长为2
查看查看数据表的字段类型和其他属性
DESCRIBE table_name;
或者
SHOW COLUMNS FROM table_name;
Field: 字段名,表示数据表中的列名。
Type: 字段的数据类型,指定了该列可以存储的数据类型,例如整数、字符串等。
Null: 指示该字段是否允许为空值(NULL )。如果允许为空,则显示 "YES" ;如果不允许为空,则显示 "NO" 。
Key: 指示该字段是否是键,即是否属于索引的一部分。如果该字段是主键或具有索引,则显示 "PRI" ;如果该字段具有唯一索引,则显示 "UNI" ;如果该字段没有索引,则显示空白。
Default: 指示该字段的默认值,即在插入新记录时,如果没有提供该字段的值,将使用的默认值。
Extra: 显示额外的信息或标志,用于描述该字段的其他特性。例如,如果该字段是自增字段(auto- increment),则显示 "auto_increment" 。
查看数据表中所有字段的备注
SELECT COLUMN_NAME , COLUMN_COMMENT
FROM information_schema. COLUMNS
WHERE TABLE_SCHEMA = '数据库名称'
AND TABLE_NAME = '表名' ;
字段操作
'新增字段'
ALTER TABLE table_name
ADD column_name data_type [ column_attributes] [ FIRST | AFTER existing_column] ;
将 table_name 替换为要添加字段的数据表名称。
将 column_name 替换为要添加的字段名。
将 data_type 替换为字段的数据类型,如 VARCHAR 、INT 、DATE 等。
可选项:column_attributes 是字段的其他属性,如 NOT NULL (非空约束)、DEFAULT (默认值)等。
可选项:使用 FIRST 关键字将新字段添加为第一个字段,或使用 AFTER existing_column 将新字段添加在已存在的某个字段之后。
关键字:COMMENT '备注' ;
示例:添加一个字段设置为非空,默认值为0 ,并且在表中的一个字段后面
ALTER TABLE 表名
ADD 字段名 TINYINT ( 1 ) NOT NULL DEFAULT 0 AFTER 旧字段;
创建时间字段添加默认值
CREATE TABLE your_table_name (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
other_column VARCHAR ( 50 ) NOT NULL ,
createTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
updateTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ;
索引操作
查看表中所有索引
SHOW INDEX FROM table;
-- 执行上面sql出来列的输出结果说明
Table: 表名
Non_unique: 是否唯一索引 ( 0 = 唯一, 1 = 非唯一)
Key_name: 索引名称
Seq_in_index: 索引中的列顺序
Column_name: 列名
Collation: 排序方式 ( A = 升序, NULL = 未排序)
Cardinality: 基数(估算的唯一值数量)
Sub_part: 索引前缀长度
Packed: 键的打包方式
Null: 列是否包含NULL 值
Index_type: 索引类型 ( BTREE , FULLTEXT 等)
Comment: 注释
创建索引
CREATE INDEX 索引名称 ON 表名 ( 表中字段名称) ;
ALTER TABLE 表名 ADD UNIQUE INDEX 索引名 ( 字段名) ;
定时任务
-- 每天凌晨1 点执行
-- DO 后是需要执行的sql
DELIMITER $$
CREATE EVENT IF NOT EXISTS ` 定时任务时间名称 `
ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD ( DATE_ADD ( CURDATE ( ) , INTERVAL 1 DAY ) , INTERVAL 1 HOUR )
ON COMPLETION PRESERVE ENABLE
DO
insert into tb_user_days
(
SELECT * FROM tb_user WHERE ` month ` = DATE_FORMAT ( NOW ( ) , '%Y-%m' )
) ;
END $$
DELIMITER ;
-- 查询定时任务相关时间
SELECT
EVENT_NAME ,
STARTS ,
ENDS ,
LAST_EXECUTED ,
INTERVAL_VALUE ,
INTERVAL_FIELD ,
CASE
WHEN INTERVAL_FIELD = 'SECOND' THEN DATE_ADD ( LAST_EXECUTED , INTERVAL INTERVAL_VALUE SECOND )
WHEN INTERVAL_FIELD = 'MINUTE' THEN DATE_ADD ( LAST_EXECUTED , INTERVAL INTERVAL_VALUE MINUTE )
WHEN INTERVAL_FIELD = 'HOUR' THEN DATE_ADD ( LAST_EXECUTED , INTERVAL INTERVAL_VALUE HOUR )
END AS NEXT_EXECUTION
FROM
information_schema. EVENTS
WHERE
EVENT_NAME = '定时任务名称' ;
存储过程
DELIMITER
CREATE PROCEDURE count_rows_in_table ( IN table_name VARCHAR ( 255 ) , OUT row_count INT )
BEGIN
SET @sql_query = CONCAT ( 'SELECT COUNT(*) FROM ' , table_name) ;
PREPARE stmt FROM @sql_query;
EXECUTE stmt INTO row_count;
DEALLOCATE PREPARE stmt;
END
DELIMITER ;
CALL count_rows_in_table ( 'tb_user' , @row_count) ;
SELECT @row_count;
计算列
SHOW COLUMNS FROM tb_finance_report;
DESCRIBE tb_finance_report;
触发器
删除触发器
DROP TRIGGER IF EXISTS 触发器名称;
新增触发器
DELIMITER
CREATE TRIGGER 触发器名称
BEFORE INSERT ON 表名
FOR EACH ROW
BEGIN
DECLARE max_id INT ;
SELECT MAX ( id) INTO max_id FROM 表名;
SET NEW . SystemContractID = IFNULL ( max_id, 0 ) + 100000001 ;
END
DELIMITER ;
创建新增 100 万条数据的函数(navicat里面图形化生成数据更好用)
SET GLOBAL log_bin_trust_function_creators= TRUE ; -- 创建函数一定要写这个
DELIMITER $$ -- 写函数之前必须要写,该标志
CREATE FUNCTION mock_data ( ) -- 创建函数(方法)
RETURNS INT -- 返回类型
BEGIN -- 函数方法体开始
DECLARE num INT DEFAULT 1000000 ; -- 定义一个变量num为int类型。默认值为100 0000
DECLARE i INT DEFAULT 0 ;
WHILE i < num DO -- 循环条件
-- 注意表名和对应的字段名称还有生成条件
INSERT INTO user ( ` name ` , ` email ` , ` phone ` , ` gender ` , ` password ` , ` age ` )
VALUES ( CONCAT ( '用户' , i) , 'xxxxxxqq.com' , CONCAT ( '18' , FLOOR ( RAND ( ) * ( ( 999999999 - 100000000 ) + 1000000000 ) ) ) , FLOOR ( RAND ( ) * 2 ) , UUID ( ) , FLOOR ( RAND ( ) * 100 ) ) ;
SET i = i + 1 ; -- i自增
END WHILE ; -- 循环结束
RETURN i;
END ; -- 函数方法体结束
SELECT mock_data ( ) ; -- 调用函数
选取在特定时间区间内的记录
DATE_SUB ( NOW ( ) , INTERVAL 7 DAY ) :
NOW ( ) 返回当前日期和时间(例如:2024 - 01 - 15 14 : 30 : 25 )
减去7 天,返回的结果是7 天前的同一时刻(包括时间部分),例如:2024 - 01 - 08 14 : 30 : 25
DATE_ADD ( CURDATE ( ) , INTERVAL - 7 DAY ) :
CURDATE ( ) 返回当前日期,时间部分为00 : 00 : 00 (例如:2024 - 01 - 15 00 : 00 : 00 )
减去7 天,返回的结果是7 天前的日期,时间部分也是00 : 00 : 00 ,例如:2024 - 01 - 08 00 : 00 : 00
-- 查询当天创建xxx
SELECT * FROM table WHERE time BETWEEN CURDATE ( ) AND DATE_ADD ( CURDATE ( ) , INTERVAL 1 DAY ) ;
-- 查询最近一周创建的xxx:
SELECT * FROM table WHERE time >= DATE_SUB ( NOW ( ) , INTERVAL 7 DAY ) ;
SELECT PASSWORDTIME
FROM TB_User
WHERE PASSWORDTIME > DATE_SUB ( CURDATE ( ) , INTERVAL 90 DAY )
AND PASSWORDTIME < DATE_SUB ( CURDATE ( ) , INTERVAL 80 DAY ) ;
使用Navicat 同步 测试数据库 与 正式数据库 数据
MySQL 单次插入数据量限制
max_allowed_packet 理论最大条数 4MB (4194304) 1200条 16MB (16777216) 4800条 64MB (67108864) 19200条
-- 单个SQL 语句的最大大小
SHOW VARIABLES LIKE 'max_allowed_packet' ;
-- 最大连接包大小
SHOW VARIABLES LIKE 'max_allowed_packet' ;
-- 查询缓存限制(如果启用)
SHOW VARIABLES LIKE 'query_cache_size' ;
$singleRecordSize = 10 ( 字段) * 100 (字符) * 3 ;
$totalSingleSize = 3500 ;