SQL Server 学习笔记第一天

目录

  • 什么是SQL Server?

  • 为什么使用数据库?

  • SQL Server Management Studio (SSMS) 与 SQL Server 的协作

  • 可视化操作:数据库与表

  • SQL 基础操作:增删改查

  • 主键约束

  • WHERE 子句


什么是SQL Server?

SQL Server 是由Microsoft开发的关系型数据库管理系统(RDBMS),用于高效存储、管理和检索数据。它提供:

  • 安全的数据存储

  • 高性能数据处理

  • 事务管理(ACID兼容)

  • 高级分析功能

  • 商业智能工具


为什么使用数据库?

文件系统存储

数据库系统存储

😟 数据冗余和不一致

✅ 数据集中管理,减少冗余

😟 并发访问困难

✅ 高效并发控制

😟 数据检索效率低

✅ 快速查询和索引优化

😟 缺乏安全机制

✅ 完善的权限管理和安全控制

😟 无事务支持

✅ ACID事务保证数据完整性

关键优势:数据一致性、完整性、安全性、并发控制、高效查询


SQL Server Management Studio (SSMS) 与 SQL Server 的协作

图表

代码

graph LR
    A[SSMS] -->|发送SQL命令| B[SQL Server]
    B -->|返回结果集| A
    A -->|管理/配置| B
    A -->|可视化操作| B
  • SSMS:图形化管理工具(客户端)

  • SQL Server:数据库引擎(服务端)

  • 协作方式

    1. SSMS 通过TDS协议与SQL Server通信

    2. 用户操作转换为T-SQL语句发送到服务端

    3. SQL Server执行操作并返回结果

    4. SSMS以可视化形式展示结果


可视化操作:数据库与表

Excel 类比理解

Excel 概念

SQL Server 对应

说明

工作簿 (Workbook)

数据库 (Database)

数据存储的顶级容器

工作表 (Sheet)

表 (Table)

结构化数据的集合

列标题 (Header)

列/字段 (Column)

定义数据的属性

行 (Row)

记录 (Record)

单条数据实体

单元格 (Cell)

字段值 (Value)

特定数据的值

新建数据库步骤(SSMS)

  1. 右键"数据库" → 新建数据库

  2. 输入数据库名称(如SchoolDB

  3. 配置文件参数(可选)

  4. 点击"确定"

新建数据表步骤

  1. 展开数据库 → 右键"表" → 新建表

  2. 设计表结构:

    • 列名(如StudentID, Name

    • 数据类型(如int, varchar(50)

    • 是否允许NULL

  3. 设置主键(右键列 → 设置主键)

  4. 保存表(命名如Students


SQL 基础操作:增删改查

1. 插入数据 (INSERT)

sql

-- 插入单条记录
INSERT INTO Students (StudentID, Name, Age)
VALUES (1, '张三', 20);

-- 插入多条记录
INSERT INTO Students (StudentID, Name, Age)
VALUES (2, '李四', 22),
       (3, '王五', 21);

2. 查询数据 (SELECT)

sql

-- 查询所有列
SELECT * FROM Students;

-- 查询特定列
SELECT Name, Age FROM Students;

-- 带条件查询
SELECT * FROM Students WHERE Age > 20;

3. 更新数据 (UPDATE)

sql

-- 更新单条记录
UPDATE Students 
SET Age = 23 
WHERE StudentID = 2;

-- 批量更新
UPDATE Students
SET Age = Age + 1;

4. 删除数据 (DELETE)

sql

-- 删除特定记录
DELETE FROM Students 
WHERE StudentID = 3;

-- 清空表(保留结构)
DELETE FROM Students;

主键约束

主键(Primary Key) 是表的唯一标识符,具有以下特性:

  • 🔑 唯一性:每行必须有唯一主键值

  • 🚫 非空性:主键列不允许NULL值

  • ⚙️ 自动索引:提高查询效率

创建主键

sql

-- 建表时定义
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50) NOT NULL,
    Age INT
);

-- 修改现有表
ALTER TABLE Students
ADD CONSTRAINT PK_StudentID PRIMARY KEY (StudentID);

最佳实践:使用无业务意义的ID(如自增ID)作为主键


WHERE 子句

WHERE 用于筛选满足特定条件的记录

运算符示例

运算符

示例

说明

=

WHERE Age = 20

等于

>

WHERE Age > 20

大于

<

WHERE Age < 20

小于

>=

WHERE Age >= 20

大于等于

<=

WHERE Age <= 20

小于等于

<>!=

WHERE Age <> 20

不等于

BETWEEN

WHERE Age BETWEEN 18 AND 25

在范围内

LIKE

WHERE Name LIKE '张%'

模式匹配(%通配符)

IN

WHERE Age IN (18, 20, 22)

在指定值列表中

IS NULL

WHERE Email IS NULL

检测空值

组合条件

sql

-- AND 运算符
SELECT * FROM Students
WHERE Age > 18 AND Department = '计算机系';

-- OR 运算符
SELECT * FROM Students
WHERE Age < 20 OR Age > 25;

-- NOT 运算符
SELECT * FROM Students
WHERE NOT Department = '英语系';

📌 注意:字符串需用单引号包裹,如'计算机系'

SQL Server学习笔记第二天

一、代码分析

1. 核心功能模块

csharp

// 数据库连接字符串
private const string ConnectionString = "Server=localhost;DataBase=testDB;Trusted_Connection=true;";

// 执行非查询SQL(增删改)
static int Dosql(string sqlContent)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        try
        {
            conn.Open();
            using (SqlCommand sqlCmd = new SqlCommand(sqlContent, conn))
            {
                return sqlCmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"SQL执行失败: {ex.Message}");
            return -1;
        }
    }
}

// 执行查询SQL
static DataTable DoSearchSql(string sqlString)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        try
        {
            conn.Open();
            using (SqlCommand sqlCmd = new SqlCommand(sqlString, conn))
            using (SqlDataAdapter adapter = new SqlDataAdapter(sqlCmd))
            {
                DataTable dt = new DataTable();
                adapter.Fill(dt);
                return dt;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"查询失败: {ex.Message}");
            return new DataTable();
        }
    }
}

2. 功能说明

方法名

功能描述

返回值

适用场景

Dosql

执行增删改操作

受影响行数(-1失败)

INSERT/UPDATE/DELETE

DoSearchSql

执行查询操作

DataTable结果集

SELECT查询

3. 使用示例

csharp

// 更新用户性别
Dosql($"UPDATE UserT SET gender = '男' WHERE userName = 'Alice'");

// 查询所有用户
DataTable users = DoSearchSql("SELECT * FROM UserT");
foreach (DataRow row in users.Rows)
{
    Console.WriteLine($"用户名:{row["userName"]}, 性别:{row["gender"]}");
}

二、代码优化建议

1. SQL注入风险

问题:直接拼接SQL字符串存在安全漏洞

csharp

// 危险示例
DoSearchSql($"SELECT * FROM UserT WHERE userName='{userInput}'");

解决方案:使用参数化查询

csharp

static DataTable SafeSearch(string query, SqlParameter[] parameters)
{
    using (var conn = new SqlConnection(ConnectionString))
    using (var cmd = new SqlCommand(query, conn))
    {
        cmd.Parameters.AddRange(parameters);
        // ... 执行查询 ...
    }
}

2. 连接管理优化

问题:原始代码中DoSearchSql未正确释放连接

解决方案

  • 使用using语句确保资源释放

  • 添加连接状态检查

csharp

if (conn.State != ConnectionState.Open)
    conn.Open();

3. 异常处理增强

建议

  • 记录详细错误日志

  • 区分不同异常类型

csharp

catch (SqlException sqlEx)
{
    Console.WriteLine($"数据库错误: {sqlEx.Number}");
}
catch (Exception ex)
{
    Console.WriteLine($"系统错误: {ex.Message}");
}

三、重构后的封装方法

csharp

public class DbHelper
{
    private const string ConnString = "Server=localhost;Database=testDB;Trusted_Connection=True;";
    
    // 执行非查询操作(参数化)
    public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
    {
        using (var conn = new SqlConnection(ConnString))
        using (var cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddRange(parameters);
            try
            {
                conn.Open();
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                // 记录日志
                return -1;
            }
        }
    }

    // 执行查询(参数化)
    public static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
    {
        var dt = new DataTable();
        using (var conn = new SqlConnection(ConnString))
        using (var cmd = new SqlCommand(sql, conn))
        using (var adapter = new SqlDataAdapter(cmd))
        {
            cmd.Parameters.AddRange(parameters);
            try
            {
                conn.Open();
                adapter.Fill(dt);
            }
            catch (Exception ex)
            {
                // 记录日志
            }
        }
        return dt;
    }
    
    // 获取单条记录
    public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
    {
        // 实现类似...
    }
}

四、练习题:用户管理系统

任务要求

  1. 使用封装好的DbHelper类

  2. 实现以下功能:

    • 用户注册

    • 密码修改

    • 用户删除

    • 按性别查询用户

基础实现代码

csharp

// 用户注册
public static bool RegisterUser(string username, string password)
{
    string sql = "INSERT INTO UserT (userName, passWord) VALUES (@user, @pwd)";
    var parameters = new[]
    {
        new SqlParameter("@user", username),
        new SqlParameter("@pwd", password)
    };
    return DbHelper.ExecuteNonQuery(sql, parameters) > 0;
}

// 修改密码
public static bool ChangePassword(string username, string newPassword)
{
    string sql = "UPDATE UserT SET passWord = @pwd WHERE userName = @user";
    var parameters = new[]
    {
        new SqlParameter("@user", username),
        new SqlParameter("@pwd", newPassword)
    };
    return DbHelper.ExecuteNonQuery(sql, parameters) > 0;
}

// 删除用户
public static bool DeleteUser(string username)
{
    string sql = "DELETE FROM UserT WHERE userName = @user";
    var parameter = new SqlParameter("@user", username);
    return DbHelper.ExecuteNonQuery(sql, parameter) > 0;
}

// 按性别查询
public static DataTable GetUsersByGender(string gender)
{
    string sql = "SELECT userName, gender FROM UserT WHERE gender = @gender";
    var parameter = new SqlParameter("@gender", gender);
    return DbHelper.ExecuteQuery(sql, parameter);
}

不会做游戏