SQLServer数据库约束与简单查询全解析
立即解锁
发布时间: 2025-08-17 00:53:09 阅读量: 1 订阅数: 2 

# SQL Server数据库约束与简单查询全解析
## 1. 数据库完整性约束
### 1.1 唯一性约束(UNIQUE)
唯一性约束可以确保表中除主键之外的列具有唯一值。它与主键约束类似,但有两个重要区别:
- 主键约束的列不能包含NULL值,而唯一性约束的列可以有一行包含NULL值(若同一列有两行NULL值,则违反唯一性约束)。
- 一个表只能有一个主键约束,但可以有多个唯一性约束。
创建现有SQL Server表中列的唯一性约束的步骤如下:
1. 使用SQL Server Management Studio,右键单击表并从弹出菜单中选择“设计”,以设计视图打开表。
2. 从表设计器下拉菜单中选择“索引/键”,会打开“索引/键”窗口。
3. 点击“添加”按钮创建新键。
4. 点击“类型”属性,将值从“索引”更改为“唯一键”。
5. 点击“列”属性旁边的省略号(...),选择要包含在唯一性约束中的列。也可以更改键的名称,推荐使用命名约定UK_name(用于唯一键)来识别约束。
6. 点击“关闭”按钮。
7. 从“文件”菜单中选择“保存”以保存新约束。
### 1.2 外键约束(FOREIGN KEY)
数据库表通常包含相关信息。例如,在一个零售商店数据库中,有一个表包含公司拥有的每个商店的信息,还有一个员工表包含公司每个员工的信息。在员工记录中包含雇佣该员工的商店信息是合理的。可以通过在员工表中创建一个Unit_Number字段来实现,该字段包含员工所在商店的Unit_Number(商店表的主键),从而在两个表之间建立链接。
但这样做可能会带来问题。如果一家商店关闭,与该商店关联的所有员工将成为“孤立”员工,因为他们关联的Unit_Number不存在。同样,如果在创建表时没有使用业务逻辑,数据录入员可能会因误输入员工的Unit_Number而创建一个孤立员工。
这些问题被称为引用完整性问题,SQL Server提供外键约束来防止这些问题的发生。外键通过将一个表中的外键与引用表中的主键(或任何其他唯一键)链接起来,在两个表之间创建关系。
创建外键约束的步骤如下:
1. 使用SQL Server Management Studio,右键单击将包含外键的表并从弹出菜单中选择“设计”,以设计视图打开表。
2. 从表设计器下拉列表中选择“索引/键”,打开“外键关系”窗口。
3. 点击“添加”按钮创建新的外键约束。
4. 点击“表和列规范”属性旁边的省略号(...),打开“表和列”窗口。
5. 在“主键表”下拉列表中选择外键引用的表。
6. 从主键表名称和外键表名称下方网格中的下拉列表中选择主键涉及的列名称。
7. 点击“确定”关闭“表和列”窗口。
8. 点击“关闭”关闭“外键关系”窗口。
9. 从“文件”菜单中选择“保存”以保存新约束。
创建外键关系后,SQL Server要求外键表中与约束关联的所有值在主键表中有对应值,但不要求主键表中的所有值在外键表中有对应值。此外,外键表中可能有多个值引用主键表中的同一记录。
## 2. 简单数据库查询
### 2.1 SELECT语句检索数据
SQL中用于从数据库中检索数据的命令是SELECT语句。它的基本形式很简单,类似于英语句子。要编写一个正确的SELECT查询,只需确定三件事:
- 要检索的列。
- 要从中检索列的表。
- 数据必须满足的条件(如果有)。
例如,要从学校数据库中检索可能符合男子曲棍球队资格的学生名单,只对男学生感兴趣,并且只包括姓名和电话号码,SQL语句如下:
```sql
SELECT first_name, last_name, phone
FROM students
WHERE gender = 'male'
```
查询结果如下:
```
first_name last_name phone
--------------- --------------- ---------------
Richard Jones 574-555-0125
Matthew Jones 574-555-0125
Christopher Murphy 574-555-8224
Mike Abrams 574-555-1925
Edward Sorin 574-555-1902
(5 row(s) affected)
```
执行SELECT查询时,SQL Server会报告受查询影响的行数。如果不想让SQL Server生成此摘要报告,可以使用以下SQL命令:
```sql
SET NOCOUNT ON
```
若要恢复默认行为,使用以下命令:
```sql
SET NOCOUNT OFF
```
### 2.2 SELECT…FROM子句
SELECT语句的前两个组件(要检索的列和包含这些列的表)出现在SELECT…FROM子句中。
- 如果要选择单个列,只需在SELECT和FROM关键字之间键入列名。
- 如果要包含多个列,用逗号分隔列名。
- 也可以用星号(*)代替列列表来检索数据库表的所有列。
例如,要检索学生表的所有列,可以使用以下简单查询:
```sql
SELECT *
FROM students
```
查询结果如下:
```
first_name last_name student_id phone gender
------------ ------------ ----------- ------------- ------
Richard Jones 1 574-555-0125 male
Matthew Jones 2 574-555-0125 male
Christopher Murphy 3 574-555-8224 male
Renee Smith 4 574-555-9201 female
Mike Abrams 5 574-555-1925 male
Edward Sorin 6 574-555-1902 male
Mary Keenan 7 574-555-9889 female
Susan Davis 8 574-555-9124 female
(8 row(s) affected)
```
### 2.3 WHERE子句
WHERE子句允许你指定要从SELECT…FROM子句中确定的表中检索的数据类型。可以包含结果集中每一行必须满足的条件。
例如,要找出学校中所有姓Jones的学生,可以使用以下SQL语句:
```sql
SELECT first_name, last_name
FROM students
WHERE last_name = 'Jones'
```
查询结果如下:
```
first_name last_name
--------------- ---------------
Richard Jones
Matthew Jones
(2 row(s) affected)
```
### 2.4 组合多个条件
WHERE子句中可以包含多个条件。例如,要找出学校中是男性且是前五个入学的学生(即student_id小于或等于5),可以使用AND关键字连接这些条件:
```sql
SELECT *
FROM students
WHERE gender = 'male' AND student_id <= 5
```
查询结果如下:
```
first_name last_name studen
```
0
0
复制全文
相关推荐









