臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速7.Google 搜索收录排查:为什么关键词搜得到别人,却搜不到我的网站?Obsidian、双向链接与知识图谱
架构设计
分布式分布式事务RPC原理
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
数据库
mysql01.MySQL基础语法与约束02.MySQL数据库类型03.MySQL多表查询04.MySQL 索引05.MySQL 事务06.MySQL 隔离级别07.MySQL MVCC08.MySQL 锁09.EXPLAIN10.慢查询与 SQL 优化
mysql面试题01.索引问题02.事务与隔离级别03.锁机制04.存储引擎与性能优化05.用户权限、字符集与备份恢复
mysql实战01.EXPLAIN实战02.测试环境菜单误删排查与恢复03.MySQL IN 详解
网络
网络安全1.无线监听网卡苹果M系列虚拟机安装Kali Linux教程3.kali怎么使用RTL8812AU4.kali基础命令
网络基础进程之间怎样通过网络传递数据
网址常用网址
中间键
esElasticsearch 入门
mq
RabbitMQRabbitMQ高级RabbitMQ基础
1. MQ 基础2. MQ 核心角色与代码对应3. MQ Consumer Group 与消费模式4. SOFAMQ 账户变更代码实践5. MQ 可靠性问题6. 消息幂等
redis缓存击穿、穿透与雪崩Redis 分布式锁Redis 缓存问题Redis 数据结构
AI
使用说明
第三方插件&技能简介Archify使用与安装指南geekgeekRun使用OfferFlow使用指南Ponytail使用指南Skills Manager使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发0-学习路线1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.*完成可运行聊天接口11.Function Calling、Tool Calling 原理12.用 Java 方法定义 Tool13.工具参数设计和校验14.实现订单查询工具15.实现物流查询工具16.实现库存查询工具17.多个工具自动选择18.工具异常、超时、重试
diy主机
主机零件学习1.CPU2.主板3.内存4.显卡5.硬盘6.散热7.风扇8.机箱热门型号价格表
捡垃圾diy-13600kf+5060diy-14600kf+5070
English高频词汇英文基础语法简单句子音标
GitGit常用命令Sublime Merge 使用指南
Java
工具库Caffeine本地缓存Reactor教程
工作实践如何使用@Async线程池使用与排查线上服务 CPU 使用率过高排查压测下RPC接口大量失败排查记录
基础1.HashMap2.ConcurrentHashMap3.HashSet4.final5.static6.volatile7.AtomicInteger8.String动态代理反射锁与线程同步线程注解
面试题1.HashMap 存储在方法内是线程安全的吗2.ArrayList参数传递与引用重新赋值3.== 和 equals 的区别、hashcode4.重载和重写的区别5.String、StringBuffer、StringBuilder区别及使用场景6.接口和抽象类7.ArrayList 与 LinkedList 的区别和扩容机制8.HashMap 和 Hashtable 的区别及底层实现9.Object 和 Objects 的区别10.ThreadLocal的原理和使用场景11.字节码是什么及作用12.Java类加载器有哪些13.双亲委派模型14.Java异常体系15.GC是什么16.GC如何判断对象可以被回收
面试总结0.HR面试模板1.面试一2.面试二3.面试三笔试
网络与 IO(黑马程序员-纯理论)01-网络编程基础02-IO模型与零拷贝03-BIO04-NIO基础与缓冲区05-NIO通道与选择器06-AIO
juc00-目录01-进程与线程02-线程同步与通信03-并发设计模式04-Java内存模型05-CAS与原子类06-ThreadLocal07-阻塞队列08-线程池使用与原理09-任务调度10-ForkJoin与享元模式11-AQS12-ReentrantLock13-读写锁14-并发协作工具15-ConcurrentHashMap16-CopyOnWrite与同步容器17-SkipListMap18-非阻塞队列
juc(工作常见)Java并发编程三个重点拆解
jvm1. JVM运行时数据区
Spring1.Spring IoC、DI与构造方法注入CGLIB、Byte Buddy 与 Spring AOPSpring 常用注解详解Spring Bean 生命周期
Spring MVC异常处理机制
linux常用命令
mac快捷键终端常用操作
python
基础01.Python是什么,为什么要安装Python02.Python项目中.venv是什么03.Python基础语法
基础实战sql替换
HTTPXHRMS员工详情接口调用(Python HTTPX)
windowswindows激活

SQL语法

  • SQL语句可以在单行或多行书写,以分号结尾(在命令行里)
  • 可使用空格和缩进来增强语句的可读性
  • MySQL不区别大小写,建议使用大写

SQL语句分类

  • DDL (Data Definition Language):数据库或表的结构操作
  • DML (Data Manipulation Language):对表的记录进行更新(增、删、改)
  • DQL (Data Query Language):对表的记录的查询
  • DCL (Data Control Language):对用户的创建,及授权

DDL (Data Definition Language)

数据库操作:

  • 查看所有数据库:SHOW DATABASES
  • 选择要操作的数据库:USE 数据库名
  • 创建数据库(方括号中是可选操作):CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=utf8]
  • 删除数据库:DROP DATABASE [IF EXISTS] mydb1
  • 修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8

表操作:

  • 创建表

    CREATE TABLE [IF NOT EXISTS] 表名(
        列名 列类型,
        列名 列类型,
        ...
        列名 列类型
    );
  • 查看当前数据库中所有的表名称:SHOW TABLES

  • 查看表结构:DESC 表名

  • 查看建表语句:SHOW CREATE TABLE 表名

  • 删除表:DROP TABLE 表名

  • 修改表:ALTER TABLE 表名

    • 添加列:

      ALTER TABLE 表名
      ADD (
          列名 列类型,
          列名 列类型,
          ...
          列名 列类型
      );
    • 修改列类型:ALTER TABLE 表名 MODITY 列名 列类型;

    • 修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;

    • 删除列:ALTER TABLE 表名 DROP 列名;

    • 修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;

DML (Data Manipulation Language)

插入数据:

  • INTERT INTO 表名(列名1,列名2, ...) VALUES(列值1, 列值2, ...);
  • INTERT INTO 表名 VALUES(列值1, 列值2)

示例:

// 插入所有列
INSERT INTO stu(
  number, name, age, gender
)
VALUES(
  'ITCAST_0001', 'zhangSan', 28, 'male'
);
 
// 插入部分列,没有指定的列默认为NULL值
INSERT INTO stu(
  number, name
) VALUES(
  'ITCAST_0002', 'liSi'
)
 
// 不给出插入列,那么默认为插入所有列!值的顺序要与创建表时列的顺序相同
INSERT INTO stu VALUES(
  'ITCAST_0003', 'wangWu', 82, 'female'
);

修改数据:

  • UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ... [WHERE 条件]
    • 条件必须是一个 boolean 类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
    • 运算符:=, !=, <>, >, <, >=, <=, BETWEEN...AND, IN(...), IS NULL, NOT, OR, AND

示例:

/* 下面两句效果是一样的 */
UPDATE stu SET age=102 WHERE age >= 18 AND age <= 80;
UPDATE stu SET age=102 WHERE age BETWEEN 18 AND 80;
 
UPDATE stu SET age=102 WHERE name='zhangSan' OR name='liSi';
UPDATE stu SET age=102 WHERE name IN ('zhangSan', 'liSi');
UPDATE stu SET age=102 WHERE age IS NULL;  /* 不能使用等号(age=null),age=null返回的都是false */
UPDATE stu SET age=102 WHERE age IS NOT NULL;

删除数据:

  • DELETE FROM 表名 [WHERE 条件];,一定要带 where 条件!要不就把整个表里的数据全删了!

DQL (Data Query Language)

SQL中单表查询关键字及其排列顺序:

select
from
where
group by
having
order by

基本查询

//表名:emp
//查询所有列
SELECT * FROM emp;
 
//查询指定列
SELECT empno, ename, sal, comm FROM emp;
 
//查询sal列,如果相同只显示一次
SELECT DISTINCT sal FROM emp;
 
//列运算
//加、减、乘、除运算
SELECT sal*1.5 FROM emp;
SELECT sal+comm FROM emp;
 
//字符串连接
SELECT CONCAT('$', sal) FROM emp;
 
//如果comm中存在NULL值,那么当成0来运算
SELECT IFNULL(comm, 0)+1000 FROM emp;
 
//给列起别名
SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM emp;  /* 其中AS可以省略 */
/* 加了别名之后,显示出来的表的表头会显示为别名奖金 */
/* 不加别名表头会显示为:IFNULL(comm, 0)+1000 */

条件控制

//条件查询
SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');

IN 的固定列表、子查询、NULL 陷阱和索引使用详见 03.MySQL IN 详解。

模糊查询

//模糊查询,'_'匹配一个字符,'%'匹配0~N个字符
SELECT * FROM emp WHERE ename LIKE '张_';
SELECT * FROM emp WHERE ename LIKE '张%';
SELECT * FROM emp WHERE ename LIKE '%';  //这个条件等同与不存在,但如果姓名为NULL的查询不出来!

排序

//按sal排序,升序,ASC可以省略
SELECT * FROM WHERE emp ORDER BY sal ASC;
 
//按comm排序,降序
SELECT * FROM WHERE emp ORDER BY comm DESC;
 
//使用sal升序排,如果sal相同时,使用comm的降序排列
SELECT * FROM WHERE emp ORDER BY sal ASC, comm DESC;

聚合函数

//COUNT
//计算emp表中所有列都不为NULL的记录的行数
SELECT COUNT(*) FROM emp;
 
//计算emp表中comm列不为NULL的记录的行数
SELECT COUNT(comm) FROM emp;
 
//MAX
//查询最高工资
SELECT MAX(sal) FROM emp;
 
//MIN
//查询最低工资
SELECT MIN(sal) FROM emp;
 
//SUM
//查询工资和
SELECT SUM(sal) FROM emp;
 
//AVG
//查询平均工资
SELECT AVG(sal) FROM emp;

分组查询

分组查询常和聚合函数一起使用。

//使用deptno分组,查询部门编号和每个部门的记录数
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
 
//使用job分组,查询每种工作的最高工资
SELECT job, MAX(SAL) FROM emp GROUP BY job;
 
//以部门分组,查询每组记录数,条件为记录数大于3
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;

limit 子句

//LIMIT用来限定查询结果的起始行,以及总行数
//查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4, 3;

单表查询练习题

/* 1. 查询出部门编号为30的所有员工。*/
SELECT empno FROM emp WHERE deptno = 30;
 
/* 2. 所有销售员的姓名、编号和部门编号。*/
SELECT ename,empno,deptno FROM emp WHERE job = '销售员';
 
/* 3. 找出奖金高于工资的员工。*/
SELECT * FROM emp WHERE comm > sal;
 
/* 4. 找出奖金高于工资60%的员工。*/
SELECT * FROM emp WHERE comm > 0.6 * sal;
 
/* 5. 找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。*/
SELECT * FROM emp WHERE (deptno = 10 AND job = '经理') OR (deptno = 20 AND job = '销售员');
 
/* 6. 找出部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是经理又不是销售员但其工资大或等于20000的所有员工详细资料。*/
SELECT * FROM emp WHERE (deptno = 10 AND job = '经理') OR (deptno = 20 AND job = '销售员') OR (job NOT IN ('经理', '销售员') AND sal >= 20000);
 
/* 8. 无奖金或奖金低于1000的员工。*/
SELECT ename FROM emp WHERE comm IS NULL OR comm < 1000;
 
/* 9. 查询名字由三个字组成的员工。*/
SELECT * FROM emp WHERE ename LIKE '___';
 
/* 10.查询2000年入职的员工。*/
SELECT * FROM emp WHERE hiredate LIKE '2000-%';
 
/* 11. 查询所有员工详细信息,用编号升序排序。*/
SELECT * FROM emp ORDER BY empno;
 
/* 12. 查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序。*/
SELECT * FROM emp ORDER BY sal DESC, hiredate;
 
/* 13. 查询每个部门的平均工资。*/
SELECT deptno, AVG(sal) 平均工资 FROM emp GROUP BY deptno;
 
/* 14. 查询每个部门的雇员数量。 */
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
 
/* 15. 查询每种工作的最高工资、最低工资、人数。*/
SELECT job, MAX(sal), MIN(sal), COUNT(*) FROM emp GROUP BY job;

约束

主键约束

主键是唯一表示,有如下三个特性:

  • 非空
  • 唯一
  • 被引用

创建表时指定主键:

/* Method 1 */
CREATE TABLE stu(
    sid CHAR(6) PRIMARY KEY,
    sname VARCHAR(20)
);
/* Method 2 */
CREATE TABLE stu(
    sid CHAR(6),
    sname VARCHAR(20),
    PRIMARY KEY(sid)
);

修改表时指定主键:

ALTER TABLE stu ADD PRIMARY KEY(sid);

修改表时删除主键:

ALTER TABLE stu DROP PRIMARY KEY; /* 因为主键是唯一的,所以删除时不用指定是哪一列 */

设置主键自增长

创建表时指定主键自增长:

CREATE TABLE stu(
    sid CHAR(6) PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(20)
);

修改表时设置主键自增长 (和修改列名差不多):

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

修改表时删除主键自增长 (和修改列名差不多):

ALTER TABLE stu CHANGE sid sid INT;

非空约束

CREATE TABLE stu(
    sid INT PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(20) NOT NULL  /* 对sname列设置了非空约束 */
);

唯一约束

CREATE TABLE stu(
    sid INT PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(20) NOT NULL UNIQUE  /* 对sname列设置了非空约束 */
);