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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 了解并掌握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;
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
54 0
|
7月前
11SQL - distinct关键字
11SQL - distinct关键字
22 1
|
7月前
|
SQL Java 数据库连接
MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射
MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射
181 0
|
6天前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
|
7月前
|
SQL
09SQL - order by关键字
09SQL - order by关键字
25 0
|
6天前
|
SQL XML Java
【JavaEE进阶】 MyBatis之动态SQL
【JavaEE进阶】 MyBatis之动态SQL
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
34 0
|
6天前
|
SQL 关系型数据库 MySQL
MySQL数据库进阶-SQL优化
MySQL性能分析、SQL优化方案
74 1
|
6天前
|
SQL 数据库
SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。
71 0
|
6天前
|
SQL 数据库
SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用。
80 0