SQL Server T-SQL 一周学习完整概述|约束、多表查询、子查询、事务、模糊查询全套实战

SQL Server T-SQL 一周学习完整概述|约束、多表查询、子查询、事务、模糊查询全套实战

一、前言

本周系统学习了 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 区别

  1. DELETE 表名 WHERE 条件:删除指定行,日志记录,可事务回滚,自增编号不重置;
  2. TRUNCATE TABLE 表名:清空全表数据,不记录单行日志,速度快,自增重置;
  3. 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核心查询与数据保障能力,适用于复习与日常开发查阅。