SQL Server 数据库编程基础与常用语法详解

陆遥
陆遥
发布时间:2026-10-16 | 5人浏览过
原创

本文全面解析 SQL Server 基础编程,涵盖数据库与表的创建、各类数据类型的选用、字段与约束的管理,以及数据增删改查的实操语句,帮助快速掌握 T-SQL 核心技能。

批处理与数据库管理

在 SQL Server 中,GO 是一个用于将一组 Transact-SQL 语句作为一个批处理执行的指令,并非标准的 SQL 语句。它常用于在脚本中将逻辑分组分开执行。

第1步:使用或切换数据库

通过 USE 命令可以切换到目标数据库进行操作。

USE master;
GO

第2步:创建或删除数据库

建议在建库前先检查是否存在同名数据库,以避免重复报错。以下展示了几种不同复杂度的创建方式:

方法1:基本创建并指定路径

-- 判断是否存在该数据库,存在就删除
IF EXISTS (SELECT * FROM sys.databases WHERE name = 'testHome')
    DROP DATABASE testHome;
GO

-- 创建数据库,设置文件保存目录
CREATE DATABASE testHome
ON (
    NAME = 'testHome',
    FILENAME = 'c:\\data\\students.mdf'
)
LOG ON (
    NAME = 'testHome_log',
    FILENAME = 'c:\\data\\testHome_log.ldf'
);
GO

方法2:设置文件大小与增长率

IF EXISTS (SELECT * FROM sys.databases WHERE name = 'testHome')
    DROP DATABASE testHome;
GO

CREATE DATABASE testHome
ON PRIMARY (
    NAME = 'testHome_data',       -- 主数据文件逻辑名
    FILENAME = 'c:\\testHome_data.mdf', -- 物理文件名
    SIZE = 3MB,                  -- 初始大小
    MAXSIZE = 50MB,              -- 最大增长限制
    FILEGROWTH = 10%             -- 每次增长的百分比
)
LOG ON (
    NAME = 'testHome_log',
    FILENAME = 'c:\\testHome_log.ldf',
    SIZE = 1MB,
    FILEGROWTH = 1MB
);
GO

方法3:包含次数据文件与日志文件

当主数据文件空间不足时,可添加次要数据文件进行扩展,同时也可增加额外的日志文件以记录事务。

IF EXISTS (SELECT * FROM sys.databases WHERE name = 'testHome')
    DROP DATABASE testHome;
GO

CREATE DATABASE testHome
ON PRIMARY (
    NAME = 'testHome_data',
    FILENAME = 'c:\\testHome_data.mdf',
    SIZE = 3MB,
    MAXSIZE = 50MB,
    FILEGROWTH = 10%
),
( -- 次要数据文件
    NAME = 'testHome2_data',
    FILENAME = 'c:\\testHome2_data.mdf',
    SIZE = 2MB,
    MAXSIZE = 50MB,
    FILEGROWTH = 10%
)
LOG ON (
    NAME = 'testHome_log',
    FILENAME = 'c:\\testHome_log.ldf',
    SIZE = 1MB,
    FILEGROWTH = 1MB
),
( -- 额外日志文件
    NAME = 'testHome2_log',
    FILENAME = 'c:\\testHome2_log.ldf',
    SIZE = 1MB,
    FILEGROWTH = 1MB
);
GO

基本数据类型定义

合理选择数据类型是优化存储和性能的关键。SQL Server 支持多种分类的数据类型:

数值类型

  • 精确数字:
    • bigint:8字节,范围 -2^63 到 2^63-1,适用于超大数据量。
    • int:4字节,范围 -2^31 到 2^31-1,最常用整数类型。
    • smallint:2字节,范围较小。
    • tinyint:1字节,范围 0 到 255。
    • bit:存储 0、1 或 NULL,每8位占一个字节。
    • decimal / numeric:固定精度和小数位数的数值,适用于货币或高精度计算。
    • money / smallmoney:专用的货币数据类型。
  • 近似数字:
    • float:浮点数,范围极大但精度可能有微小误差。
    • real:SQL-92标准同义词,通常为 float(24)。

日期时间类型

  • datetime:覆盖 1753年1月1日 至 9999年12月31日,精度较高。
  • smalldatetime:范围较窄(1900年-2079年),精度较低。

字符与 Unicode 类型

  • 非 Unicode:char(定长)、varchar(变长,最大 2^31-1 字节)、text(已过时,但在旧版兼容)。
  • Unicode:nchar(定长,1-4000字符)、nvarchar(变长,最大 2^31-1 字节)、ntext(已弃用)。

二进制类型

  • binary / varbinary:固定或变长二进制数据,通常用于存储图片缩略图或非结构化数据。
  • image:大型二进制对象,建议改用 varbinary(max)。

对象管理与表结构维护

第3步:判断对象或列是否存在

在执行删除或修改前,检查对象存在性是编写健壮脚本的习惯。

-- 判断表是否存在
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'classes')
    PRINT '存在';
GO

-- 另一种写法,利用 object_id
IF OBJECT_ID('student', 'U') IS NOT NULL
    PRINT '存在';
GO

-- 判断特定列是否存在(使用 sys.columns)
IF EXISTS (
    SELECT * FROM sys.columns 
    WHERE object_id = OBJECT_ID('student') AND name = 'idCard'
)
BEGIN
    ALTER TABLE student DROP COLUMN idCard;
END
GO

第4步:创建与删除表

在创建表时,可以定义主键、自增列以及默认值。

-- 删除已存在的表
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'classes')
    DROP TABLE classes;
GO

-- 创建班级表
CREATE TABLE classes (
    id INT PRIMARY KEY IDENTITY(1, 2), -- 主键,从1开始,每次递增2
    name VARCHAR(22) NOT NULL,
    createDate DATETIME DEFAULT GETDATE()
);
GO

-- 创建学生表
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'student')
    DROP TABLE student;
GO

CREATE TABLE student (
    id INT IDENTITY(1, 1) NOT NULL,
    name VARCHAR(20),
    age INT,
    sex BIT,
    cid INT -- 班级ID,作为外键关联
);
GO

第5步:表结构的动态修改(字段与约束)

使用 ALTER TABLE 语句可以对现有表进行修改。建议在修改前再次确认字段存在性。

-- 添加新字段
ALTER TABLE student ADD address VARCHAR(50) NOT NULL;

-- 修改字段属性(注意:不能直接缩小长度如果里面已有更长数据)
ALTER TABLE student ALTER COLUMN address VARCHAR(20);

-- 删除字段
ALTER TABLE student DROP COLUMN number;

-- 批量添加多个字段
ALTER TABLE student
ADD address VARCHAR(22),
    tel VARCHAR(11),
    idCard VARCHAR(3);

-- 安全删除特定列的判断逻辑
IF EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('student') AND name = 'idCard')
    ALTER TABLE student DROP COLUMN idCard;
GO

第6步:完善约束管理

约束用于保证数据的完整性和一致性,包括主键、外键、唯一、检查和默认约束。

-- 添加带默认值的列
ALTER TABLE student
ADD createDate SMALLDATETIME NULL
CONSTRAINT createDate_def DEFAULT GETDATE() WITH VALUES;

-- 添加唯一约束
ALTER TABLE student ADD CONSTRAINT no_uk UNIQUE(number);

-- 添加主键约束
ALTER TABLE student ADD CONSTRAINT pk_id PRIMARY KEY(id);

-- 添加外键约束(假设 classes 表中有个 number 字段,或 id 字段)
ALTER TABLE student
ADD CONSTRAINT fk_cid FOREIGN KEY (cid) REFERENCES classes(id);

-- 添加检查约束(例如年龄限制)
ALTER TABLE student
ADD CONSTRAINT ck_age CHECK (age >= 15 AND age <= 50);

-- 添加布尔默认值(例如默认性别为女 1)
ALTER TABLE student
ADD CONSTRAINT sex_def DEFAULT 1 FOR sex;

-- 删除某个约束
ALTER TABLE student DROP CONSTRAINT no_uk;

数据操作(CRUD)

第7步:插入数据(Insert)

除了单行插入,还支持基于查询结果的插入和多行同时插入。

-- 单行插入,指名列名
INSERT INTO classes (name) VALUES ('1班');

-- 简写插入(需按列顺序提供所有值)
INSERT INTO classes VALUES ('2班', '2011-06-15');

-- 插入多条记录(使用 UNION ALL)
INSERT INTO student (name, age, sex, cid)
SELECT 'jack', 23, 1, 5 UNION ALL
SELECT 'tom', 24, 0, 3 UNION ALL
SELECT 'wendy', 25, 1, 3;

-- 基于其他表插入数据
INSERT INTO student
SELECT name, age, sex, cid FROM student WHERE name = 'tony';

第8步:查询与更新数据(Select & Update)

-- 基础查询
SELECT * FROM classes;

-- 带子查询的显示
SELECT *, (SELECT MAX(age) FROM student) AS max_age FROM student;

-- 更新数据
UPDATE student SET name = 'hoho', sex = 1 WHERE id = 1;

-- 删除特定数据
DELETE FROM student WHERE id = 1;

备份与辅助工具

表数据复制

使用 SELECT ... INTO 可以将查询结果直接存入一张新表中,常用于临时备份或生成副本。

-- 将 student 表的所有数据复制到新的 stu 表
SELECT * INTO stu FROM student;

-- 复制查询结果集到表
SELECT * INTO stu1 FROM (SELECT * FROM stu) t;

查看表结构信息

系统存储过程 sp_help 可以快速获取表的详细元数据,如索引、列信息和约束。

EXEC sp_help student;
EXEC sp_help classes;

以上就是 SQL Server 数据库编程基础的详细内容,更多关于 SQL Server 实操教程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表