[数据库] SQL Server 学习笔记

443 0
Honkers 2026-3-24 20:18:19 来自手机 | 显示全部楼层 |阅读模式

一、数据库基础认知

1.1 核心概念

什么是数据库:用于存储 + 管理数据
优点:大数据存储、查询方便、数据一致性、完整性


重点:数据库 ≠ 表
数据库:仓库
表:具体存数据的地方

SQL Server(服务器)
        Database(数据库)
           Table(表)
                   Row(行) + Column(列)

1.2 数据库操作

  1. -- 查看所有数据库
  2. SELECT name FROM sys.databases;
  3. -- 查看当前连接的数据库
  4. SELECT DB_NAME();
  5. -- 切换数据库
  6. USE 数据库名;
  7. -- 删除数据库(需先脱机,IF EXISTS避免不存在报错)
  8. DROP DATABASE IF EXISTS 数据库名;
复制代码

1.3 数据库移动方式

分离 / 附加:分离后可移动文件,附加时选择.mdf文件即可恢复。
脱机 / 联机:脱机后可操作文件,联机恢复使用(联机时移动文件会报错)。

二、SQL 语句核心分类

SQL 是结构化查询语言,关键字不区分大小写,语句以分号结尾,可多行书写;

四大类:

DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

2.1 DDL

2.1.1 核心数据类型

SQL Server 列类型分三大类,选类型需贴合业务场景,避免浪费空间:

类型分类常用类型适用场景注意点
数值类型int/tinyint/decimal(p,s)年龄(tinyint)、薪资 / 分数(decimal)decimal (p,s):p 总位数,s 小数位数
字符串类型nchar(n)/nvarchar(n)性别(nchar (1))、用户名(nvarchar (50))nchar:定长,效率高;nvarchar:变长,省空间(Unicode 类型,支持中文)
日期时间类型date/datetime/datetime2生日(date)、创建时间(datetime)datetime 精度 3.33ms,datetime2 精度更高(推荐)

2.1.2 表的核心操作

  1. -- 1. 创建表
  2. CREATE TABLE 表名(
  3. 列名1 类型 [约束],
  4. 列名2 类型 [约束],
  5. ...
  6. );
  7. -- 2. 查看当前数据库所有表
  8. SELECT name AS TableName FROM sys.tables;
  9. -- 3. 查看表结构
  10. EXEC sp_help '表名';
  11. -- 4. 删除表
  12. DROP TABLE 表名;
  13. -- 5. 修改表(高频)
  14. ALTER TABLE 表名 ADD 列名 类型; -- 添加列
  15. ALTER TABLE 表名 ALTER COLUMN 列名 新类型; -- 修改列类型
  16. EXEC sp_rename '表名.旧列名', '新列名', 'COLUMN'; -- 修改列名
  17. ALTER TABLE 表名 DROP COLUMN 列名; -- 删除列
  18. EXEC sp_rename '旧表名', '新表名', 'OBJECT'; -- 修改表名
复制代码

注意DROP 是彻底删除(不可恢复)要谨慎使用

2.2 DML -  操作表记录(增 / 删 / 改)

2.2.1 插入数据

  1. -- 插入指定列(推荐,列顺序可自定义)
  2. INSERT INTO 表名(列1,列2) VALUES(值1,值2);
  3. -- 插入所有列(需按表结构列顺序,不推荐)
  4. INSERT INTO 表名 VALUES(值1,值2,...);
复制代码

注意字符串必须 '单引号',必须按顺序写全部值

2.2.2 修改数据

  1. -- 删除指定记录(可回滚,加WHERE)
  2. DELETE FROM 表名 [WHERE 条件];
  3. -- 删除所有记录(不可回滚,效率高)
  4. TRUNCATE TABLE 表名;
复制代码

DELETE:DML 语句,删除可回滚,支持 WHERE 条件,自增列从原有最大值继续增长。
TRUNCATE:DDL 语句,先删表再重建,不可回滚,不支持 WHERE,自增列重置为起始值。
注意:DELETE 省略 WHERE 会删除所有记录,慎用!

2.3 DQL - 核心重点,查询表记录

2.3.1 完整语法与执行顺序

书写顺序:

  1. SELECT [TOP n] 列列表 FROM 表列表
  2. WHERE 行条件 GROUP BY 分组列
  3. HAVING 分组后条件 ORDER BY 排序列 [ASC/DESC];
复制代码

执行顺序:FROM → WHERE → GROUP BY → 聚合函数 → HAVING → SELECT → ORDER BY → TOP

  1. SELECT * FROM 表名; -- 查询所有列(开发慎用,不直观、效率低)
  2. SELECT 列1,列2 FROM 表名; -- 查询指定列(推荐)
复制代码

2.3.3 条件查询

支持运算符 / 关键字:=、!=、<>、<、<=、>、>=、BETWEEN...AND、IN(set)、IS NULL、AND/OR/NOT(优先级:NOT > AND > OR)

  1. -- 示例1:年龄在20-40之间
  2. SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
  3. -- 示例2:学号不是S_1001/S_1002
  4. SELECT * FROM stu WHERE sid NOT IN ('S_1001','S_1002');
  5. -- 示例3:年龄为NULL(NULL不能用=,必须用IS NULL)
  6. SELECT * FROM stu WHERE age IS NULL;
复制代码

注意:判断 NULL 必须用 IS NULL/IS NOT NULL,不可用 = NULL。

2.3.4 模糊查询

搭配通配符:_(匹配单个任意字符)、%(匹配0~n 个任意字符)。

  1. -- 示例1:姓名5个字符,第5个是i
  2. SELECT * FROM stu WHERE sname LIKE '____i';
  3. -- 示例2:姓名包含a
  4. SELECT * FROM stu WHERE sname LIKE '%a%';
  5. -- 示例3:姓名以z开头
  6. SELECT * FROM stu WHERE sname LIKE 'z%';
复制代码

2.3.5 字段控制查询

1. 去重
  1. SELECT DISTINCT job FROM emp; -- 去重查询员工职位
复制代码
2. 字段运算

数值类型可直接运算,NULL 需用 ISNULL(字段,0) 转换(NULL 参与运算结果为 NULL)。

2.3.6 排序

ASC:升序(默认,可省略);DESC:降序。
多字段排序:第一个字段值相同时,按第二个字段排序。

  1. -- 示例:月薪降序,月薪相同则编号升序
  2. SELECT * FROM emp ORDER BY sal DESC, empno ASC;
复制代码

2.3.7 聚合函数

函数功能示例
COUNT()统计非 NULL 记录数COUNT (*)(统计所有行)、COUNT (comm)(统计奖金非 NULL 数)
SUM()数值列求和SUM (sal+ISNULL (comm,0))(月薪 + 奖金总和)
AVG()数值列求平均AVG (sal)(平均月薪)
MAX()/MIN()求最大 / 最小值MAX (sal)(最高月薪)

2.3.8 分组查询

核心:按指定列分组,查询列只能是分组列或聚合函数,其他列无意义。

  1. -- 示例1:按部门分组,查询每个部门的人数
  2. SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
  3. -- 示例2:按部门分组,查询工资和大于9000的部门
  4. SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
复制代码

WHERE 与 HAVING 核心区别

特性WHEREHAVING
执行时机分组前过滤分组后过滤
聚合函数不支持判断支持判断
作用对象原始行记录分组后的结果集

2.3.9 分页查询(SQL Server 专属)

  1. -- 方式1:OFFSET-FETCH(推荐)- 第2页,每页5条
  2. SELECT * FROM emp ORDER BY sal
  3. OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;
  4. -- 方式2:ROW_NUMBER() - 兼容旧版本
  5. WITH NumberedRows AS (
  6. SELECT *, ROW_NUMBER() OVER (ORDER BY sal) AS RowNum FROM emp
  7. )
  8. SELECT * FROM NumberedRows WHERE RowNum BETWEEN 6 AND 10;
  9. -- 方式3:TOP 子句 - 简单分页
  10. SELECT TOP 5 * FROM (SELECT TOP 10 * FROM emp ORDER BY sal) AS Temp ORDER BY sal DESC;
复制代码

三、思维导图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行