一、前言
本周系统学习了 SQL Server T-SQL 完整核心知识,从数据库基础、建表与数据四大完整性约束,到增删改查基础语法、多表关联查询、子查询、事务处理,最后补充生产高频使用的模糊查询 LIKE全套内容。本文整合全部知识点,去重梳理,配套可直接执行的 SQL 示例,适合复习、面试、开发查阅。
二、Day01 认识 SQL Server 数据库基础
1.核心概念
(1)DB/DBMS/DBA
1.DB(Database):数据库,存储结构化数据的容器;
2.DBMS:数据库管理系统,操作数据库软件,主流:SQL Server、MySQL、Oracle、DB2;
3.DBA:数据库管理员,负责库维护、调优、权限管理。
(2)SQL Server 文件结构
1..mdf:主数据文件,一个库只能 1 个;
2..ldf:事务日志文件,记录所有增删改操作,用于事务回滚、数据恢复;
3..ndf:次要数据文件,可选,分担存储压力。
(3)系统自带数据库
master(系统核心库)、model(新建库模板)、msdb(代理任务)、tempdb(临时数据,重启清空)。
(4)常用数据类型表格
| 类型分类 | 关键字 | 说明 |
|---|---|---|
| 整型 | int | 存储整数,常用于主键 ID、自增标识列 |
| 货币 | money | 自动保留 4 位小数,薪资、金额专用 |
| 布尔 | bit | 仅存 0/1,代表否 / 是 |
| 日期 | date/datetime | 存储入职时间、创建时间 |
| 固定字符串 | nchar(n) | 长度固定,不足补空格,查询更快 |
| 可变字符串 | varchar(n)/nvarchar(n) | 占用实际字符长度,节省存储空间 |
(5)示例创建数据库
-- 创建测试库 CREATE DATABASE SchoolDB ON PRIMARY ( NAME = SchoolDB_Data, FILENAME = 'D:\SQLData\SchoolDB.mdf', SIZE = 5MB, FILEGROWTH = 2MB ) LOG ON ( NAME = SchoolDB_Log, FILENAME = 'D:\SQLData\SchoolDB.ldf', SIZE = 2MB, FILEGROWTH = 1MB ); GO三、Day02 建表 & 四大数据完整性约束
数据完整性分类(思维导图总结)
1.实体完整性(约束行唯一):主键、唯一约束、标识自增列
2.域完整性(约束列数据合法):数据类型、非空、默认值、CHECK 检查约束
3.引用完整性(约束多表关系):外键 FOREIGN KEY
4.自定义完整性:复杂业务规则(进阶内容)
各类约束特点对比
1.主键 PRIMARY KEY:唯一 + 非空,一张表仅 1 个主键,可单字段 / 多字段组合;
2.唯一 UNIQUE:值不能重复,允许 1 行 NULL;
3.标识列 IDENTITY (种子,增量):int 专用,自动自增,无法手动插入;
4.CHECK 检查约束:自定义规则,如性别只能男 / 女、年龄 18~60;
5.外键 FOREIGN KEY:关联另一张表主键,保证引用数据真实存在。
完整建表示例(带全部约束)
-- 部门表(主键自增) CREATE TABLE dept( id INT PRIMARY KEY IDENTITY(1,1), dname VARCHAR(50) NOT NULL, -- 非空约束 loc VARCHAR(50) DEFAULT '北京' -- 默认值约束 ); -- 员工表(含外键、检查约束) CREATE TABLE emp( id INT PRIMARY KEY IDENTITY(1,1), ename NVARCHAR(20) NOT NULL, gender NCHAR(2), salary MONEY, joindate DATE, dept_id INT, -- 检查约束:性别只能男/女 CONSTRAINT ck_gender CHECK(gender = N'男' OR gender = N'女'), -- 外键关联部门表 CONSTRAINT fk_emp_dept FOREIGN KEY(dept_id) REFERENCES dept(id) );四、Day03 T-SQL 增删改查 DML 基础
1. DML 分类:INSERT/UPDATE/DELETE/SELECT
(1)插入 INSERT
-- 指定字段插入 INSERT INTO dept(dname,loc) VALUES(N'研发部',N'上海'); -- 全字段插入(顺序匹配表结构) INSERT INTO emp(ename,gender,salary,joindate,dept_id) VALUES(N'孙悟空',N'男',7200,'2013-02-24',1);(2)修改 UPDATE
-- 带条件更新,不加WHERE会更新全表(高危) UPDATE emp SET salary = 8000 WHERE ename = N'孙悟空';(3)删除 DELETE / TRUNCATE / DROP 区别
DELETE 表名 WHERE 条件:删除指定行,日志记录,可事务回滚,自增编号不重置;TRUNCATE TABLE 表名:清空全表数据,不记录单行日志,速度快,自增重置;DROP TABLE 表名:直接删除整张表结构 + 数据,无法恢复。
DELETE FROM emp WHERE id = 1; TRUNCATE TABLE emp; DROP TABLE emp;(4)基础查询 SELECT
-- 基础查询、别名、分页、判空、不等于 SELECT TOP 10 id AS 员工编号, ename 姓名, salary 工资 FROM emp WHERE salary > 5000 AND gender IS NOT NULL -- 不为空 AND ename <> N'猪八戒' -- 不等于 ORDER BY salary DESC; -- 降序五、高级查询:多表连接、子查询(高级查询 PDF 核心)
1. 笛卡尔积问题
多表直接查询不加关联条件,会生成两表所有数据组合,产生大量无效数据,必须用关联条件过滤。
2. 内连接 INNER JOIN(只查两张表交集数据)
两种写法:隐式 WHERE、显式 JOIN ON
-- 隐式内连接 SELECT e.ename,d.dname FROM emp e,dept d WHERE e.dept_id = d.id; -- 显式内连接(推荐,可读性更高) SELECT e.ename,d.dname FROM emp e INNER JOIN dept d ON e.dept_id = d.id;3.外连接
1.左外连接 LEFT JOIN:左表全部数据,匹配右表数据,无匹配显示 NULL
SELECT e.*,d.dname FROM emp e LEFT JOIN dept d ON e.dept_id = d.id;2.右外连接 RIGHT JOIN:右表全部数据,匹配左表数据
4. 自连接(同一张表上下级关联)
-- 查询员工和直属领导姓名 SELECT sub.ename 员工,leader.ename 领导 FROM emp sub LEFT JOIN emp leader ON sub.mgr = leader.id;5. 子查询三大分类
1.单行单列子查询:搭配= > < >= <=
-- 查询工资高于平均工资的员工 SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);2.多行单列子查询:搭配IN
-- 查询财务部、市场部所有员工 SELECT * FROM emp WHERE dept_id IN ( SELECT id FROM dept WHERE dname IN(N'财务部',N'市场部') );3.多行多列子查询:子查询作为虚拟表参与关联
-- 查询2011年后入职员工+对应部门 SELECT d.*,t.* FROM dept d, (SELECT * FROM emp WHERE joindate > '2011-11-11') t WHERE d.id = t.dept_id;六、事务 Transaction 转账实战
1. 事务作用
保证一组增删改操作要么全部成功,要么全部失败,解决转账、库存扣减等数据一致性问题。
事务四大特性 ACID:原子性、一致性、隔离性、持久性
转账完整事务示例
-- 银行账户表 CREATE TABLE bank( uname NVARCHAR(20), umoney MONEY CHECK(umoney >= 1) ); INSERT INTO bank VALUES(N'班长',10000),(N'学委',100); -- 事务转账逻辑 DECLARE @myerror INT = 0; BEGIN TRANSACTION -- 开启事务 -- 扣款 UPDATE bank SET umoney = umoney - 5000 WHERE uname = N'班长'; SET @myerror = @myerror + @@ERROR; -- 收款 UPDATE bank SET umoney = umoney + 5000 WHERE uname = N'学委'; SET @myerror = @myerror + @@ERROR; -- 判断是否出错 IF @myerror <> 0 BEGIN ROLLBACK TRANSACTION; -- 出错回滚 PRINT N'转账失败,数据回滚'; END ELSE BEGIN COMMIT TRANSACTION; -- 无错误提交 PRINT N'转账成功'; END七、SQL Server T-SQL 模糊查询 LIKE
1. LIKE 完整语法
SELECT 字段 FROM 表 WHERE 字符串字段 LIKE '匹配模板' [ESCAPE 转义符]四类通配符
| 符号 | 作用 | 示例 |
|---|---|---|
% | 0 或多个任意字符 | ename LIKE N'李%' |
_ | 单个任意字符 | ename LIKE N'_悟_' |
[xy] | 匹配括号内单个字符 | tel LIKE '1[358]%' |
[^xy] | 排除括号内字符 | id LIKE '[^0]%' |
2. ESCAPE 转义(字段包含_/%时使用)
-- 查询名称带下划线的记录,/为转义符 SELECT * FROM emp WHERE ename LIKE N'%/_%' ESCAPE '/';3. NOT LIKE 反向模糊匹配
-- 筛选姓名不含“妖”的员工 SELECT ename,salary FROM emp WHERE ename NOT LIKE N'%妖%';4. 多表联查模糊实战
-- 查询部门名含“部”、员工姓名含“唐”的数据 SELECT e.ename,d.dname FROM emp e INNER JOIN dept d ON e.dept_id = d.id WHERE e.ename LIKE N'%唐%' AND d.dname LIKE N'%部%';5. 数字 / 日期模糊匹配(需 CAST 转字符串)
-- 查询2001年入职员工 SELECT ename,joindate FROM emp WHERE CAST(joindate AS VARCHAR) LIKE '2001%';6. 模糊查询的性能核心要点
1.%放在最前面:LIKE '%关键词'索引失效,全表扫描;
2.前缀匹配关键词%可正常走索引;
3.全文索引解决全局模糊检索%xx%,百万级数据高效查询。
八、本周知识点整体梳理总结
本文整合本周SQL Server T-SQL全部学习内容,系统梳理从数据库基础、建表约束、增删改查、多表查询、子查询、事务到模糊查询的完整知识体系。文章先讲解数据库文件、数据类型与四大数据完整性约束,搭配带约束的建表代码;区分INSERT、UPDATE、DELETE、TRUNCATE、DROP的使用差异;详解内/外/自连接与三类子查询实操;通过转账案例演示事务回滚与提交机制;补充文档未完整覆盖的T-SQL模糊查询,包含四类通配符、转义字符、多表模糊匹配及索引优化要点。全文配套可直接执行的SQL示例,去重整合多份教学文档内容,覆盖开发常用场景,清晰梳理知识点层级,帮助快速掌握SQL Server核心查询与数据保障能力,适用于复习与日常开发查阅。