SQL Server 数据库的基本操作
摘要:本文系统介绍了SQL Server数据库的基本操作,包括数据库创建与管理(创建/修改/删除)、表操作(创建/修改/删除)、数据增删改查(INSERT/SELECT/UPDATE/DELETE)、数据约束(主键/外键/唯一/检查/默认约束)、高级查询(排序/聚合/分组/连接)、视图创建及存储过程使用。通过具体代码示例,详细展示了每个操作的实现方法,如CREATETABLE、ALTER TABL
在数据库管理的领域中,SQL Server 是一款由微软开发的强大的关系型数据库管理系统,被广泛应用于各类企业级应用程序中。它支持结构化查询语言(SQL),并拥有自己的 T-SQL(Transact-SQL)实现。下面我将详细介绍 SQL Server 数据库的基本操作,希望能够帮助大家更好地理解和使用它。
目录
1. 数据库的创建与管理
1.1 创建数据库
在 SQL Server 中,我们可以使用CREATE DATABASE语句来创建一个新的数据库。例如,创建一个名为TestDB的数据库,代码如下:
CREATE DATABASE TestDB;
执行上述代码后,SQL Server 会在指定的存储位置创建一个新的数据库。通常,数据库文件包括主要数据文件(.mdf)和事务日志文件(.ldf)。在实际应用中,我们还可以通过更多参数来指定数据库的初始大小、增长方式等。例如:
CREATE DATABASE TestDB
ON PRIMARY
(
NAME = TestDB_data,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB.mdf',
SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 5MB
)
LOG ON
(
NAME = TestDB_log,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 1MB
);
这段代码详细指定了主要数据文件和事务日志文件的名称、存储路径、初始大小、最大大小以及增长幅度。通过合理设置这些参数,可以优化数据库的性能和存储管理。
1.2 修改数据库
有时候,我们需要对已创建的数据库进行修改,比如更改数据库名称、增加数据文件等。要更改数据库名称,可以使用ALTER DATABASE语句。假设我们要将TestDB改名为NewTestDB,代码如下:
ALTER DATABASE TestDB
MODIFY NAME = NewTestDB;
如果要向数据库中添加一个新的数据文件,可以使用以下代码:
ALTER DATABASE NewTestDB
ADD FILE
(
NAME = NewTestDB_data2,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\NewTestDB2.ndf',
SIZE = 5MB,
MAXSIZE = 20MB,
FILEGROWTH = 2MB
)
TO FILEGROUP PRIMARY;
这段代码在NewTestDB数据库的主文件组中添加了一个新的数据文件NewTestDB2.ndf,并设置了其相关属性。
1.3 删除数据库
当一个数据库不再需要时,我们可以使用DROP DATABASE语句将其删除。例如,删除NewTestDB数据库,代码如下:
DROP DATABASE NewTestDB;
需要注意的是,删除数据库操作是不可逆的,在执行此操作前,请确保数据库中的数据已备份或不再需要。
2. 表的操作
2.1 创建表
表是数据库中存储数据的基本结构。在 SQL Server 中,使用CREATE TABLE语句创建表。例如,在TestDB数据库中创建一个名为Employees的表,包含EmployeeID(员工 ID)、EmployeeName(员工姓名)、Age(年龄)和Department(部门)字段,代码如下:
USE TestDB;
CREATE TABLE Employees
(
EmployeeID INT PRIMARY KEY,
EmployeeName NVARCHAR(50) NOT NULL,
Age INT,
Department NVARCHAR(50)
);
在这段代码中,EmployeeID字段被设置为主键,这意味着该字段的值在表中必须是唯一的,并且不能为空。EmployeeName字段设置为NOT NULL,表示该字段必须有值。
2.2 修改表
表创建后,如果业务需求发生变化,我们可能需要修改表的结构。例如,向Employees表中添加一个新的字段Salary(工资),可以使用ALTER TABLE语句:
ALTER TABLE Employees
ADD Salary DECIMAL(10, 2);
如果要修改某个字段的数据类型,比如将Age字段的数据类型从INT改为SMALLINT,代码如下:
ALTER TABLE Employees
ALTER COLUMN Age SMALLINT;
注意,修改字段数据类型时,要确保现有数据能够兼容新的数据类型,否则可能会导致数据丢失或错误。
2.3 删除表
当一个表不再使用时,可以使用DROP TABLE语句将其删除。例如,删除Employees表,代码如下:
DROP TABLE Employees;
同样,删除表操作也是不可逆的,执行前需谨慎确认。
3. 数据的插入、查询、更新与删除
3.1 插入数据
向表中插入数据使用INSERT INTO语句。例如,向Employees表中插入一条员工记录,代码如下:
INSERT INTO Employees (EmployeeID, EmployeeName, Age, Department, Salary)
VALUES (1, N'张三', 30, N'研发部', 5000.00);
如果要插入多条记录,可以使用以下方式:
INSERT INTO Employees (EmployeeID, EmployeeName, Age, Department, Salary)
VALUES
(2, N'李四', 35, N'市场部', 6000.00),
(3, N'王五', 28, N'财务部', 5500.00);
3.2 查询数据
查询数据是数据库操作中最常用的操作之一,使用SELECT语句。例如,查询Employees表中的所有员工信息,代码如下:
SELECT * FROM Employees;
如果只查询特定字段,比如只查询员工姓名和部门,代码如下:
SELECT EmployeeName, Department FROM Employees;
还可以使用WHERE子句来过滤数据。例如,查询年龄大于 30 岁的员工信息:
SELECT * FROM Employees
WHERE Age > 30;
3.3 更新数据
更新表中的数据使用UPDATE语句。例如,将员工张三的工资提高 10%,代码如下:
UPDATE Employees
SET Salary = Salary * 1.1
WHERE EmployeeName = N'张三';
3.4 删除数据
删除表中的数据使用DELETE语句。例如,删除Employees表中年龄大于 50 岁的员工记录,代码如下:
DELETE FROM Employees
WHERE Age > 50;
4. 数据约束
4.1 主键约束(PRIMARY KEY)
主键约束用于确保表中某一列或多列的组合的值是唯一且非空的。在创建表时,可以直接指定主键约束,如前面创建Employees表时,将EmployeeID设置为主键:
CREATE TABLE Employees
(
EmployeeID INT PRIMARY KEY,
EmployeeName NVARCHAR(50) NOT NULL,
Age INT,
Department NVARCHAR(50)
);
也可以在表创建后,通过ALTER TABLE语句添加主键约束:
ALTER TABLE Employees
ADD CONSTRAINT PK_Employees_EmployeeID PRIMARY KEY (EmployeeID);
4.2 外键约束(FOREIGN KEY)
外键约束用于建立两个表之间的关联关系。假设我们有另一个表Departments,用于存储部门信息,包含DepartmentID(部门 ID)和DepartmentName(部门名称)字段。现在要在Employees表中建立与Departments表的关联,即Employees表中的Department字段引用Departments表中的DepartmentID字段。首先创建Departments表:
CREATE TABLE Departments
(
DepartmentID INT PRIMARY KEY,
DepartmentName NVARCHAR(50)
);
然后在Employees表中添加外键约束:
ALTER TABLE Employees
ADD CONSTRAINT FK_Employees_Departments
FOREIGN KEY (Department) REFERENCES Departments (DepartmentID);
4.3 唯一约束(UNIQUE)
唯一约束确保表中某一列的值是唯一的,但可以为空。例如,在Employees表中,我们希望EmployeeName字段的值是唯一的(假设业务上要求员工姓名不能重复),可以添加唯一约束:
ALTER TABLE Employees
ADD CONSTRAINT UQ_Employees_EmployeeName UNIQUE (EmployeeName);
4.4 检查约束(CHECK)
检查约束用于限制表中某一列的值必须满足特定的条件。例如,在Employees表中,我们希望Age字段的值在 18 到 60 之间,可以添加检查约束:
ALTER TABLE Employees
ADD CONSTRAINT CK_Employees_Age
CHECK (Age >= 18 AND Age <= 60);
4.5 默认约束(DEFAULT)
默认约束为表中的某一列提供默认值。例如,在Employees表中,当插入新员工记录时,如果没有指定Salary字段的值,我们希望其默认值为 3000.00,可以添加默认约束:
ALTER TABLE Employees
ADD CONSTRAINT DF_Employees_Salary
DEFAULT 3000.00 FOR Salary;
5. 数据查询的进阶操作
5.1 排序(ORDER BY)
使用ORDER BY子句可以对查询结果进行排序。例如,按照员工年龄从大到小的顺序查询Employees表中的员工信息,代码如下:
SELECT * FROM Employees
ORDER BY Age DESC;
如果要按照多个字段排序,比如先按照部门升序,再按照年龄降序,可以这样写:
SELECT * FROM Employees
ORDER BY Department ASC, Age DESC;
5.2 聚合函数
聚合函数用于对一组数据进行计算,并返回一个单一的值。常见的聚合函数有SUM(求和)、AVG(求平均值)、COUNT(计数)、MAX(求最大值)和MIN(求最小值)。例如,计算Employees表中所有员工的工资总和,代码如下:
SELECT SUM(Salary) AS TotalSalary
FROM Employees;
计算员工的平均年龄:
SELECT AVG(Age) AS AverageAge
FROM Employees;
统计员工数量:
SELECT COUNT(*) AS EmployeeCount
FROM Employees;
5.3 分组(GROUP BY)
GROUP BY子句用于将查询结果按照一个或多个字段进行分组。例如,统计每个部门的员工数量,代码如下:
SELECT Department, COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY Department;
在使用GROUP BY子句时,通常会结合聚合函数一起使用,以便对每个分组进行计算。同时,还可以使用HAVING子句对分组后的结果进行过滤。例如,查询员工数量大于 2 的部门,代码如下:
SELECT Department, COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY Department
HAVING COUNT(*) > 2;
5.4 连接查询
连接查询用于从多个相关表中检索数据。常见的连接类型有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。
5.4.1 内连接(INNER JOIN)
内连接返回两个表中满足连接条件的所有行。假设我们要查询每个员工所在的部门名称,需要将Employees表和Departments表进行内连接,代码如下:
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.Department = Departments.DepartmentID;
5.4.2 左连接(LEFT JOIN)
左连接返回左表(在LEFT JOIN关键字左边的表)中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则结果集中对应的列值为NULL。例如,查询所有员工及其所在部门信息,即使某个员工没有对应的部门(假设Employees表中可能存在未分配部门的员工),代码如下:
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments
ON Employees.Department = Departments.DepartmentID;
5.4.3 右连接(RIGHT JOIN)
右连接与左连接相反,返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则结果集中对应的列值为NULL。例如,查询所有部门及其包含的员工信息,即使某个部门没有员工,代码如下:
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments
ON Employees.Department = Departments.DepartmentID;
5.4.4 全连接(FULL JOIN)
全连接返回左表和右表中的所有行。如果某一行在另一个表中没有匹配的行,则结果集中对应的列值为NULL。例如:
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
FULL JOIN Departments
ON Employees.Department = Departments.DepartmentID;
6. 视图(VIEW)
视图是一个虚拟表,它基于一个或多个表的查询结果。视图并不实际存储数据,而是在查询时动态生成结果。创建视图使用CREATE VIEW语句。例如,创建一个视图EmployeeView,用于查询员工姓名、部门名称和工资信息,代码如下:
CREATE VIEW EmployeeView AS
SELECT Employees.EmployeeName, Departments.DepartmentName, Employees.Salary
FROM Employees
INNER JOIN Departments
ON Employees.Department = Departments.DepartmentID;
创建好视图后,就可以像查询普通表一样查询视图。例如:
SELECT * FROM EmployeeView;
视图的好处在于可以简化复杂的查询,对用户隐藏底层表的结构细节,同时提高数据的安全性和可维护性。
7. 存储过程(STORED PROCEDURE)
存储过程是一组预先编译好的 SQL 语句,存储在数据库中,可以通过名称进行调用。存储过程可以接受参数、执行一系列操作,并返回结果。创建存储过程使用CREATE PROCEDURE语句。例如,创建一个存储过程GetEmployeesByDepartment,用于根据部门名称查询员工信息,代码如下:
CREATE PROCEDURE GetEmployeesByDepartment
@DepartmentName NVARCHAR(50)
AS
BEGIN
SELECT * FROM Employees
WHERE Department = @DepartmentName;
END;
调用存储过程时,使用EXEC语句:
EXEC GetEmployeesByDepartment @DepartmentName = N'研发部';
存储过程可以提高数据库操作的效率,减少网络传输开销,同时增强代码的可复用性和安全性。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)