SQL Server 2005 查询语句基础教程
本教程将带你从零开始,学习如何使用 SQL Server 2005 的查询语句(T-SQL)来与数据库进行交互。

目录
- 准备工作
- T-SQL 简介
- 基础查询语句
SELECT- 选择数据FROM- 指定来源WHERE- 过滤数据ORDER BY- 排序结果DISTINCT- 去除重复项
- 进阶查询
AND/OR- 组合多个条件IN/NOT IN- 匹配列表中的值BETWEEN- 匹配一个范围内的值LIKE- 模糊查询IS NULL/IS NOT NULL- 查询空值
- 聚合函数
COUNT,SUM,AVG,MAX,MINGROUP BY- 分组数据HAVING- 过滤分组
- 多表查询
JOIN- 连接表INNER JOIN(内连接)LEFT JOIN/RIGHT JOIN(左/右连接)
- 数据修改
INSERT INTO- 插入数据UPDATE- 更新数据DELETE- 删除数据
- 总结与最佳实践
准备工作
在开始之前,你需要:
- 安装 SQL Server 2005:确保你的电脑上安装了 SQL Server 2005 实例(SQL Server 2005 Express Edition)。
- 安装 SQL Server Management Studio (SSMS):这是管理和查询 SQL Server 数据库的主要图形化工具。
- 创建一个示例数据库和表:为了方便练习,我们先创建一个简单的数据库和几张表。
创建数据库和表的示例脚本:
-- 创建一个名为 "MySchool" 的数据库
CREATE DATABASE MySchool;
GO
-- 使用刚创建的数据库
USE MySchool;
GO
-- 创建学生表
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName NVARCHAR(50),
Gender NVARCHAR(10),
Age INT,
ClassID INT
);
-- 创建班级表
CREATE TABLE Classes (
ClassID INT PRIMARY KEY,
ClassName NVARCHAR(50)
);
-- 向表中插入一些示例数据
INSERT INTO Students VALUES (1, '张三', '男', 20, 101);
INSERT INTO Students VALUES (2, '李四', '女', 21, 102);
INSERT INTO Students VALUES (3, '王五', '男', 20, 101);
INSERT INTO Students VALUES (4, '赵六', '女', 22, 103);
INSERT INTO Students VALUES (5, '孙七', '男', 21, 102);
INSERT INTO Classes VALUES (101, '计算机科学1班');
INSERT INTO Classes VALUES (102, '计算机科学2班');
INSERT INTO Classes VALUES (103, '软件工程1班');
GO
在 SSMS 中执行以上脚本,你就准备好了练习环境。
T-SQL 简介
T-SQL (Transact-SQL) 是 Microsoft 对 SQL 标准的扩展,它不仅包含标准的 SQL 语句,还增加了变量、流程控制、函数等编程特性,我们日常的数据库查询操作,绝大部分都是通过 T-SQL 完成的。

基础查询语句
这是最核心、最常用的查询结构。
SELECT 和 FROM
SELECT 语句用于从数据库中检索数据。
语法:
SELECT column1, column2, ... FROM table_name;
示例:

-- 查询所有学生的姓名和年龄 SELECT StudentName, Age FROM Students;
*使用 `` 查询所有列:**
-- 查询学生表的所有信息 SELECT * FROM Students;
注意:在生产环境中,尽量避免使用
SELECT *,因为它会增加不必要的网络传输,并且当表结构改变时,可能会导致应用程序出错,明确指定列名是更好的做法。
WHERE 子句
WHERE 子句用于过滤记录,只返回满足条件的行。
语法:
SELECT column1, column2, ... FROM table_name WHERE condition;
示例:
-- 查询所有年龄为 20 岁的学生 SELECT StudentName, Age FROM Students WHERE Age = 20; -- 查询所有姓 '张' 的学生 SELECT StudentName FROM Students WHERE StudentName LIKE '张%'; -- 我们将在后面详细讲解 LIKE -- 查询所有年龄大于 21 岁的男生 SELECT StudentName, Gender, Age FROM Students WHERE Age > 21 AND Gender = '男';
ORDER BY 子句
ORDER BY 子句用于对结果集进行排序,默认为升序 (ASC)。
语法:
SELECT column1, column2, ... FROM table_name WHERE condition ORDER BY column_name ASC|DESC;
示例:
-- 按年龄升序查询所有学生 SELECT StudentName, Age FROM Students ORDER BY Age; -- 按年龄降序查询所有学生 SELECT StudentName, Age FROM Students ORDER BY Age DESC; -- 先按班级ID升序,再按年龄降序 SELECT StudentName, ClassID, Age FROM Students ORDER BY ClassID ASC, Age DESC;
DISTINCT 关键字
DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT column1, column2, ... FROM table_name;
示例:
-- 查询所有不重复的班级ID SELECT DISTINCT ClassID FROM Students;
进阶查询
AND / OR
用于组合多个条件。
AND:所有条件都必须为真。OR:只要有一个条件为真即可。
示例:
-- 查询年龄为20岁且性别为男的学生 SELECT StudentName, Age, Gender FROM Students WHERE Age = 20 AND Gender = '男'; -- 查询年龄为20岁或21岁的学生 SELECT StudentName, Age FROM Students WHERE Age = 20 OR Age = 21;
IN / NOT IN
IN 允许你在 WHERE 子句中指定多个值。NOT IN 则相反。
示例:
-- 查询班级ID为101或103的学生 SELECT StudentName, ClassID FROM Students WHERE ClassID IN (101, 103); -- 查询班级ID不是101和103的学生 SELECT StudentName, ClassID FROM Students WHERE ClassID NOT IN (101, 103);
BETWEEN
用于选取介于两个值之间的数据范围(包含边界值)。
示例:
-- 查询年龄在20到22岁之间的学生(包含20和22) SELECT StudentName, Age FROM Students WHERE Age BETWEEN 20 AND 22;
LIKE
用于在 WHERE 子句中搜索列中的指定模式。
- 代表零个、一个或多个字符。
_:代表单个字符。
示例:
-- 查询所有姓 '张' 的学生 SELECT StudentName FROM Students WHERE StudentName LIKE '张%'; -- 查询名字中第二个字是 '四' 的学生 SELECT StudentName FROM Students WHERE StudentName LIKE '_四%';
IS NULL / `IS NOT NULL
用于查询值为 NULL(空值)或非 NULL 的记录。
重要:判断空值时,必须使用
IS NULL,而不能使用= NULL。
示例:
假设我们有一个 Email 列,有些学生可能没有填写邮箱。
-- 查询所有邮箱地址为空的学生 SELECT StudentName FROM Students WHERE Email IS NULL; -- 查询所有有邮箱地址的学生 SELECT StudentName FROM Students WHERE Email IS NOT NULL;
聚合函数
聚合函数对一组值执行计算,并返回单个值。
常用聚合函数
COUNT(*): 返回行数。COUNT(column): 返回指定列中非 NULL 值的个数。SUM(column): 返回数值列的总和。AVG(column): 返回数值列的平均值。MAX(column): 返回列中的最大值。MIN(column): 返回列中的最小值。
示例:
-- 统计学生总人数 SELECT COUNT(*) AS TotalStudents FROM Students; -- 计算所有学生的平均年龄 SELECT AVG(Age) AS AverageAge FROM Students; -- 找出年龄最大的学生 SELECT MAX(Age) AS MaxAge FROM Students;
GROUP BY 子句
GROUP BY 子句通常与聚合函数一起使用,将结果集按一个或多个列进行分组。
示例:
-- 按性别分组,统计每个性别的学生人数 SELECT Gender, COUNT(*) AS StudentCount FROM Students GROUP BY Gender;
HAVING 子句
HAVING 子句用于对 GROUP BY 分组后的结果进行过滤,它与 WHERE 类似,但 WHERE 是在分组前过滤行,而 HAVING 是在分组后过滤组。
示例:
-- 按班级ID分组,并筛选出学生人数大于2的班级 SELECT ClassID, COUNT(*) AS StudentCount FROM Students GROUP BY ClassID HAVING COUNT(*) > 2;
多表查询
在实际应用中,数据通常存储在不同的表中,我们需要通过 JOIN 操作将这些表连接起来获取完整信息。
INNER JOIN (内连接)
返回两个表中连接字段相匹配的行。
语法:
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
示例:
-- 查询所有学生的姓名和他们所在的班级名称 SELECT s.StudentName, c.ClassName FROM Students s INNER JOIN Classes c ON s.ClassID = c.ClassID;
提示:在
FROM子句中,可以为表名指定别名(如s代表Students,c代表Classes),这可以使查询语句更简洁。
LEFT JOIN (左连接)
返回左表(FROM 指定的表)中的所有行,以及右表中匹配的行,如果右表没有匹配,则结果中右表的列显示为 NULL。
示例:
-- 查询所有班级,并显示该班级下的学生(如果一个班级没有学生,也会显示出来) SELECT c.ClassName, s.StudentName FROM Classes c LEFT JOIN Students s ON c.ClassID = s.ClassID;
RIGHT JOIN (右连接)
与 LEFT JOIN 相反,返回右表中的所有行,以及左表中匹配的行。
注意:在 SQL Server 2005 中,
RIGHT JOIN可以通过交换LEFT JOIN的表来实现,因此使用频率相对较低。
数据修改
INSERT INTO - 插入数据
语法 1:插入完整的行
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
示例:
-- 向学生表中插入一条新记录 INSERT INTO Students (StudentID, StudentName, Gender, Age, ClassID) VALUES (6, '周八', '女', 19, 102);
语法 2:插入从其他表查询出的数据
INSERT INTO table_name (column1, column2, ...) SELECT column1, column2, ... FROM other_table WHERE condition;
UPDATE - 更新数据
语法:
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
警告:
UPDATE操作一定要加WHERE子句,否则会更新表中的所有行!
示例:
-- 将ID为1的学生年龄改为21岁 UPDATE Students SET Age = 21 WHERE StudentID = 1;
DELETE - 删除数据
语法:
DELETE FROM table_name WHERE condition;
警告:
DELETE操作也一定要加WHERE子句,否则会删除表中的所有行!
示例:
-- 删除ID为5的学生记录 DELETE FROM Students WHERE StudentID = 5;
总结与最佳实践
恭喜你!你已经掌握了 SQL Server 2005 最核心的查询语句。
回顾要点:
- 基础结构:
SELECT ... FROM ... WHERE ... ORDER BY - 精确查询:,
IN,BETWEEN - 模糊查询:
LIKE - 空值处理:
IS NULL - 组合条件:
AND,OR - 数据汇总:聚合函数 (
COUNT,SUM等) +GROUP BY+HAVING - 数据关联:
INNER JOIN,LEFT JOIN - 数据操作:
INSERT,UPDATE,DELETE(务必谨慎使用WHERE)
最佳实践:
- 注释:在复杂的 SQL 语句前加上注释,解释其用途。
- 格式化:保持代码的缩进和换行,使其易于阅读。
- *避免 `SELECT `**:始终明确指定你需要的列。
- 使用事务:对于多个相关的
UPDATE或INSERT操作,使用事务 (BEGIN TRANSACTION,COMMIT,ROLLBACK) 来保证数据的一致性。 - 性能考虑:对于大型表,确保
WHERE和JOIN的条件字段上有适当的索引。
虽然 SQL Server 2005 已经过时,但本教程中介绍的所有语法和概念在现代 SQL Server 中仍然完全适用,打好这个基础,你将能够轻松地学习和使用任何版本的 SQL Server 或其他关系型数据库系统。
