SQL 必知必会(4)——SQL进阶之子句、关键字和操作符

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 了解并掌握SQL约束的使用方法了解并掌握SQL索引的使用方法。

实验地址:https://developer.aliyun.com/adc/scenario/6499111331e849d69b4f10711ba77210?spm=a2c6h.26876520.0.i0.7cfe371c38BymX

1.什么是SQL约束?

SQL约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。约束可以在创建表时规定(通过CREATE TABLE语句),或者在表创建之后规定(通过ALTER TABLE语句)。

SQL的CREATE TABLE+CONSTRAINT语法。

CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);

在SQL中,我们有如下约束:

NOT NULL:指示某列不能存储NULL值。
UNIQUE:保证某列的每行必须有唯一的值。
PRIMARY KEY:NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY:保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK:保证列中的值符合指定的条件。
DEFAULT:规定没有给列赋值时的默认值。

2.NOT NULL约束

在默认的情况下,表的列接受NULL值。NOT NULL约束强制列不接受NULL值。NOT NULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

NOT NULL约束的示例:

执行如下SQL语句,在创建表Persons时强制ID列、LastName列和FirstName列不接受NULL值。

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Age int
);

image.png

添加NOT NULL约束的示例。

执行如下SQL语句,在一个已创建的Persons表的Age字段中添加NOT NULL约束。

ALTER TABLE Persons
MODIFY Age int NOT NULL;

image.png

删除NOT NULL约束的示例。

执行如下SQL语句,在一个已创建的Persons表的Age字段中删除NOT NULL约束。

ALTER TABLE Persons
MODIFY Age int NULL;
DROP TABLE Persons;

image.png

3.UNIQUE约束

UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARY KEY约束均为列或列集合提供了唯一性的保证。PRIMARY KEY约束拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束。

UNIQUE和PRIMARY KEY的区别:
UNIQUE(唯一约束)和PRIMARY KEY(主键)非常相似,但是UNIQUE允许字段中出现一次NULL值,而PRIMARY KEY不允许出现 NULL 值,因为可以认为:

PRIMARY KEY = UNIQUE +  NOT NULL

一张表可以包含多个UNIQUE字段,但是只能有一个主键。

CREATE TABLE时的UNIQUE约束示例:

在Mysql环境中:

执行如下SQL语句,创建Persons表时在P_Id列上创建UNIQUE约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
);

DROP TABLE Persons;

image.png

在SQL Server/Oracle/MS Access环境中:

CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法。
执行如下SQL语句,创建表Persons时在P_Id列和LastName列上创建UNIQUE约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
);

DROP TABLE Persons;

image.png

ALTER TABLE时的UNIQUE约束的示例:

当表已被创建时,在Persons表的P_Id列创建UNIQUE约束。

执行如下SQL语句,先创建Persons表,然后在Persons表的P_Id列创建UNIQUE约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

ALTER TABLE Persons
ADD UNIQUE (P_Id);

DROP TABLE Persons;

image.png

当表已被创建时,如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法。

执行如下SQL语句,先创建Persons表,然后在Persons表的P_Id列和LastName列创建UNIQUE约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName);

image.png

撤销UNIQUE约束的示例:
在Mysql环境中:

执行如下SQL语句,撤销UNIQUE约束。

ALTER TABLE Persons
DROP INDEX uc_PersonID;

DROP TABLE Persons;

image.png

在SQL Server/Oracle/MS Access环境中:

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID;

4.PRIMARY KEY约束

PRIMARY KEY约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含NULL值。每个表都应该有一个主键,并且每个表只能有一个主键。

CREATE TABLE时的PRIMARY KEY约束的示例:

执行如下SQL语句,在Persons表创建时在P_Id列上创建PRIMARY KEY约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);

DROP TABLE Persons;

image.png

在SQL Server/Oracle/MS Access环境中:

CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

如需命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面的SQL语法。

执行如下SQL语句,创建表Persons时在P_Id列和LastName列上创建PRIMARY KEY约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

DROP TABLE Persons;

image.png

ALTER TABLE时的SQL PRIMARY KEY约束的示例:

当表已被创建时,在表Persons的LastName列创建PRIMARY KEY约束。

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列创建PRIMARY KEY约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id);

DROP TABLE Persons;

image.png

当表已被创建时,如需命名PRIMARY KEY约束,并定义多个列的PRIMARY KEY约束,请使用下面的SQL语法。

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列和LastName列创建PRIMARY KEY约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName);

image.png

撤销PRIMARY KEY约束的示例:

在Mysql环境中:

执行如下SQL语句,撤销PRIMARY KEY约束。

ALTER TABLE Persons
DROP PRIMARY KEY;
DROP TABLE Persons;

image.png

在SQL Server/Oracle/MS Access环境中:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID;

5.FOREIGN KEY约束

一个表中的FOREIGN KEY指向另一个表中的UNIQUE KEY(唯一约束的键)。

FOREIGN KEY约束的原理:

假如我们有如下图两张表,Orders表中的P_Id列指向Persons表中的P_Id列。Persons表中的P_Id列是Persons表中的PRIMARY KEY。Orders表中的P_Id列是Orders表中的FOREIGN KEY。FOREIGN KEY约束用于预防破坏表之间连接的行为。FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

image.png

image.png

CREATE TABLE时的FOREIGN KEY约束的示例:

在Mysql环境中:

执行如下SQL语句,先创建Persons表,然后在表Persons的P_Id列和LastName列创建PRIMARY KEY约束。然后创建Orders表时在P_Id列上创建FOREIGN KEY约束。

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
);

DROP TABLE Orders;

image.png

在SQL Server/Oracle/MS Access环境中:

CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
);

如需命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法。

执行如下SQL语句,创建表Orders时在P_Id列上创建FOREIGN KEY约束。

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
);

DROP TABLE Orders;

image.png

ALTER TABLE 时的FOREIGN KEY约束的示例:

当Orders表已被创建时,如需在P_Id列创建FOREIGN KEY约束,请使用下面的 SQL。

执行如下SQL语句,先创建Orders表,然后在表Orders的P_Id列创建FOREIGN KEY约束。

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id)
);

  ALTER TABLE Orders
  ADD FOREIGN KEY (P_Id)
  REFERENCES Persons(P_Id);

DROP TABLE Orders;

image.png

如需命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法。

执行如下SQL语句,先创建Orders表,然后在表Orders的P_Id列创建FOREIGN KEY约束。

CREATE TABLE Orders
  (
  O_Id int NOT NULL,
  OrderNo int NOT NULL,
  P_Id int,
  PRIMARY KEY (O_Id)
  );

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id);

image.png

撤销FOREIGN KEY约束的示例:

在Mysql环境中:

执行如下SQL语句,撤销FOREIGN KEY约束。

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders;

DROP TABLE Orders;
DROP TABLE Persons;

image.png

在SQL Server/Oracle/MS Access环境中:

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders;
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
SQL中,可以使用 `ORDER BY` 子句来实现排序功能
【10月更文挑战第26天】SQL中,可以使用 `ORDER BY` 子句来实现排序功能
81 6
|
4月前
|
SQL 存储
如何在 SQL Server 中使用 `OUTPUT` 子句
【8月更文挑战第10天】
120 7
如何在 SQL Server 中使用 `OUTPUT` 子句
|
4月前
|
SQL 数据库
|
4月前
|
SQL 数据挖掘 关系型数据库
|
4月前
|
SQL
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
|
5月前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
56 1
|
5月前
|
SQL 数据库
SQL LIKE 操作符
【7月更文挑战第12天】SQL LIKE 操作符。
41 14
|
5月前
|
SQL Oracle 关系型数据库
SQL SELECT TOP 子句
【7月更文挑战第12天】SQL SELECT TOP 子句。
48 14
|
5月前
|
SQL 数据库
SQL BETWEEN 操作符
【7月更文挑战第14天】SQL BETWEEN 操作符。
46 10
|
5月前
|
SQL
SQL FULL OUTER JOIN 关键字
【7月更文挑战第17天】SQL FULL OUTER JOIN 关键字。
43 6