SQL Server 2005 查询语句基础教程

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

sql 2005查询语句教程
(图片来源网络,侵删)

目录

  1. 准备工作
  2. T-SQL 简介
  3. 基础查询语句
    • SELECT - 选择数据
    • FROM - 指定来源
    • WHERE - 过滤数据
    • ORDER BY - 排序结果
    • DISTINCT - 去除重复项
  4. 进阶查询
    • AND / OR - 组合多个条件
    • IN / NOT IN - 匹配列表中的值
    • BETWEEN - 匹配一个范围内的值
    • LIKE - 模糊查询
    • IS NULL / IS NOT NULL - 查询空值
  5. 聚合函数
    • COUNT, SUM, AVG, MAX, MIN
    • GROUP BY - 分组数据
    • HAVING - 过滤分组
  6. 多表查询
    • JOIN - 连接表
    • INNER JOIN (内连接)
    • LEFT JOIN / RIGHT JOIN (左/右连接)
  7. 数据修改
    • INSERT INTO - 插入数据
    • UPDATE - 更新数据
    • DELETE - 删除数据
  8. 总结与最佳实践

准备工作

在开始之前,你需要:

  1. 安装 SQL Server 2005:确保你的电脑上安装了 SQL Server 2005 实例(SQL Server 2005 Express Edition)。
  2. 安装 SQL Server Management Studio (SSMS):这是管理和查询 SQL Server 数据库的主要图形化工具。
  3. 创建一个示例数据库和表:为了方便练习,我们先创建一个简单的数据库和几张表。

创建数据库和表的示例脚本:

-- 创建一个名为 "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 完成的。

sql 2005查询语句教程
(图片来源网络,侵删)

基础查询语句

这是最核心、最常用的查询结构。

SELECTFROM

SELECT 语句用于从数据库中检索数据。

语法:

SELECT column1, column2, ...
FROM table_name;

示例:

sql 2005查询语句教程
(图片来源网络,侵删)
-- 查询所有学生的姓名和年龄
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 代表 Studentsc 代表 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 最核心的查询语句。

回顾要点:

  1. 基础结构SELECT ... FROM ... WHERE ... ORDER BY
  2. 精确查询:, IN, BETWEEN
  3. 模糊查询LIKE
  4. 空值处理IS NULL
  5. 组合条件AND, OR
  6. 数据汇总:聚合函数 (COUNT, SUM 等) + GROUP BY + HAVING
  7. 数据关联INNER JOIN, LEFT JOIN
  8. 数据操作INSERT, UPDATE, DELETE (务必谨慎使用 WHERE)

最佳实践:

  • 注释:在复杂的 SQL 语句前加上注释,解释其用途。
  • 格式化:保持代码的缩进和换行,使其易于阅读。
  • *避免 `SELECT `**:始终明确指定你需要的列。
  • 使用事务:对于多个相关的 UPDATEINSERT 操作,使用事务 (BEGIN TRANSACTION, COMMIT, ROLLBACK) 来保证数据的一致性。
  • 性能考虑:对于大型表,确保 WHEREJOIN 的条件字段上有适当的索引。

虽然 SQL Server 2005 已经过时,但本教程中介绍的所有语法和概念在现代 SQL Server 中仍然完全适用,打好这个基础,你将能够轻松地学习和使用任何版本的 SQL Server 或其他关系型数据库系统。