一、数据库基础认知
1.1 核心概念
什么是数据库:用于存储 + 管理数据
优点:大数据存储、查询方便、数据一致性、完整性
重点:数据库 ≠ 表
数据库:仓库
表:具体存数据的地方
SQL Server(服务器)
Database(数据库)
Table(表)
Row(行) + Column(列)
1.2 数据库操作
- -- 查看所有数据库
- SELECT name FROM sys.databases;
- -- 查看当前连接的数据库
- SELECT DB_NAME();
- -- 切换数据库
- USE 数据库名;
- -- 删除数据库(需先脱机,IF EXISTS避免不存在报错)
- 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. 创建表
- CREATE TABLE 表名(
- 列名1 类型 [约束],
- 列名2 类型 [约束],
- ...
- );
- -- 2. 查看当前数据库所有表
- SELECT name AS TableName FROM sys.tables;
- -- 3. 查看表结构
- EXEC sp_help '表名';
- -- 4. 删除表
- DROP TABLE 表名;
- -- 5. 修改表(高频)
- ALTER TABLE 表名 ADD 列名 类型; -- 添加列
- ALTER TABLE 表名 ALTER COLUMN 列名 新类型; -- 修改列类型
- EXEC sp_rename '表名.旧列名', '新列名', 'COLUMN'; -- 修改列名
- ALTER TABLE 表名 DROP COLUMN 列名; -- 删除列
- EXEC sp_rename '旧表名', '新表名', 'OBJECT'; -- 修改表名
复制代码
注意DROP 是彻底删除(不可恢复)要谨慎使用
2.2 DML - 操作表记录(增 / 删 / 改)
2.2.1 插入数据
- -- 插入指定列(推荐,列顺序可自定义)
- INSERT INTO 表名(列1,列2) VALUES(值1,值2);
- -- 插入所有列(需按表结构列顺序,不推荐)
- INSERT INTO 表名 VALUES(值1,值2,...);
复制代码
注意字符串必须 '单引号',必须按顺序写全部值
2.2.2 修改数据
- -- 删除指定记录(可回滚,加WHERE)
- DELETE FROM 表名 [WHERE 条件];
- -- 删除所有记录(不可回滚,效率高)
- TRUNCATE TABLE 表名;
复制代码
DELETE:DML 语句,删除可回滚,支持 WHERE 条件,自增列从原有最大值继续增长。
TRUNCATE:DDL 语句,先删表再重建,不可回滚,不支持 WHERE,自增列重置为起始值。
注意:DELETE 省略 WHERE 会删除所有记录,慎用!
2.3 DQL - 核心重点,查询表记录
2.3.1 完整语法与执行顺序
书写顺序:
- SELECT [TOP n] 列列表 FROM 表列表
- WHERE 行条件 GROUP BY 分组列
- HAVING 分组后条件 ORDER BY 排序列 [ASC/DESC];
复制代码
执行顺序:FROM → WHERE → GROUP BY → 聚合函数 → HAVING → SELECT → ORDER BY → TOP
- SELECT * FROM 表名; -- 查询所有列(开发慎用,不直观、效率低)
- SELECT 列1,列2 FROM 表名; -- 查询指定列(推荐)
复制代码
2.3.3 条件查询
支持运算符 / 关键字:=、!=、<>、<、<=、>、>=、BETWEEN...AND、IN(set)、IS NULL、AND/OR/NOT(优先级:NOT > AND > OR)
- -- 示例1:年龄在20-40之间
- SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
- -- 示例2:学号不是S_1001/S_1002
- SELECT * FROM stu WHERE sid NOT IN ('S_1001','S_1002');
- -- 示例3:年龄为NULL(NULL不能用=,必须用IS NULL)
- SELECT * FROM stu WHERE age IS NULL;
复制代码
注意:判断 NULL 必须用 IS NULL/IS NOT NULL,不可用 = NULL。
2.3.4 模糊查询
搭配通配符:_(匹配单个任意字符)、%(匹配0~n 个任意字符)。
- -- 示例1:姓名5个字符,第5个是i
- SELECT * FROM stu WHERE sname LIKE '____i';
- -- 示例2:姓名包含a
- SELECT * FROM stu WHERE sname LIKE '%a%';
- -- 示例3:姓名以z开头
- SELECT * FROM stu WHERE sname LIKE 'z%';
复制代码
2.3.5 字段控制查询
1. 去重
- SELECT DISTINCT job FROM emp; -- 去重查询员工职位
复制代码
2. 字段运算:
数值类型可直接运算,NULL 需用 ISNULL(字段,0) 转换(NULL 参与运算结果为 NULL)。
2.3.6 排序
ASC:升序(默认,可省略);DESC:降序。
多字段排序:第一个字段值相同时,按第二个字段排序。
- -- 示例:月薪降序,月薪相同则编号升序
- 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:按部门分组,查询每个部门的人数
- SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
- -- 示例2:按部门分组,查询工资和大于9000的部门
- SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
复制代码
WHERE 与 HAVING 核心区别
| 特性 | WHERE | HAVING |
|---|
| 执行时机 | 分组前过滤 | 分组后过滤 | | 聚合函数 | 不支持判断 | 支持判断 | | 作用对象 | 原始行记录 | 分组后的结果集 |
2.3.9 分页查询(SQL Server 专属)
- -- 方式1:OFFSET-FETCH(推荐)- 第2页,每页5条
- SELECT * FROM emp ORDER BY sal
- OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;
- -- 方式2:ROW_NUMBER() - 兼容旧版本
- WITH NumberedRows AS (
- SELECT *, ROW_NUMBER() OVER (ORDER BY sal) AS RowNum FROM emp
- )
- SELECT * FROM NumberedRows WHERE RowNum BETWEEN 6 AND 10;
- -- 方式3:TOP 子句 - 简单分页
- SELECT TOP 5 * FROM (SELECT TOP 10 * FROM emp ORDER BY sal) AS Temp ORDER BY sal DESC;
复制代码
三、思维导图
|