在数据库管理的领域中,SQL Server 是一款由微软开发的强大的关系型数据库管理系统,被广泛应用于各类企业级应用程序中。它支持结构化查询语言(SQL),并拥有自己的 T-SQL(Transact-SQL)实现。下面我将详细介绍 SQL Server 数据库的基本操作,希望能够帮助大家更好地理解和使用它。

目录

1. 数据库的创建与管理

1.1 创建数据库

1.2 修改数据库

1.3 删除数据库

2. 表的操作

2.1 创建表

2.2 修改表

2.3 删除表

3. 数据的插入、查询、更新与删除

3.1 插入数据

3.2 查询数据

3.3 更新数据

3.4 删除数据

4. 数据约束

4.1 主键约束(PRIMARY KEY)

4.2 外键约束(FOREIGN KEY)

4.3 唯一约束(UNIQUE)

4.4 检查约束(CHECK)

4.5 默认约束(DEFAULT)

5. 数据查询的进阶操作

5.1 排序(ORDER BY)

5.2 聚合函数

5.3 分组(GROUP BY)

5.4 连接查询

5.4.1 内连接(INNER JOIN)

5.4.2 左连接(LEFT JOIN)

5.4.3 右连接(RIGHT JOIN)

5.4.4 全连接(FULL JOIN)

6. 视图(VIEW)

7. 存储过程(STORED PROCEDURE)

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'研发部';

存储过程可以提高数据库操作的效率,减少网络传输开销,同时增强代码的可复用性和安全性。

Logo

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

更多推荐