SQL Server 学习笔记第一天
目录
什么是SQL Server?
为什么使用数据库?
SQL Server Management Studio (SSMS) 与 SQL Server 的协作
可视化操作:数据库与表
SQL 基础操作:增删改查
主键约束
WHERE 子句
什么是SQL Server?
SQL Server 是由Microsoft开发的关系型数据库管理系统(RDBMS),用于高效存储、管理和检索数据。它提供:
安全的数据存储
高性能数据处理
事务管理(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:数据库引擎(服务端)
协作方式:
SSMS 通过TDS协议与SQL Server通信
用户操作转换为T-SQL语句发送到服务端
SQL Server执行操作并返回结果
SSMS以可视化形式展示结果
可视化操作:数据库与表
Excel 类比理解
新建数据库步骤(SSMS)
右键"数据库" → 新建数据库
输入数据库名称(如
SchoolDB
)配置文件参数(可选)
点击"确定"
新建数据表步骤
展开数据库 → 右键"表" → 新建表
设计表结构:
列名(如
StudentID
,Name
)数据类型(如
int
,varchar(50)
)是否允许NULL
设置主键(右键列 → 设置主键)
保存表(命名如
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 用于筛选满足特定条件的记录
运算符示例
组合条件
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. 功能说明
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)
{
// 实现类似...
}
}
四、练习题:用户管理系统
任务要求
使用封装好的DbHelper类
实现以下功能:
用户注册
密码修改
用户删除
按性别查询用户
基础实现代码
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);
}