Appearance
SQL Server 基础开发与 Ado.Net 实战手册
💡 导语:本手册是 SQL Server 入门到实战的精华笔记,涵盖了从环境搭建到核心语法,再到程序接入的完整链路,适合作为快速查阅的开发指南。
1. 数据库核心概念与环境
1.1 基础概念
- DBMS:数据库管理系统(如 SQL Server, Oracle)。
- 数据库组成:架构 (Schema) -> 表 (Table) -> 行 (Row) & 列 (Column)。
- 主键 (PK):数据行的唯一标识,通常建议使用自动增长 (Identity) 或 GUID。
1.2 环境链接与管理
- 身份验证:支持 Windows 身份验证与 SQL Server 混合验证(建议启用
sa账户)。 - 本机链接:
.、(local)或127.0.0.1均代表本机。 - 默认路径:建议将数据库文件存放在 SQL Server 默认 DATA 目录,以避免权限导致的“附加失败”问题。
2. T-SQL 基础语法 (DDL & DML)
2.1 数据库与表操作
sql
-- 创建数据库
CREATE DATABASE School
ON (NAME='School_Data', FILENAME='D:\Data\School.mdf', SIZE=5MB, FILEGROWTH=2MB)
LOG ON (NAME='School_Log', FILENAME='D:\Data\School_log.ldf');
-- 创建表
CREATE TABLE Student (
Id INT PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(32) NOT NULL,
Age INT CHECK(Age > 0),
Birthday DATETIME DEFAULT GETDATE()
);2.2 数据操作 (CRUD)
- 插入 (Insert):
INSERT INTO 表名(列1) VALUES(值1) - 更新 (Update):
UPDATE 表名 SET 列1=值1 WHERE 条件 - 删除 (Delete):
DELETE FROM 表名 WHERE 条件 - 查询 (Select):
SELECT DISTINCT TOP 10 * FROM 表 WHERE 条件 ORDER BY 列 DESC
3. 进阶查询与性能优化
3.1 聚合函数与分组
- 聚合函数:
AVG()、COUNT()、SUM()、MIN()/MAX()。 - 分组过滤:
GROUP BY分组后,必须使用HAVING进行过滤,而不是WHERE。
3.2 SQL 执行顺序 (面试重点)
- FROM (定位表)
- WHERE (过滤行)
- GROUP BY (分组)
- HAVING (过滤分组)
- SELECT (投影列)
- ORDER BY (排序结果)
3.3 连接查询 (Join)
- Inner Join:内连接,只显示匹配成功的行。
- Left Join:左外连接,以左表为准,右表无匹配显示为 NULL。
4. Ado.Net 程序开发实战
4.1 核心组件
- SqlConnection:负责开启与关闭与数据库的物理通道。
- SqlCommand:负责执行 SQL 命令。
- SqlParameter:关键安全策略,防止 SQL 注入。
4.2 C# 实战代码片段
csharp
// 1. 链接字符串配置 (app.config)
string connStr = ConfigurationManager.ConnectionStrings["sql2"].ConnectionString;
// 2. 参数化查询示例 (防止注入)
using (SqlConnection conn = new SqlConnection(connStr)) {
string sql = "SELECT COUNT(*) FROM Users WHERE UserName=@name AND Pwd=@pwd";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@name", userName);
cmd.Parameters.AddWithValue("@pwd", password);
conn.Open();
int count = (int)cmd.ExecuteScalar();
}5. 常见问题与迁移 FAQ
5.1 数据库迁移
- 方案:分离/附加、备份/还原、生成 SQL 脚本。
- 权限坑点:迁移文件后若无法读取,请检查 Administrator 账户权限或文件系统访问权限。
5.2 命名与设计建议
- 命名规范:表名建议使用英文(如
Department),字段名语义清晰。 - 注释原则:代码逻辑尽量清晰到“自解释”,必要时补充业务背景注释。
6. 实战练习与测试数据
6.1 通话记录表 (CallRecords) 实战练习
本练习涵盖了表结构设计、多种约束的应用以及基础的业务查询逻辑。
1. 表结构与约束定义 (DDL)
sql
-- 创建通话记录表
CREATE TABLE [CallRecords] (
[Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[CallerNumber] NVARCHAR(50), -- 呼叫中心员工工号(需为三位数字)
[TelNum] VARCHAR(50), -- 对方电话号码
[StartDateTime] DATETIME, -- 开始时间
[EndDateTime] DATETIME DEFAULT(GETDATE()) -- 结束时间,默认为当前时间
);
-- 添加工号格式约束 (三位数字)
ALTER TABLE [CallRecords]
ADD CONSTRAINT CK_CallRecords_Num CHECK(CallerNumber LIKE '[0-9][0-9][0-9]');
-- 添加逻辑约束 (结束时间 > 开始时间)
ALTER TABLE [CallRecords]
ADD CONSTRAINT CK_CallRecords_Time CHECK(EndDateTime > StartDateTime);2. 核心练习题目
- 时长分析:查询通话时间最长的 5 条记录。
- 特定号码统计:查询以
0开头的通话总时长(以秒为单位)。 - 绩效排位:查询 2010 年 7 月通话总时长最多的前两个呼叫员编号。
- 频率分析:查询 2010 年 7 月拨打电话次数最多的前两个呼叫员编号。
6.2 基础测试数据集 (学生信息)
用于练习数据导入或基础 CRUD 的样本数据:
| 编号 | 姓名 | 性别 | 出生日期 | 电话 |
|---|---|---|---|---|
| 1 | 龙公子 | 女 | 1980-01-01 | 12345678909 |
| 2 | 苏坤 | 男 | 1979-11-21 | 12345678908 |
| 3 | 马伦 | 男 | 1982-02-14 | 12345678907 |
| 4 | 王成伟 | 男 | 1984-07-11 | 12345678906 |
参考资料
- [ Inside T-SQL 系列丛书 ]
- [ MSDN SQL Server 官方文档 ]
