news 2026/4/16 14:46:55

Java技术八股学习Day31

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java技术八股学习Day31

SQL语法基础总结

数据定义语言(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 '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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→LIMIT)

SELECT [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(*)包含NULL,COUNT(列)排除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)返回两表所有行,无匹配则为 NULL(MySQL 不支持,需用 UNION 拼接)-
-- 示例:用户表(user)与订单表(order),按user.id=order.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 'Test@123456'; -- 修改用户密码 ALTER USER 'test_user'@'%' IDENTIFIED BY 'NewTest@123456'; -- 删除用户 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-InnoDB,MyISAM 不支持)。

核心命令及示例

-- 开启事务(关闭自动提交,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('张三') → 6(utf8mb4中汉字3字节) TRIM(s) -- 去除字符串首尾空格:TRIM(' 张三 ') → 张三 REPLACE(s, old, new) -- 替换字符串:REPLACE('13800138000', '00', '99') → 13899138999

(2)数值函数

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) → 3

(3)日期时间函数

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()) → 1

SQL 核心使用注意事项(避坑指南)

  1. DML 操作必加 WHEREUPDATE/DELETE无 WHERE 会修改 / 删除全表数据,不可逆!
  2. 慎用 SELECT *:仅查询需要的列,减少数据传输和内存占用,避免索引失效。
  3. GROUP BY 遵循规范:SELECT 后非聚合函数的列,必须出现在 GROUP BY 中(MySQL5.7 + 默认开启严格模式)。
  4. WHERE 与 HAVING 区分:WHERE 过滤,不可用聚合函数;HAVING 过滤分组,可用聚合函数。
  5. 模糊查询优化:尽量使用左模糊张%),可走索引;全模糊(%张%)会导致索引失效。
  6. 分页大偏移量优化:大偏移量(如LIMIT 10000, 10)效率低,建议通过主键过滤(WHERE id > 10000 LIMIT 10)。
  7. 多表连接加索引:关联字段(如主键、外键)必须创建索引,否则全表扫描,效率极低。
  8. 事务尽量短:长事务会占用锁资源,导致并发阻塞,建议将无关操作移出事务。
  9. 避免字段名与关键字冲突:若使用关键字(如 order、user),需用反引号`包裹。
  10. 插入 / 更新指定列:不要省略列名直接插入,避免表结构变更导致 SQL 报错。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:57:19

学霸同款AI论文工具TOP10:本科生毕业论文必备测评

学霸同款AI论文工具TOP10&#xff1a;本科生毕业论文必备测评 学术写作工具测评&#xff1a;为何需要一份2026年榜单&#xff1f; 随着AI技术在学术领域的深入应用&#xff0c;越来越多的本科生开始依赖智能写作工具来提升论文效率。然而&#xff0c;面对市场上琳琅满目的选择&…

作者头像 李华
网站建设 2026/4/16 13:08:29

互联网大厂Java面试实录:核心技术栈与智慧城市场景深度解析

文章内容&#xff1a; 在互联网大厂Java求职面试中&#xff0c;技术考察紧密结合业务场景。本文通过严肃的面试官与搞笑的水货程序员谢飞机的三轮问答&#xff0c;围绕Java核心、微服务、数据库、安全、AI等技术栈&#xff0c;结合智慧城市场景&#xff0c;深入解析面试问答过程…

作者头像 李华
网站建设 2026/4/13 20:12:36

Comsol助力采空区裂隙带与垮落带抽采对比研究

comsol&#xff0c;采空区裂隙带&#xff0c;跨落带抽采与不抽采对比。 在煤矿开采领域&#xff0c;采空区的治理以及瓦斯抽采是保障安全生产和提高资源利用率的关键环节。其中&#xff0c;采空区裂隙带与垮落带的瓦斯抽采策略备受关注&#xff0c;今天咱们就借助Comsol来对比分…

作者头像 李华
网站建设 2026/4/16 14:27:57

牛批了,抢票神器,值得推荐

马上又到了一年一度的春运&#xff0c;大家在春节期间要出行的&#xff0c;一定要提前抢票。 除了使用12306官方抢票外&#xff0c;还可以使用软件来实现抢票&#xff0c;例如&#xff0c;今天这款免费抢票软件——Bypass 软件介绍 Bypass这款软件从2013年上线以来&#xff…

作者头像 李华
网站建设 2026/4/15 19:00:34

农业AI测试:开发者掘金的新蓝海

农业AI的爆发与测试的黄金机遇 近年来&#xff0c;农业AI技术飞速发展&#xff0c;从田间传感器到全流程智能管理&#xff0c;正重塑传统农业模式。 作为软件测试从业者&#xff0c;您可能好奇&#xff1a;为什么这个领域成了我们的“新金矿”&#xff1f;答案在于农业AI系统的…

作者头像 李华
网站建设 2026/4/15 4:33:37

导师推荐!8款AI论文平台测评:本科生写论文怎么选?

导师推荐&#xff01;8款AI论文平台测评&#xff1a;本科生写论文怎么选&#xff1f; 2026年AI论文平台测评&#xff1a;为何要关注这些工具&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI论文平台提升写作效率与学术质量。然而&#xff0c;面…

作者头像 李华