Java 多线程编程
在这里插## 标题入图片描述

> 						大家好,我是程序员小羊!

✨博客主页: https://blog.csdn.net/m0_63815035?type=blog

💗《博客内容》:大数据、AI开发、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识
📢博客专栏: https://blog.csdn.net/m0_63815035/category_11954877.html
📢欢迎点赞 👍 收藏 ⭐留言 📝
📢本文为学习笔记资料,如有侵权,请联系我删除,疏漏之处还请指正🙉
📢大厦之成,非一木之材也;大海之阔,非一流之归也✨

在这里插入图片描述

本文基于 MySQL 8.0 整理,涵盖数据库安装、SQL 基础、DQL 查询、函数、多表查询、事务、DDL 数据类型与约束、索引、视图等内容。适合零基础入门和日常参考。


在这里插入图片描述

一、MySQL 概述与安装

1.1 数据库基本概念

  • 数据库:按照数据结构来组织、存储和管理数据的仓库。
  • 分类
    • 非结构化数据:没有固定结构,不便检索(如文本文件)。
    • 半结构化数据:有相同存储结构属性,但每条数据的属性可不同(如 XML、JSON)。
    • 结构化数据:建立在关系模型基础上,使用二维表存储,便于管理。关系数据库是目前主流。
  • 常见关系数据库产品
    • MySQL → Java 开发常用,Oracle 公司旗下,社区版免费。
    • SQL Server → 微软。
    • Oracle → 收费。
    • DB2 → IBM。
  • SQL:结构化查询语言,操作关系数据库的标准语言,分为:
    • DDL:数据定义语言(创建表、索引、视图等)
    • DML:数据操作语言(增、删、改)
    • DQL:数据查询语言(查询)
    • DCL:数据控制语言(权限、用户管理)

1.2 MySQL 安装(8.0)

  • 官网下载 MySQL Community Server 8.0。
  • 安装路径默认 C:\Program Files\MySQL\MySQL Server 8.0
  • 设置 root 密码,例如 123456
  • 端口默认 3306
  • 安装后通过命令行连接:
    cd C:\Program Files\MySQL\MySQL Server 8.0\bin
    mysql -u root -p
    输入密码
    
  • 常用命令:
    SHOW DATABASES;          -- 显示所有数据库
    USE mysql;               -- 选择数据库
    SELECT host, user FROM user;  -- 查询用户
    
  • 可视化工具:Navicat(需破解),或使用免费的 DBeaver、MySQL Workbench。

常见连接错误:

  • 1045:用户名或密码错误。
  • 2003:无法连接服务器,检查 MySQL 服务是否启动。

二、SQL-DQL(数据查询语言)

2.1 基础查询

-- 查询所有列
SELECT * FROM emp;

-- 查询指定列
SELECT ename, sal FROM emp;

-- 使用别名(推荐单引号)
SELECT ename AS '员工姓名', sal AS '薪资' FROM emp;

-- 查询结果进行计算
SELECT ename, sal, sal * 12 AS '年薪' FROM emp;

2.2 条件查询 WHERE

-- 普通比较符 =, >, <, >=, <=, !=, <>
SELECT * FROM emp WHERE sal > 2000;
SELECT * FROM emp WHERE deptno = 20;

-- IN 和 NOT IN
SELECT * FROM emp WHERE empno IN (7369, 7788, 7881);
SELECT * FROM emp WHERE deptno NOT IN (10, 20);

-- NULL 值查询(不能用 = null,必须用 IS NULL 或 IS NOT NULL)
SELECT * FROM emp WHERE comm IS NULL;
SELECT * FROM emp WHERE comm IS NOT NULL;

-- BETWEEN...AND(包含边界)
SELECT * FROM emp WHERE sal BETWEEN 1000 AND 4000;

-- 模糊查询 LIKE
-- % 代表任意多个字符,_ 代表单个字符
SELECT * FROM emp WHERE ename LIKE '%S%';   -- 包含S
SELECT * FROM emp WHERE ename LIKE 'S%';    -- 以S开头
SELECT * FROM emp WHERE ename LIKE '_A%';   -- 第二个字符是A

-- 多条件 AND / OR
SELECT * FROM emp WHERE deptno = 20 AND sal > 2000;
SELECT * FROM emp WHERE deptno = 20 OR sal > 2000;

2.3 排序 ORDER BY

  • ASC 升序(默认),DESC 降序。
  • 多列排序:先按第一列,再按第二列。
-- 单列排序
SELECT * FROM emp ORDER BY sal DESC;

-- 多列排序:部门升序,薪资降序
SELECT * FROM emp ORDER BY deptno ASC, sal DESC;

2.4 分页 LIMIT

MySQL 使用 LIMIT 实现分页:

-- 查询前 N 行
SELECT * FROM emp LIMIT 4;

-- 跳过前 M 行,取 N 行(M 是偏移量)
SELECT * FROM emp LIMIT 3, 3;   -- 第4~6行

-- 分页公式:每页 size 条,第 page 页的数据:LIMIT (page-1)*size, size

三、单行函数

单行函数对每一行输入返回一行输出。

3.1 字符串函数

函数说明
LENGTH(str)字节长度
CONCAT(str1, str2)拼接
SUBSTR(str, pos, len)截取(位置从1开始)
UPPER(str), LOWER(str)大小写转换
REPLACE(str, from, to)替换
TRIM(str)去除两侧空格
LEFT(str, n), RIGHT(str, n)左侧/右侧截取
SELECT ename, LENGTH(ename), SUBSTR(ename,1,3) FROM emp;
SELECT CONCAT(empno, '=', ename) FROM emp;

3.2 日期函数

函数说明
NOW(), SYSDATE()当前日期时间
CURDATE()当前日期
CURTIME()当前时间
YEAR(date), MONTH(date), DAY(date)提取年月日
DATE_ADD(date, INTERVAL expr unit)日期加法
DATEDIFF(date1, date2)相差天数
DATE_FORMAT(date, format)格式化
SELECT NOW();
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
SELECT DATEDIFF('2025-06-11', '2025-01-01');

3.3 数值函数

函数说明
ABS(x)绝对值
CEIL(x)向上取整
FLOOR(x)向下取整
ROUND(x, d)四舍五入,d为小数位数
TRUNCATE(x, d)直接截断
RAND()0~1随机数
MOD(x, y)取余
SELECT CEIL(12.1), FLOOR(12.9);   -- 13, 12
SELECT ROUND(1.4999999, 2);       -- 1.50

3.4 转换函数

  • 日期 → 字符串:DATE_FORMAT(date, format)
  • 字符串 → 日期:STR_TO_DATE(str, format)
  • 数字 → 字符串:直接拼接 '' 或使用 CONCAT
  • 空值处理:IFNULL(expr1, expr2) 如果 expr1 为 NULL,返回 expr2。
SELECT IFNULL(comm, 0) FROM emp;

3.5 加密函数(了解)

SELECT MD5('123456');
SELECT AES_ENCRYPT('123456', 'key'), AES_DECRYPT(AES_ENCRYPT('123456', 'key'), 'key');

四、多行函数(聚合函数)

聚合函数对多行输入返回一行结果。

函数说明
COUNT(expr)计数(不统计 NULL)
SUM(expr)求和(忽略 NULL)
AVG(expr)平均值
MAX(expr)最大值
MIN(expr)最小值
SELECT COUNT(*) FROM emp;           -- 总行数
SELECT AVG(sal) FROM emp;           -- 平均薪资
SELECT MAX(sal), MIN(sal) FROM emp;

注意:不能将普通列和聚合函数直接混用(除非该列在 GROUP BY 中)。MySQL 允许但不建议,结果可能不正确。


五、分组查询 GROUP BY

5.1 基础分组

-- 查询每个部门的平均薪资
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;

-- 多列分组:每个部门、每种工作的平均薪资
SELECT deptno, job, AVG(sal) FROM emp GROUP BY deptno, job;

5.2 HAVING 过滤分组

HAVING 用于分组后的条件过滤,可以使用聚合函数。WHERE 用于分组前过滤行。

-- 查询平均薪资高于 2500 的部门
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) >= 2500;

-- 错误用法:HAVING 中使用了非分组列(除非在 SELECT 中也出现)
-- SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING ename LIKE '%A%';  -- 错误

5.3 DQL 语句执行顺序

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

六、多表查询

6.1 笛卡尔积与等值连接

多表查询不加连接条件会得到两表记录的乘积,即笛卡尔积。

-- 隐式内连接(等值)
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;

-- 显式内连接(推荐)
SELECT e.ename, d.dname
FROM emp e JOIN dept d ON e.deptno = d.deptno;

6.2 连接方式(Natural Join, USING, ON)

  • NATURAL JOIN:自动匹配同名列作为连接条件。
    SELECT e.ename, d.dname FROM emp e NATURAL JOIN dept d;
    
  • USING:手动指定同名列。
    SELECT e.ename, d.dname FROM emp e JOIN dept d USING(deptno);
    
  • ON:最灵活,可指定任意连接条件(等值、不等值)。
    SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno;
    -- 非等值:薪资等级
    SELECT e.ename, s.grade FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;
    

6.3 外连接

  • 左外连接:保留左表所有记录,右表无匹配则为 NULL。
  • 右外连接:保留右表所有记录。
  • MySQL 不直接支持全外连接,可用 UNION 模拟。
-- 左外连接
SELECT e.ename, d.dname FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno;

-- 右外连接
SELECT e.ename, d.dname FROM emp e RIGHT JOIN dept d ON e.deptno = d.deptno;

-- 模拟全外连接(UNION 去重)
SELECT e.ename, d.dname FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno
UNION
SELECT e.ename, d.dname FROM emp e RIGHT JOIN dept d ON e.deptno = d.deptno;

6.4 自连接

一张表当作两张不同的表使用。

-- 查询每个员工及其上级领导的名字
SELECT e.ename, m.ename
FROM emp e LEFT JOIN emp m ON e.mgr = m.empno;

6.5 子查询

  • 标量子查询:返回单个值,用于 WHERE 条件。
  • 列子查询:返回一列,配合 IN, ANY, ALL
  • 表子查询:返回多行多列,放在 FROM 子句中作为临时表。
-- 标量子查询:薪资最低的员工
SELECT ename, sal FROM emp WHERE sal = (SELECT MIN(sal) FROM emp);

-- 列子查询:薪资高于任意一个 20 部门员工的员工
SELECT ename, sal FROM emp WHERE sal > ANY(SELECT sal FROM emp WHERE deptno = 20);

-- 表子查询(伪表):查询高于自己部门平均薪资的员工
SELECT e.ename, e.sal, e.deptno
FROM emp e
JOIN (SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno) d
ON e.deptno = d.deptno AND e.sal > d.avg_sal;

七、DML(数据操作语言)

7.1 INSERT

-- 插入完整行(值的顺序、类型与表定义一致)
INSERT INTO dept VALUES (50, 'SALES', 'SHANGHAI');

-- 指定列插入
INSERT INTO emp (empno, ename, deptno) VALUES (6666, 'LIYI', 50);

-- 从查询结果插入(复制数据)
INSERT INTO dept (deptno, dname) SELECT empno, ename FROM emp;

7.2 UPDATE

-- 全表更新(危险)
UPDATE salgrade SET losal = 888, hisal = 999;

-- 带条件更新
UPDATE salgrade SET losal = 666, hisal = 888 WHERE grade = 3;

7.3 DELETE

-- 删除全表(可恢复,速度慢)
DELETE FROM dept;

-- 带条件删除
DELETE FROM emp WHERE comm IS NULL;

-- 清空表(不可回滚,速度快,重置自增)
TRUNCATE TABLE emp;

八、事务(Transaction)

8.1 事务特性(ACID)

  • 原子性:事务中的操作要么全部成功,要么全部失败。
  • 一致性:事务前后数据完整性保持一致。
  • 隔离性:多个事务并发时互不干扰。
  • 持久性:事务提交后数据永久保存。

8.2 事务操作

MySQL 默认自动提交(每条 DML 执行后自动提交)。手动控制事务:

START TRANSACTION;   -- 或 BEGIN
-- 执行 DML 语句
COMMIT;   -- 提交
ROLLBACK; -- 回滚
  • 隐式提交:执行 DDL(如 CREATE、DROP)会自动提交当前事务。
  • 退出客户端:在 MySQL 中,退出时会回滚未提交的事务(某些客户端行为可能不同)。

8.3 事务隔离级别

级别名称脏读不可重复读幻读
READ UNCOMMITTED读未提交可能可能可能
READ COMMITTED读已提交避免可能可能
REPEATABLE READ可重复读(MySQL 默认)避免避免可能(但 InnoDB 通过间隙锁避免)
SERIALIZABLE串行化避免避免避免
-- 查看隔离级别
SELECT @@transaction_isolation;

-- 设置隔离级别(会话级别)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

九、DDL(数据定义语言)

9.1 数据库操作

CREATE DATABASE db_name CHARSET utf8mb4;
SHOW DATABASES;
USE db_name;
DROP DATABASE db_name;

9.2 数据类型

数值类型
类型有符号范围无符号范围字节
TINYINT-128~1270~2551
SMALLINT-32768~327670~655352
INT-231~231-10~2^32-14
BIGINT-263~263-10~2^64-18
FLOAT4
DOUBLE8
DECIMAL(M,D)精确小数M+2

推荐使用 DECIMAL 或整数存储金额,避免浮点精度问题。

字符串类型
类型说明
CHAR(n)定长,最大 255 字符,不足补空格(不推荐)
VARCHAR(n)变长,最大 65535 字节(实际受行大小限制),推荐
TEXT大文本,最长 65535 字节
LONGTEXT超大文本,最长 4GB
日期时间类型
类型范围字节说明
DATE‘1000-01-01’ ~ ‘9999-12-31’3推荐存日期
TIME‘-838:59:59’ ~ ‘838:59:59’3
DATETIME‘1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’8推荐
TIMESTAMP1970 ~ 20384带时区,范围小
YEAR1901~21551

9.3 表操作

-- 创建表
CREATE TABLE t_student (
    sid INT PRIMARY KEY,
    sname VARCHAR(40) NOT NULL,
    gender CHAR(1),
    birthday DATE,
    createtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 根据查询结果创建表
CREATE TABLE stu_copy AS SELECT * FROM t_student;

-- 修改表(添加列)
ALTER TABLE t_student ADD COLUMN email VARCHAR(50);

-- 修改列定义
ALTER TABLE t_student MODIFY sname VARCHAR(100);

-- 修改列名
ALTER TABLE t_student CHANGE COLUMN birthday birth DATE;

-- 删除列
ALTER TABLE t_student DROP COLUMN email;

-- 重命名表
RENAME TABLE t_student TO t_stu;

-- 删除表
DROP TABLE t_stu;

9.4 约束

主键约束 PRIMARY KEY
  • 唯一且非空,一张表只能有一个主键。
  • 可单列主键或多列联合主键(复合主键)。
-- 创建表时指定
CREATE TABLE t_pk1 (id INT PRIMARY KEY, name VARCHAR(20));

-- 联合主键
CREATE TABLE t_pk2 (tid INT, cid INT, PRIMARY KEY(tid, cid));

-- 添加主键(已有表)
ALTER TABLE t_pk3 ADD PRIMARY KEY(id);

-- 删除主键
ALTER TABLE t_pk3 DROP PRIMARY KEY;
唯一约束 UNIQUE
  • 列值不能重复,但允许 NULL(可多个 NULL)。
CREATE TABLE t_uniq (id INT, phone VARCHAR(11) UNIQUE);
ALTER TABLE t_uniq ADD CONSTRAINT uni_phone UNIQUE(phone);
DROP INDEX uni_phone ON t_uniq;
非空约束 NOT NULL
CREATE TABLE t_null (name VARCHAR(20) NOT NULL);
ALTER TABLE t_null MODIFY name VARCHAR(20) NOT NULL;
ALTER TABLE t_null MODIFY name VARCHAR(20) NULL;
外键约束 FOREIGN KEY
  • 保证数据参照完整性,外键引用另一表的主键或唯一键。
-- 主表 teacher
CREATE TABLE teacher (tid VARCHAR(40) PRIMARY KEY, name VARCHAR(40));
-- 从表 student,tid 为外键
CREATE TABLE student (
    sid VARCHAR(40) PRIMARY KEY,
    name VARCHAR(40),
    tid VARCHAR(40),
    CONSTRAINT fk_tid FOREIGN KEY (tid) REFERENCES teacher(tid)
        ON DELETE CASCADE   -- 级联删除
        ON UPDATE CASCADE   -- 级联更新
);

-- 添加外键(已有表)
ALTER TABLE student ADD CONSTRAINT fk_tid FOREIGN KEY (tid) REFERENCES teacher(tid);
-- 删除外键
ALTER TABLE student DROP FOREIGN KEY fk_tid;

外键约束影响性能,大型项目中有时仅在逻辑上维护,不实际建立外键。

默认值 DEFAULT
CREATE TABLE t_default (status INT DEFAULT 1);
ALTER TABLE t_default ALTER status SET DEFAULT 0;
ALTER TABLE t_default ALTER status DROP DEFAULT;
自动增长 AUTO_INCREMENT
  • 通常用于主键,自动生成唯一数字。
CREATE TABLE t_auto (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20));
ALTER TABLE t_auto MODIFY id INT AUTO_INCREMENT;

十、索引

10.1 索引概述

索引是用于快速查找记录的数据结构(通常为 B+ 树)。索引能极大提升查询速度,但会降低 DML 操作性能(因为需要维护索引),并占用额外存储空间。

10.2 索引分类

类型说明
普通索引(INDEX / KEY)基本索引,无唯一性要求
唯一索引(UNIQUE INDEX)列值不能重复,可加速查询
主键索引(PRIMARY KEY)唯一且非空,一种特殊的唯一索引
外键索引(FOREIGN KEY)用于外键约束,自动创建
全文索引(FULLTEXT)用于全文搜索(MyISAM / InnoDB 5.6+)

10.3 创建和删除索引

-- 创建普通索引
CREATE INDEX idx_dname ON dept(dname);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_ename ON emp(ename);

-- 删除索引
DROP INDEX idx_dname ON dept;

-- 查看表的索引
SHOW INDEX FROM emp;

最佳实践:对 WHERE、ORDER BY、JOIN 中使用的列创建索引;避免在重复值高的列(如性别)上建索引。


十一、视图

11.1 视图概念

视图是虚拟表,内容由查询定义,不存储实际数据。视图可以简化复杂查询,提供安全的数据访问。

11.2 创建和使用视图

-- 创建视图(将多个表的数据整合)
CREATE VIEW v_emp_dept AS
SELECT e.empno, e.ename, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno;

-- 查询视图
SELECT * FROM v_emp_dept WHERE dname = 'SALES';

-- 查看视图定义
SHOW CREATE VIEW v_emp_dept;

-- 删除视图
DROP VIEW v_emp_dept;

视图可以用于 INSERTUPDATEDELETE,但必须满足可更新视图的条件(如不包含 DISTINCT、GROUP BY、聚合函数等)。


十二、结尾

分类核心内容
DQLSELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT
函数单行函数(字符串、日期、数值)、聚合函数(COUNT, SUM, AVG, MAX, MIN)
多表查询内连接、外连接(LEFT/RIGHT)、自连接、子查询、联合查询 UNION
DMLINSERT, UPDATE, DELETE, TRUNCATE
事务START TRANSACTION, COMMIT, ROLLBACK,ACID,隔离级别
DDLCREATE/DROP/ALTER DATABASE/TABLE,数据类型,约束(PRIMARY KEY, UNIQUE, NOT NULL, FOREIGN KEY, DEFAULT)
索引普通索引、唯一索引,CREATE INDEX,DROP INDEX
视图CREATE VIEW,视图本质是存储的 SELECT

本文章适合配合实际操作练习,多看多写,逐步掌握 MySQL 数据库的基本使用。

今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文

在这里插入图片描述

更多推荐