Skip to content

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 执行顺序 (面试重点) ​

  1. FROM (定位表)
  2. WHERE (过滤行)
  3. GROUP BY (分组)
  4. HAVING (过滤分组)
  5. SELECT (投影列)
  6. 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-0112345678909
2苏坤男1979-11-2112345678908
3马伦男1982-02-1412345678907
4王成伟男1984-07-1112345678906

参考资料 ​

  • [ Inside T-SQL 系列丛书 ]
  • [ MSDN SQL Server 官方文档 ]

方舟 · Ark