约束条件
在 SQL 中,我们有如下约束:
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。
- DEFAULT - 规定没有给列赋值时的默认值。
使用约束的语法:
1 | CREATE TABLE table_name |
NOT NULL
某列不能存储空值,默认时为NULL
1 | -- 实例 |
UNIQUE
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
- 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
对各个列进行设置UNIQUE约束
SQL Server / Oracle / MS Access:
添加多个UNIQUE可以实现多个列约束
1 | CREATE TABLE Persons |
另一种写法MySQL:
UNIQUE ()
中的列使用英文逗号隔开可以实现多个列UNIQUE约束
1 | CREATE TABLE Persons |
对多个列设置并重命名UNIQUE约束
MySQL / SQL Server / Oracle / MS Access:
如果不需要修改
1 | CREATE TABLE Persons |
说明
PRIMARY KEY
主键
- 唯一
- 非空
对各个列进行设置
1 | CREATE TABLE Persons |
另一种写法
PRIMARY KEY ()
中的列使用英文逗号隔开可以实现多个列的组合主键约束
1 | CREATE TABLE Persons |
对多个列设置并重命名约束
使用了``CONSTRAINT`进行了重命名
1 | CREATE TABLE Persons |
说明
- pk_PersonID为主键名可以自行设置。默认为PK_table_name,在此即:PK_Persons
FOREIGN KEY
一个表中的外键指向
另一个表
中的UNIQUE KEY
演示表格
“Persons” 表:
P_Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
“Orders” 表:
O_Id | OrderNo | P_Id |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 2 |
4 | 24562 | 1 |
请注意
“Persons” 表中的 “P_Id” 列是 “Persons” 表中的 PRIMARY KEY。
“Orders” 表中的 “P_Id” 列指向 “Persons” 表中的 “P_Id” 列。
“Orders” 表中的 “P_Id” 列是 “Orders” 表中的 FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
用法
SQL Server / Oracle / MS Access:
1 | CREATE TABLE Orders |
另一种写法
MySQL:
1 | CREATE TABLE Orders |
使用上面的写法默认约束名为:FK__Orders__P_Id__2F10007B (每个机器可能不一样)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
1 | CREATE TABLE Orders |
只定义多个列而不需要重命名则,删除则``CONSTRAINT fk_PerOrders`
1 | CREATE TABLE Orders |
CHECK
对各个列进行设置
SQL Server / Oracle / MS Access:
1 | CREATE TABLE Persons |
另一种写法
CHECK()中
的列,用英文逗号隔开可以实现同时对多个列进行设置约束
MySQL:
1 | CREATE TABLE Persons |
默认约束名格式:CK__Persons__36B12243(每台机器不一定相同)
对多个列设置并重命名约束
MySQL / SQL Server / Oracle / MS Access:
1 | CREATE TABLE Persons |
DEFAUT
My SQL / SQL Server / Oracle / MS Access:
1 | CREATE TABLE Persons |
- GETDATE() 插入当前日期和时间
- 更多函数请查阅sql server文档
1 | CREATE TABLE Orders |
WHERE子句
查询条件
查询条件 | 谓词 |
---|---|
比较 | =,<,>,>=,<=,!=,<>,!>,!<,NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件(逻辑运算) | AND,OR,NOT |
准备表数据
1 | create table student( |
比较
NOT
表示取反
查询性别为“男”的学生
1 | SELECT * FROM student WHERE ssex='男' |
查询学号小于105的学生
1 | SELECT * FROM student WHERE sno<105 |
确定范围
BETWEEN a AND b
表示在a和b之间,包括a和b
NOT
表示取反
查询学号在101到105之间的学生
1 | SELECT * FROM student WHERE sno BETWEEN 101 AND 105 |
确定集合
NOT
表示取反
查询学号为101、103、108的学生
1 | SELECT * FROM student WHERE sno IN (101,103,108) |
查询不在95031、95034班的学生
1 | SELECT * FROM student WHERE sclass NOT IN (95031,95034) |
字符匹配
NOT
表示取反
语法
1 | [NOT] LIKE pattern [ESCAPE escape_character] |
pattern模式
表示在列或表达式中搜索的字符序列。它可以包含以下有效通配符:
- 通配符百分比(
%
):任何零个或多个字符的字符串。 - 下划线(
_
)通配符:任何单个字符。 [list of characters]
通配符:指定集合中的任何单个字符。[character-character]
:指定范围内的任何单个字符。[^]
:不在列表或范围内的任何单个字符。
- 使用
ESCAPE
关键字定义转义符
案例
查询所有姓王的同学
1 | SELECT * FROM student WHERE sname LIKE '王%' |
涉及空值的查询
查询未参加考试的学生学号
1 | SELECT DISTINCT sno FROM score WHERE degree IS NULL |
- DISTINCT 表示去除重复值
多重条件查询
查询3-105课程成绩高于80的学生学号
1 | SELECT sno FROM score WHERE cno='3-105' AND degree>80 |