2026/2/14 7:48:57
网站建设
项目流程
苏州高端网站设计建设,浙江建设干部学校网站,网站开发工作室策划案,外包加工网收费SQL语法基础总结数据定义语言#xff08;DDL#xff09;核心作用定义 / 修改 / 删除数据库、表、索引、视图等数据库对象的结构#xff0c;操作立即生效且自动提交事务#xff0c;不可通过ROLLBACK回滚。核心命令及示例#xff08;1#xff09;数据库操作-- 创建数据库DDL核心作用定义 / 修改 / 删除数据库、表、索引、视图等数据库对象的结构操作立即生效且自动提交事务不可通过ROLLBACK回滚。核心命令及示例1数据库操作-- 创建数据库指定字符集推荐utf8mb4 CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 删除数据库谨慎使用不可逆 DROP DATABASE IF EXISTS test_db; -- 使用/切换数据库 USE test_db; -- 查看数据库创建语句 SHOW CREATE DATABASE test_db;2数据表操作-- 创建表指定主键、自增、非空、默认值MySQL专属AUTO_INCREMENT CREATE TABLE IF NOT EXISTS user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 用户ID主键自增, name VARCHAR(50) NOT NULL COMMENT 用户名, age TINYINT DEFAULT 0 COMMENT 年龄, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT 用户表; -- 修改表结构增列、改列类型、改列名、删列 ALTER TABLE user ADD COLUMN phone VARCHAR(20) COMMENT 手机号; -- 增列 ALTER TABLE user MODIFY COLUMN age INT DEFAULT 0; -- 改列类型 ALTER TABLE user RENAME COLUMN phone TO tel; -- 改列名MySQL8.0支持 ALTER TABLE user DROP COLUMN tel; -- 删列 -- 重命名表 RENAME TABLE user TO t_user; -- 删除表谨慎使用数据和结构全删除 DROP TABLE IF EXISTS t_user; -- 清空表数据保留表结构重置自增比DELETE高效不可逆 TRUNCATE TABLE user; -- 查看表结构 DESC user; -- 查看表创建语句 SHOW CREATE TABLE user;3索引操作-- 创建普通索引 CREATE INDEX idx_name ON user(name); -- 创建唯一索引列值唯一允许空 CREATE UNIQUE INDEX idx_phone ON user(phone); -- 创建复合索引遵循最左匹配原则 CREATE INDEX idx_name_age ON user(name, age); -- 删除索引 DROP INDEX idx_name ON user;数据操作语言DML核心作用对表中实际数据进行增、删、改操作属于可回滚操作需执行COMMIT才永久生效ROLLBACK可撤销未提交操作。核心命令及示例操作前需先执行USE 数据库名1插入数据INSERT-- 单行插入 INSERT INTO user (name, age, phone) VALUES (张三, 20, 13800138000); -- 多行插入推荐减少数据库连接开销 INSERT INTO user (name, age, phone) VALUES (李四, 25, 13900139000), (王五, 30, 13700137000); -- 插入默认值省略列则使用创建表时的DEFAULT值 INSERT INTO user (name) VALUES (赵六);2修改数据UPDATE-- 条件修改必加WHERE否则修改全表数据 UPDATE user SET age 21, phone 13800138001 WHERE id 1; -- 批量修改按条件筛选 UPDATE user SET age age 1 WHERE age 25;3删除数据DELETE-- 条件删除必加WHERE否则删除全表数据 DELETE FROM user WHERE id 3; -- 删除全表数据可回滚比TRUNCATE慢不重置自增 DELETE FROM user;数据查询语言DQL核心作用对表中数据进行检索查询是最常用、最复杂的 SQL 类型不修改任何数据仅做数据读取核心命令为SELECT搭配多子句实现复杂查询。基础语法结构子句执行顺序FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMITSELECT [DISTINCT] 列1, 列2, 聚合函数() -- 要查询的列DISTINCT去重 FROM 表1 [JOIN 表2 ON 关联条件] -- 数据源多表连接 WHERE 行过滤条件 -- 过滤单条数据不可用聚合函数 GROUP BY 分组列 -- 按列分组用于聚合统计 HAVING 分组过滤条件 -- 过滤分组结果可用聚合函数 ORDER BY 排序列 [ASC/DESC] -- 排序ASC升序默认DESC降序 LIMIT 偏移量, 条数; -- MySQL专属分页偏移量从0开始核心用法及示例1基础查询-- 查询指定列 SELECT name, age, phone FROM user; -- 查询所有列慎用增加数据传输开销 SELECT * FROM user; -- 去重查询去除重复行 SELECT DISTINCT age FROM user; -- 列别名AS可省略 SELECT name AS 用户名, age 年龄 FROM user; -- 算术运算查询 SELECT name, age, age 1 AS 明年年龄 FROM user;2条件查询WHERE支持比较运算符/////!/、逻辑运算符AND/OR/NOT、范围IN/BETWEEN...AND...、空值判断IS NULL/IS NOT NULL-- 基础条件 SELECT * FROM user WHERE age 20; -- 多条件逻辑 SELECT * FROM user WHERE age BETWEEN 20 AND 30 AND phone IS NOT NULL; -- 范围匹配 SELECT * FROM user WHERE name IN (张三, 李四); -- 空值判断 SELECT * FROM user WHERE phone IS NULL;3模糊查询LIKE%匹配任意长度的任意字符包括 0 个_匹配单个任意字符-- 查询姓张的用户左匹配可走索引 SELECT * FROM user WHERE name LIKE 张%; -- 查询名字第二个字是“三”的用户 SELECT * FROM user WHERE name LIKE _三; -- 查询名字包含“五”的用户全模糊索引失效 SELECT * FROM user WHERE name LIKE %五%;4聚合查询聚合函数常用聚合函数COUNT()计数、SUM()求和、AVG()平均值、MAX()最大值、MIN()最小值-- 统计总用户数COUNT(*)包含NULLCOUNT(列)排除NULL SELECT COUNT(*) AS total FROM user; -- 统计年龄总和、平均值、最大值 SELECT SUM(age) AS age_sum, AVG(age) AS age_avg, MAX(age) AS age_max FROM user;5分组查询GROUP BY HAVING-- 按年龄分组统计每个年龄的用户数 SELECT age, COUNT(*) AS num FROM user GROUP BY age; -- 按年龄分组筛选出用户数2的年龄HAVING过滤分组结果 SELECT age, COUNT(*) AS num FROM user GROUP BY age HAVING num 2;6排序查询ORDER BY-- 按年龄升序排序默认ASC SELECT * FROM user ORDER BY age; -- 按年龄降序年龄相同则按创建时间升序 SELECT * FROM user ORDER BY age DESC, create_time ASC;7分页查询MySQL 专属 LIMIT-- 查询前10条数据 SELECT * FROM user LIMIT 10; -- 分页查询第2页每页10条偏移量页码-1*每页条数 SELECT * FROM user ORDER BY id LIMIT 10, 10; -- 等价写法更直观 SELECT * FROM user ORDER BY id LIMIT 10 OFFSET 10;8多表连接查询核心基于关联字段如主键 - 外键关联多表主流使用JOIN替代老式逗号分隔写法分为 4 种核心连接连接类型核心特点示例内连接INNER JOIN仅返回两表匹配的行a INNER JOIN b ON a.id b.aid左连接LEFT JOIN返回左表所有行右表匹配则显示否则为 NULLa LEFT JOIN b ON a.id b.aid右连接RIGHT JOIN返回右表所有行左表匹配则显示否则为 NULLa RIGHT JOIN b ON a.id b.aid全连接FULL JOIN返回两表所有行无匹配则为 NULLMySQL 不支持需用 UNION 拼接--- 示例用户表user与订单表order按user.idorder.user_id关联 -- 内连接查询有订单的用户及对应订单 SELECT u.name, o.order_no FROM user u INNER JOIN order o ON u.id o.user_id; -- 左连接查询所有用户及对应的订单无订单则order_no为NULL SELECT u.name, o.order_no FROM user u LEFT JOIN order o ON u.id o.user_id;9子查询将一个查询结果作为另一个查询的条件、数据源或列分为标量子查询返回单个值、列子查询返回一列、行子查询返回一行、表子查询返回多行多列-- 标量子查询查询年龄大于平均年龄的用户 SELECT * FROM user WHERE age (SELECT AVG(age) FROM user); -- 列子查询查询有订单的用户IN匹配列结果 SELECT * FROM user WHERE id IN (SELECT DISTINCT user_id FROM order); -- 表子查询将子查询结果作为临时表需加别名 SELECT t.age, t.num FROM (SELECT age, COUNT(*) AS num FROM user GROUP BY age) t WHERE t.num 1;数据控制语言DCL核心作用管理数据库用户账号和操作权限控制谁能访问数据库 / 表以及能执行何种操作仅管理员如 root可执行。核心命令及示例1用户管理-- 创建用户MySQL8.0指定密码规则允许任意主机访问用%指定主机用IP/域名 CREATE USER test_user% IDENTIFIED BY Test123456; -- 修改用户密码 ALTER USER test_user% IDENTIFIED BY NewTest123456; -- 删除用户 DROP USER IF EXISTS test_user%;2权限管理常用权限SELECT查询、INSERT插入、UPDATE修改、DELETE删除、ALL PRIVILEGES所有权限、CREATE创建、DROP删除-- 授予权限给test_user授予test_db下所有表的查询、插入、修改权限 GRANT SELECT, INSERT, UPDATE ON test_db.* TO test_user%; -- 授予所有权限给test_user授予所有数据库所有表的所有权限谨慎使用 GRANT ALL PRIVILEGES ON *.* TO test_user%; -- 撤销权限撤销test_user的test_db下所有表的删除权限 REVOKE DELETE ON test_db.* FROM test_user%; -- 刷新权限修改权限后必须执行使其生效 FLUSH PRIVILEGES; -- 查看用户权限 SHOW GRANTS FOR test_user%;事务控制语言TCL核心作用管理数据库事务保证多步 DML 操作的原子性要么全成要么全败仅适用于支持事务的存储引擎如 MySQL-InnoDBMyISAM 不支持。核心命令及示例-- 开启事务关闭自动提交MySQL默认自动提交 START TRANSACTION; -- 或 BEGIN; -- 执行多步DML操作 UPDATE user SET age 22 WHERE id 1; INSERT INTO order (user_id, order_no) VALUES (1, ORD20260131001); -- 提交事务操作永久生效不可回滚 COMMIT; -- 回滚事务撤销所有未提交的DML操作回到事务开始前状态 -- ROLLBACK; -- 设置保存点支持部分回滚 SAVEPOINT sp1; -- 回滚到保存点撤销保存点后的操作保存点前的操作保留 -- ROLLBACK TO sp1;MySQL 常用内置函数1字符串函数CONCAT(s1, s2) -- 拼接字符串CONCAT(张, 三) → 张三 SUBSTR(s, start, len) -- 截取字符串SUBSTR(13800138000, 1, 3) → 138 LENGTH(s) -- 获取字符串长度LENGTH(张三) → 6utf8mb4中汉字3字节 TRIM(s) -- 去除字符串首尾空格TRIM( 张三 ) → 张三 REPLACE(s, old, new) -- 替换字符串REPLACE(13800138000, 00, 99) → 138991389992数值函数ROUND(n, d) -- 四舍五入ROUND(3.1415, 2) → 3.14 CEIL(n) -- 向上取整CEIL(3.1) → 4 FLOOR(n) -- 向下取整FLOOR(3.9) → 3 MOD(n1, n2) -- 取余MOD(5, 2) → 1 ABS(n) -- 绝对值ABS(-3) → 33日期时间函数NOW() -- 获取当前日期时间2026-01-31 15:30:00 CURDATE() -- 获取当前日期2026-01-31 CURTIME() -- 获取当前时间15:30:00 DATE_FORMAT(d, fmt) -- 日期格式化DATE_FORMAT(NOW(), %Y-%m-%d) → 2026-01-31 DATEDIFF(d1, d2) -- 计算日期差d1-d2单位天DATEDIFF(2026-02-01, NOW()) → 1SQL 核心使用注意事项避坑指南DML 操作必加 WHEREUPDATE/DELETE无 WHERE 会修改 / 删除全表数据不可逆慎用 SELECT *仅查询需要的列减少数据传输和内存占用避免索引失效。GROUP BY 遵循规范SELECT 后非聚合函数的列必须出现在 GROUP BY 中MySQL5.7 默认开启严格模式。WHERE 与 HAVING 区分WHERE 过滤行不可用聚合函数HAVING 过滤分组可用聚合函数。模糊查询优化尽量使用左模糊张%可走索引全模糊%张%会导致索引失效。分页大偏移量优化大偏移量如LIMIT 10000, 10效率低建议通过主键过滤WHERE id 10000 LIMIT 10。多表连接加索引关联字段如主键、外键必须创建索引否则全表扫描效率极低。事务尽量短长事务会占用锁资源导致并发阻塞建议将无关操作移出事务。避免字段名与关键字冲突若使用关键字如 order、user需用反引号包裹。插入 / 更新指定列不要省略列名直接插入避免表结构变更导致 SQL 报错。