【开篇】SQL 语句进阶篇-下

【1】SQL 约束
1、约束用于限制加入表的数据的类型。可以在创建表时规定约束(通过 create table 语句),也可以在表创建之后规定约束(通过 alter table 语句)。
2、主要有以下几种约束:
(1)not null
(2)unique
(3)primary key
(4)foreign key
(5)check
(6)default
【2】SQL NOT NULL 约束
1、not null 约束强制 列不接受 null 值,强制字段始终包含值,这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

2、下面的 sql 语句强制 “Id_P”、“LastName” 列不接受 null 值:

【3】SQL UNIQUE 约束
unique 约束唯一标识数据库表中的每条记录。unique 和 primary key 约束均为列或列集合提供了唯一性的保证。primary key 拥有自动定义的 unique 约束。
请注意:每个表可以有多个 unique 约束,但是每个表只能有一个 primary key 约束。
1、创建表时规定约束(create table)
在 “Persons” 表创建时,在 “Id_P” 列创建 unique 约束:

创建表时,如果需要命名 unique 约束,以及为多个列定义 unique 约束:

2、创建表后规定约束(alter table)
当 “Persons” 表已被创建后,在 “Id_P” 列创建 unique 约束:

创建表后,如果需要命名 unique 约束,以及为多个列定义 unique 约束:

3、撤销 unique 约束

【4】SQL PRIMARY KEY 约束
primary key 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值;主键列不能包含NULL值。
每个表都应该有一个主键,并且每个表只能有一个主键。
1、创建表时规定约束(create table)
在 “Persons” 表创建时,在 “Id_P” 列创建 primary key 约束:

创建表时,如果需要命名 primary key 约束,以及为多个列定义 primary key 约束:

2、创建表后规定约束(alter table)
当 “Persons” 表已被创建后,在 “Id_P” 列创建 primary key 约束:

创建表后,如果需要命名 primary key 约束,以及为多个列定义 primary key 约束:

3、撤销 unique 约束

【5】SQL FOREIGN KEY 约束
一个表中的 foreign key 指向另一个表中的 primary key。
foreign key 约束用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
1、创建表时规定约束(create table)
在 “Orders” 表创建时,在 “Id_P” 列创建 foreign key 约束:

创建表时,如果需要命名 foreign key 约束,以及为多个列定义 foreign key 约束:

2、创建表后规定约束(alter table)
当 “Orders” 表已被创建后,在 “Id_P” 列创建 foreign key 约束:

创建表后,如果需要命名 foreign key 约束,以及为多个列定义 foreign key 约束:

3、撤销 unique 约束

【6】SQL CHECK 约束
check 约束用于限制列中的值的范围。如果对单个列定义 check 约束,那么该列只允许特定的值。如果对一个表定义 check 约束,那么此约束会在特定的列中对值进行限制。
---- 注意 ----
MySQL所有的存储引擎均不支持check约束,MySQL会对check子句进行分析,但是在插入数据时会忽略,因此check并不起作用。

【7】SQL DEFAULT 约束
default 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新纪录。
1、创建表时规定约束(create table)
在 “Persons” 表创建时,在 “City” 列创建 default 约束:

结果如下:

2、创建表后规定约束(alter table)
当 “Persons” 表已被创建后,在 “City” 列创建 default 约束:

3、撤销 default 约束

【8】SQL CREATE INDEX 语句
create index 语句用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。用户无法看到索引,它们只能被用来加速搜索、查询。
注释:更新一个包含索引的表比更新一个没有索引的表需要更多的时间,这是由于索引本身也需要更新,因此,理想的做法是仅仅在常常被搜索的列/表上面创建索引。
1、create index 语法
在表上创建一个简单的索引,允许使用重复的值:
create index 索引名称 on 表名称(列名称);
注:列名称 即规定需要索引的列。
2、create unique index 语法
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值:
create unique index 索引名称 on 表名称(列名称);
3、降序索引某个列中的值
create index 索引名称 on 表名称(列名称 DESC);
4、create index 实例
(1)在 person1 表的 city 列创建一个简单的名为 personIndex 的索引:

(2)索引多个列时,用逗号隔开列名称:

【9】SQL DROP(撤销索引、表、数据库)
通过使用 drop 语句,可以轻松地删除索引、表、数据库。
1、drop index 语法
alter table 表名称 drop index 索引名称;
2、drop table 语法
drop table 表名称;
若仅仅删除表内的数据,而不删除表本身,可以使用 truncate table 命令:
truncate table 表名称;
3、drop databsae 语法
drop database 数据库名称;
4、实例

【10】SQL ALTER TABLE 语句
alter table 语句用于在已有的表中添加、修改、删除列。
1、alter table 语法
(1)在表中添加列:
alter table 表名称 add 列名称 数据类型;
(2)修改表中列的数据类型:
alter table 表名称 alter column 列名称 数据类型;
注意:在 MySQL 要用 modify 而不是 alter
alter table 表名称 modify column 列名称 数据类型;
(3)删除表中的列:
alter table 表名称 drop column 列名称;
2、实例
(1)在表 "persons12" 中添加一个名为 "Birthday" 的新列

注释:Birthday 列的数据类型是 date,可以存放日期。
(2)在表 "persons12" 中修改 "Birthday" 列的数据类型

注释:Birthday 列的数据类型是 year,可以存放2位或4位格式的年份。

(3)删除表 "person12" 中的 "Birthday" 列

【11】SQL AUTO INCREMENT 字段
auto-increment 会在新纪录插入表中时生成一个唯一的数字。若希望在每次插入新纪录时,自动地创建主键字段的值,可以在表中创建一个 auto-increment 字段。
MySQL使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
在创建 Persons 表时,把 P_Id 列定义为 auto-increment 主键:

要在 Persons 表中插入新纪录,不必为 P_Id 列规定值(会自动添加一个唯一的值):

默认地,AUTO_INCREMENT 的开始值是1,每条新纪录递增加1:

若要让 AUTO_INCREMENT序列以其他的值起始:

添加新记录时,P_Id 即可从指定的值开始:

【12】SQL VIEW(视图)
什么是视图?
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。
视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、where 语句、join 语句,也可以提交数据,就像这些来自于某个单一的表。
数据库的设计和结构不会受到视图中的函数、where 语句、join 语句的影响。
1、创建视图:create view
create view 视图名称 as select 列名称 from 表名称 where 条件;
---- 注释 ----
(1)视图总是显示最近的数据,每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
(2)可以从某个查询内部、某个存储过程内部、从另一个视图内部 来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。
从某个查询内部使用视图:

从另一个视图内部使用视图:

2、更新视图:create or replace view
create or replace view 视图名称 as select 列名称 from 表名称 where 条件;
更新 persons_view 视图:

3、撤销视图:drop view
drop view 视图名称;
删除 persons_view 视图:

【13】SQL Date 函数
当我们处理日期时,最燃的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。只要数据包含的只是日期部分,运行查询就不会出问题;但是,如果涉及时间,情况就有点复杂了。
1、SQL 日期
MySQL Date 函数

2、SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期 或 日期/时间值:
(1)date 格式:YYYY-MM-DD
(2)datetime 格式:YYYY-MM-DD HH:MM:SS
(3)timestamp 格式:YYYY-MM-DD HH:MM:SS
(4)year 格式:YYYY 或 YY
【14】SQL NULL 值
1、null 值
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 null 值保存。
null 值的处理方式与其他值不同,null 用作未知的或不适用的值的占位符。
无法比较 null 和 0,它们是不等价的。
2、null 值的处理

Address 和 City 是可选的,这两列插入一条不带值的记录,则会使用 null 值保存。
因为无法使用运算符(例如:=,>,< 等)来测试 null 值,所以若要测试 null 值,必须使用 is null 和 is not null 操作符。
3、is null
使用 is null 来查找 Address 列带有 null 值的记录:

4、is not null
使用 is not null 来查找 Address 列不带 null 值的记录:

【15】SQL NULL 函数
Products 表如下:

假如 UnitsOnOrder 是可选的,而且可以包含 null 值。
使用如下 select 语句,如果有 UnitsOnOrder 值是 null,那么结果是 null :
select ProductName,UnitPrice*(UnitsInstock+UnitsOnOrder) from Products;
SQL Server 和 MS Access 的 isnull() 函数、Oracle 的 nvl() 函数、MySQL 的 ifnull()函数和 coalesce() 函数 用于规定如何处理 null 值。
在这里,希望 null 值为 0 。如果 UnitsOnOrder 是 null ,则不利于计算,因此规定如果值是 null 则返回 0 。
SQL Server 和 MS Access 的 isnull() 函数
select ProductName,UnitPrice*(UnitsInStock+isnull(UnitsOnOrder,0)) from Products;
Oracle 的 nvl() 函数
select ProductName,UnitPrice*(UnitsInStock+nvl(UnitsOnOrder,0)) from Products;
MySQL 的 ifnull()函数
select ProductName,UnitPrice*(UnitsInStock+ifnull(UnitsOnOrder,0)) from Products;
MySQL 的 coalesce()函数
select ProductName,UnitPrice*(UnitsInStock+coalesce(UnitsOnOrder,0)) from Products;
【16】SQL 数据类型
在 MySQL 中,有三种主要的数据类型:文本类型、数字类型、日期/时间类型
(1)文本(Text)类型

(2)数字(Number)类型

(3)日期/时间(Date)类型

【17】SQL 服务器 - RDBMS
现代的 SQL 服务器构建在 RDBMS 之上。
DBMS - 数据库管理系统(Database Management System)
数据库管理系统是一种可以访问数据库中数据的计算机程序。
DBMS 使我们有能力在数据库中提取、修改或者存贮信息。
不同的 DBMS 提供不同的函数供查询、提交以及修改数据。
RDBMS - 关系数据库管理系统(Relational Database Management System)
关系数据库管理系统也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。
20世纪70年代初,IBM 公司发明了 RDBMS。RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如:Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。
- End -
若有错误,请随时指正。也欢迎大家一起讨论,让我们野蛮成长!
网友评论