导图社区 SQL入门及实操
自学SQL必备的知识大全,作为自学者精心整理,真的有用!希望对大家有所帮助~
编辑于2023-01-19 15:26:53 北京市SQL入门及实操
SQL定义
Structured Query Language 结构化查询语言
相关知识点
数据库系统(Database System,DBS)
一个完整的数据库系统一般由数据库、数据库管理系统、应用开发工具、应用系统、数据库管理员和用户组成
构成
硬件
硬件主要用于存储数据库中的数据,包括计算机、存储设备等
软件
软件部分主要包括数据库管理系统、支持数据库管理系统运行的操作系统,以及支持多种语言进行应用开发的访问技术等
3大组成部分
数据库(DataBase,DB)
提供了一个存储空间来存储各种数据,可以将数据库视为一个存储数据的容器
数据库由若干张表(Table)组成
一个数据库可能包含许多文件,一个数据库系统中通常包含许多数据库
数据库管理系统(Database Management System,DBMS)
是用户创建、管理和维护数据库时所使用的软件,位于用户和操作系统之间,对数据库进行统一管理
能定义数据存储结构,提供数据的操作机制,维护数据库的安全性、完整性和可靠性
功能
数据定义功能
提供数据定义语言(Data Definition Language,DDL)
数据操纵功能
提供数据操纵语言(Data Manipulation Language,DML)
数据库的运行管理
提供方便、有效地存取数据库信息的接口和工具
数据库的建立和维护功能
数据库应用程序(DataBase Application)
满足对数据管理的更高要求,使数据管理过程更加直观和友好
数据库应用程序负责与 DBMS 进行通信、访问和管理 DBMS 中存储的数据,允许用户插入、修改、删除数据库中的数据
数据库种类
层次数据库(Hierarchical Database,HDB)
最早研制成功的数据库系统,把数据通过层次结构(树形结构)的方式表现出来,现在已经很少使用了
代表性的层次数据库是 IMS(Information Management System)数据库,由 IBM 公司研制成功
关系型数据库(Relational Database,RDB)
现在应用最广泛的数据库。和 Excel 工作表一样,关系型数据库也采用由行和列组成的二维表来管理数据,同时还使用 SQL(Structured Query Language,结构化查询语言)对数据进行操作
代表性的关系型数据库有 Oracle Database、SQL Server、DB2、PostgreSQL、MySQL
面向文档(Document-Oriented)数据库
将数据以文档的形式存储。每个文档都是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象
数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储
代表性的面向文档数据库有 MongDB 和 CouchDB
列存储(Column-oriented)数据库
将数据存储存在列族(column family)中,一个列族用来存储经常被一起查询的相关数据
列存储数据库通常用来应对分布式存储的海量数据
代表性的列存储数据库有 Cassandra 和 HBase
XML 数据库(XML Database,XMLDB)
一种支持对 XML(标准通用标记语言下的一个应用)格式文档进行存储和查询等操作的数据管理系统
键值存储数据库(Key-Value Store,KVS)
用来保存查询所使用的主键(Key)和值(Value)的组合的数据库
代表性的键值存储数据库有 Redis、Memcached 和 MemcachedDB
SQL和数据库关系
现代的 SQL 服务器构建在 RDBMS 之上
RDBMS - 关系数据库管理系统(Relational Database Management System)
一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的
20 世纪 70 年代初,IBM 公司发明了 RDBMS
RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础
在客户端写SQL语句,服务端数据库处理反馈结果
规则与规范
基本规则
SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
每条命令以 ; 或 \g 或 \G 结束
关键字不能被缩写也不能分行
标点符号规则
必须保证所有的()、单引号、双引号是成对结束的
必须使用英文状态下的半角输入方式
字符串型和日期时间类型的数据可以使用单引号(’ ')表示
列的别名,尽量使用双引号(" "),而且不建议省略as
空格用法
SQL语句中不允许出现空行
SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、 比较运算符(=、<=< span="">、>=、>、<< span="">、<>、BETWEEN AND)、IN、LIKE等运算符前后都应加一空格
逗号之后必须接一个空格
关键字、保留字和左括号之间必须有一个空格
缩进与换行
sql语句中的关键字右对齐
select/from/where/order by/group by等子句应独占一行
select子句内容如果只有一项,应与 select 同占一行
select子句内容如果多于一项,每一项都应独占一行,并在对应 select的基础上向右缩进8个字符
from子句内容如果只有一项,应与 from同占一行
from子句内容如果多于一项,每一项都应独占一行,并在对应from的基础上向右缩进4个字符
where子句内容如果只有一项,应与 where同占一行
where子句的条件如果有多项,每一个条件应独占一行,并以and开头,并在对应where的基础上向右缩进4个字符
update set子句内容每一项单独占一行,无缩进
insert子句内容每个表字段单独占一行,无缩进;values每一项单独占一行,无缩进
大小写规范
环境及大小写区别
MySQL 在 Windows 环境下是大小写不敏感的
MySQL 在 Linux 环境下是大小写敏感的
数据库名、表名、表的别名、变量名是严格区分大小写的
关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
推荐采用统一的书写规范:
数据库名、表名、表别名、字段名、字段别名等都小写
SQL 关键字、函数名、绑定变量等都大写
命名规则
数据库、表名不得超过30个字符,变量名限制为29个
必须只能包含 A–Z, a–z, 0–9, _共63个字符
数据库名、表名、字段名等对象名中间不要包含空格
同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名同一个表中,字段不能重名
必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使 用`(着重号)引起来
保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据 类型在一个表里是整数,那在另一个表里可就别变成字符型了
子句的执行顺序
查询执行顺序(并非写入顺序)
1.FROM 和 JOINs
FROM 或 JOIN会第一个执行,确定一个整体的数据范围. 如果要JOIN不同表,可能会生成一个临时Table来用于 下面的过程。总之第一步可以简单理解为确定一个数据源表(含临时表)
2. WHERE
我们确定了数据来源 WHERE 语句就将在这个数据源中按要求进行数据筛选,并丢弃不符合要求的数据行,所有的筛选col属性 只能来自FROM圈定的表. AS别名还不能在这个阶段使用,因为可能别名是一个还没执行的表达式
3. GROUP BY
如果你用了 GROUP BY 分组,那GROUP BY 将对之前的数据进行分组,统计等,并将是结果集缩小为分组数.这意味着 其他的数据在分组后丢弃
4. HAVING
如果你用了 GROUP BY 分组, HAVING 会在分组完成后对结果集再次筛选。AS别名也不能在这个阶段使用
5. SELECT
确定结果之后,SELECT用来对结果col简单筛选或计算,决定输出什么数据
6. DISTINCT
如果数据行有重复DISTINCT 将负责排重
7. ORDER BY
在结果集确定的情况下,ORDER BY 对结果做排序。因为SELECT中的表达式已经执行完了。此时可以用AS别名
8. LIMIT / OFFSET
最后 LIMIT 和 OFFSET 从排序的结果中截取部分数据
语句和子句的关系
三种常见的sql语句是 SELECT , UPDATE ,和 DELETE
语句是一段可以独立运行的完整代码, 语句由子句组成
Eg
对于一个 SELECT ,常用子句为 SELECT , FROM , WHERE , GROUP BY , HAVING ,和 ORDER BY
“语句”和“命令”是可以互换的
SQL分类
1、数据库查询语言(DQL)
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块,简称DQL,Data Query Language
代表关键字为select
功能
添加
修改
删除
查询
2、数据库操作语言(DML)
用户通过它可以实现对数据库的基本操作。简称DML,Data Manipulation Language
代表关键字为insert、delete 、update
功能
用户
权限
5、数据控制语言(DCL)
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。简称:DCL,Data Control Language
代表关键字为grant、revoke
事务
4、事务控制语言(TCL)
TCL经常被用于快速原型开发、脚本编程、GUI和测试等方面,简称:TCL,Trasactional Control Languag
代表关键字为commit、rollback
3、数据库定义语言(DDL)
数据定义语言DDL用来创建数据库中的各种对象,创建、删除、修改表的结构,比如表、视图、索引、同义词、聚簇等,简称DDL,Data Denifition Language
代表关键字为create、drop、alter
功能
逻辑库
数据表
视图
索引
和DML相比,DML是修改数据库表中的数据,而 DDL 是修改数据中表的结构。
数据库范式
数据库范式(normalization)
数据库范式是数据表设计的规范,在范式规范下,数据库里每个表存储的重复数据降到最少(这有助于数据的一致性维护),同时在数据库范式下,表和表之间不再有很强的数据耦合,可以独立的增长
范式带来了很多好处,但随着数据表的分离,意味着我们要查询多个数据属性时,需要更复杂的SQL语句
关系数据库6种范式
一般情况下,只满足第三范式即可
第一范式:原子性
数据库基本要求,满足才能称为关系数据库
数据表的每一列都是不可分割的基本数据项,同一列不能有多个值,也不能存在重复的属性
第二范式:唯一性
目的:避免保存重复的数据
数据表中的每条记录必须是唯一的
唯一属性列:主键列
第三范式:关联性
每列都与主键有直接关系,不存在传递依赖
不相关的字段要拆分到其他数据表里面
DQL查询语言
SELECT语句
基本结构
select
SELECT column,column,column (找什么)
SELECT *
*表示所有的col(列)
经常用来在不清楚table(表)中有什么数据时,能取出所有的数据
from
FRIOM table (从哪个表找)
where
WHERE column 条件 (寻找的条件)
where 1
1表示所有的条件(即没有条件)
简单查询
无条件查询记录,字段的计算和字段的别名
查询(queries)
SELECT语句, 通常又称为查询(queries)
语法
SELECT column(列名), another_column, …
FROM mytable(表名)
高级查询
数据排序、分页、去除重复记录
查询结果Filtering过滤 和 sorting排序
DISTINCT 语法
选取出唯一的结果的语法,DISTINCT 语法会直接删除重复的行
语法
SELECT DISTINCT column, another_column, …
FROM mytable
WHERE condition(s);
ORDER BY 语法
解决结果排序问题,让结果按一个或多个属性列做排序
语法
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC;
ASC升序(ascension), DESC 降序(descension)
多列排序:ORDER BY col1 ASC,col2 DESC
limited 查询
LIMIT
指定只返回多少行结果
OFFSET
指定从哪一行开始返回
语法
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;
易错要点
想要第三行数据
LIMIT 1 OFFSET 2
TOP子句
TOP 子句用于规定要返回的记录的数目
并非所有的数据库系统都支持 TOP 子句
语法
数量
SELECT TOP number column_name(s)
FROM table_name
比例
SELECT TOP number percent column_name(s)
FROM table_name
条件查询
条件查询 (constraints)
语法
SELECT column(列名), another_column, …
FROM mytable(表名)
WHERE condition
AND/OR another_condition
AND/OR …
在查询中进行统计
分组统计
GROUP BY
可以按某个col_name对数据进行分组
把统计函数和GROUP BY结合,那统计结果就是对分组内的数据统计了
GROUP BY 分组结果的数据条数,就是分组数量
分组后筛选
HAVING
对分组之后的数据再做SELECT筛选
语法
SELECT column, another_column表达式 AS new_column
FROM mytable
WHERE condition(s)
GROUP BY column
HAVING group_condition;
重点
HAVING 子句要和GROUP BY子句联合起来才能使用;HAVING 子句不能单独使用
WHERE子句和HAVING子句功能是相同的,都是做数据筛选的;【普通条件】的判断建议放在WHERE子句中,【聚合函数和其他的数据】的条件判断需要放在HAVING子句中
在HAVING子句中,拿聚合函数跟具体的数据做比较是没有问题的,比如“HAVING COUNT(*)>=2;”是没有问题的;但是,拿聚合函数跟某个字段作条件判断是不行的,必须用表连接才能实现
AND子句也可以用在HAVING子句中
特殊用法
GROUP BY中使用1后,HAVING子句可正常使用
SELECT deptno, COUNT(*)
FROM table_a
GROUP BY 1 HAVING deptno IN (5,6)
1表示按照SELECT子句中第一个字段(例子中如deptno)作为分组字段
尽管有时候可以直接讲WHERE子句的条件写在HAVING子句中,但不建议
在查询中使用表达式
AS关键字
语法
SELECT column, another_column表达式 AS new_column
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_table
ON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
补充知识
奇偶数判断
奇
col%2 =1
偶
col%2 =0
操作符
算数运算符
比较运算符
逻辑运算符
位运算符
位运算中的&、|、~和逻辑运算中的&&、||、!非常相似
备注
在字符串表达式中的字符串需要用引号 " 包含,如果不用引号,SQL会认为是一个属性列的名字
col_name = bear 表示 col_name和bear两个属性一样的行 col_name = "bear" 表示 col_name 属性为字符串 "bear"的行
通配符
常见参数
多表联合查询
JOIN连表技术
基本知识
主键(primary key)
一般关系数据表中,都会有一个属性列设置为 主键(primary key),是唯一标识一条数据的,不会重复复(同身份证号码)
借助主键(primary key)(当然其他唯一性的属性也可以),我们可以把两个表中具有相同 主键ID的数据连接起来
INNER JOIN
可以简写做JOIN,但继续写作 INNER JOIN ,和 LEFT JOIN, RIGHT JOIN比较区分
只会保留两个表都存在的数据,在某些场景下会有一些数据的丢失
语法
SELECT column, another_table_column, …
FROM mytable
INNER JOIN another_table
ON mytable.id = another_table.id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
外连接(OUTER JOINs)
会保留不能匹配的行
也可以写作 LEFT OUTER JOIN, RIGHT OUTER JOIN, 或 FULL OUTER JOIN, 和 LEFT JOIN, RIGHT JOIN, FULL JOIN 等价
左连接 LEFT JOIN
在表A 连接 B, LEFT JOIN保留A的所有行,不管有没有能匹配上B
右连接 RIGHT JOIN
在表A 连接 B,RIGHT JOIN则保留所有B里的行
全连接 FULL JOIN
在表A 连接 B,不管有没有匹配上,同时保留A和B里的所有行
语法
SELECT column, another_column, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_table
ON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
涉及问题
如果某一行在另一个表不存在,会用 NULL来填充结果数据
NULL解决办法
可以用 IS NULL和 IS NOT NULL 来选在某个字段是否等于 NULL
语法
SELECT column, another_column, …
FROM mytable
WHERE column IS IS NOT NULL
AND OR another_condition
AND OR …;
完整的SELECT查询
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET COUNT;
Alias(别名)
为列名称和表名称指定别名(Alias),更直观或简洁
语法
表别名
SELECT column_name(s)
FROM table_name AS alias_name
列别名
SELECT column_name AS alias_name
FROM table_name
从数据库表中获取数据
SELECT INTO 语句
常用于创建表的备份复件或者用于对记录进行存档
配合 IN 子句可用于向另一个数据库中拷贝表
语法
把所有的列插入新表
SELECT *
INTO new_table_name IN externaldatabase
FROM old_tablename
只把希望的列插入新表
SELECT column_name(s)
INTO new_table_name IN externaldatabase
FROM old_tablename
从一个以上的表中选取数据
SELECT old_tablename1.column_name(s), old_tablename2.column_name(s)
INTO new_table_name IN externaldatabase
FROM old_tablename1
INNER JOIN old_tablename2
ON old_tablename1.id = old_tablename2.id
UNION 操作符
用于合并两个或多个 SELECT 语句的结果集
限制
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型
每条 SELECT 语句中的列的顺序必须相同
语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名
默认地,UNION 操作符选取不同的值
UNION ALL 操作符
用于合并两个或多个 SELECT 语句的结果集
限制
同UNION
语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
UNION ALL 操作符选取的允许重复
DML数据库操作语言
UPDATE语句
用于修改表中的数据
语法
UPDATE table_name SET 列1 = 新值1,列2 = 新值2 WHERE 列名称 = 某值
更新数据库表中的数据
DELETE语句
用于删除表中的行
语法
删除某行
DELETE FROM table_name WHERE 列名称 = 值
删除全部行
DELETE FROM table_name
DELETE * FROM table_name
从数据库表中删除数据
INSERT INTO语句
用于向表格中插入新的行
语法
全部列
INSERT INTO table_name VALUES (值1, 值2,....)
指定列
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
向数据库表中插入数据
DDL数据定义语言
CREATE DATABASE
用于创建数据库
语法
CREATE DATABASE database_name
创建新数据库
CREATE TABLE
用于创建数据库中的表
语法
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
创建新表
CREATE INDEX
用于在表中创建索引
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据
用户无法看到索引,它们只能被用来加速搜索/查询
更新一个包含索引的表需要比更新一个没有索引的表更多的时间,索引本身也需要更新。一般仅在常被搜索的列(以及表)上面创建索引
语法
CREATE INDEX
CREATE INDEX index_name
ON table_name (column1_name, column2_name)
允许使用重复的值
CREATE UNIQUE INDEX
CREATE UNIQUE INDEX index_name
ON table_name (column1_name, column2_name)
两个行不能拥有相同的索引值
创建索引(搜索键)
DROP DATABASE
用于删除数据库
语法
DROP DATABASE 数据库名称
删除数据库
DROP TABLE
用于删除表(表的结构、属性以及索引也会被删除)
语法
DROP TABLE 表名称
删除表
DROP INDEX
命令删除表格中的索引
语法
MySQL
ALTER TABLE table_name DROP INDEX index_name
MS SQL Server
DROP INDEX table_name.index_name
Microsoft SQLJet 和 Microsoft Access
DROP INDEX index_name ON table_name
IBM DB2 和 Oracle
DROP INDEX index_name
删除索引
TRUNCATE TABLE
除去表内的数据,但并不删除表本身
语法
TRUNCATE TABLE 表名称
ALTER DATABASE
在数据库中只能对数据库使用的字符集和校对规则进行修改,数据库的这些特性都储存在 db.opt 文件中
语法
ALTER DATABASE 数据库名
使用 ALTER DATABASE 需要获得数据库 ALTER 权限
DEFAULT CHARACTER SET 字符集名
CHARACTER SET 子句用于更改默认的数据库字符集
DEFAULT COLLATE 校对规则名
修改数据库
ALTER TABLE
添加列
ALTER TABLE table_name
ADD column_name datatype
删除列
ALTER TABLE table_name
DROP COLUMN column_name
某些数据库系统不允许这种在数据库表中删除列的方式
改变表中列的数据类型
ALTER TABLE table_name
ALTER COLUMN column_name datatype
AUTO INCREMENT 字段
自动地创建主键字段的值
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1
以其他的值起始
ALTER TABLE 表名称 AUTO_INCREMENT=100
语法
MySQL
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL AUTO_INCREMENT,
列名称2 数据类型,
列名称3 数据类型,
....
PRIMARY KEY (列名称1)
)
SQL Server
语法
CREATE TABLE 表名称
(
列名称1 数据类型 PRIMARY KEY IDENTITY,
列名称2 数据类型,
列名称3 数据类型,
....
)
MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务
设定以 10 起始且递增30
把 identity 改为 IDENTITY(10,30)
Access
语法
CREATE TABLE 表名称
(
列名称1 数据类型 PRIMARY KEY AUTOINCREMENT,
列名称2 数据类型,
列名称3 数据类型,
....
)
MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务
设定以 20 起始且递增 10
把 autoincrement 改为 AUTOINCREMENT(20,10)
Oracle
语法
CREATE SEQUENCE 序列对象名称
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
CACHE 选项规定了为了提高访问速度要存储多少个序列值
变更(改变)数据库表
VIEW(视图)
视图是基于 SQL 语句的结果集的可视化的表
视图包含行和列,视图中的字段就是来自一个或多个数据库中的真实的表中的字段
可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以提交数据
数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响
视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据
语法
CREATE VIEW
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
查询视图
SELECT * FROM view_name
更新视图
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
撤销视图
DROP VIEW view_name
数据类型
SQL中最常用的数据类型
MySQL
Text
Number
这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数
Date
约束 (Constraints)
约束用于限制加入表的数据的类型
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)
非空约束
关键字
NOT NULL
描述
字段值不能为NULL
NULL代表没有数据,而不是空字符串”“
语法
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
....
)
主键约束
关键字
PRIMARY KEY
描述
字段值唯一,且不能为NULL
建议使用数字类型
检索速度快
语法
创建约束
通过CREATE TABLE
MySQL
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
....
PRIMARY KEY (列名称)
)
SQL Server / Oracle / MS Access
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL PRIMARY KEY,
列名称2 数据类型,
列名称3 数据类型,
....
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD PRIMARY KEY (列名称1)
命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束
通过CREATE TABLE
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
....
CONSTRAINT 约束名 PRIMARY KEY (列名称1,列名称2)
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD CONSTRAINT 约束名 PRIMARY KEY (列名称1,列名称2)
撤销约束
MySQL
ALTER TABLE 表名称
DROP PRIMARY KEY
SQL Server / Oracle / MS Access
ALTER TABLE 表名称
DROP CONSTRAINT 约束名
每个表只能有一个 PRIMARY KEY 约束
使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)
唯一约束
关键字
UNIQUE
描述
字段值唯一,且可以为NULL
语法
创建约束
通过CREATE TABLE
MySQL
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
....
UNIQUE (列名称)
)
SQL Server / Oracle / MS Access
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL UNIQUE,
列名称2 数据类型,
列名称3 数据类型,
....
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD UNIQUE (列名称1)
命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束
通过CREATE TABLE
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
....
CONSTRAINT 约束名 UNIQUE (列名称1,列名称2)
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD CONSTRAINT 约束名 UNIQUE (列名称1,列名称2)
撤销约束
MySQL
ALTER TABLE 表名称
DROP INDEX 约束名
SQL Server / Oracle / MS Access
ALTER TABLE 表名称
DROP CONSTRAINT 约束名
每个表可以有多个 UNIQUE 约束
均为列或列集合提供了唯一性的保证
外键约束
用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一
关键字
FOREIGN KEY
描述
保持关联数据的逻辑性
语法
创建约束
通过CREATE TABLE
MySQL
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
关联表列名称 数据类型,
PRIMARY KEY (列名称1),
FOREIGN KEY (关联表列名称) REFERENCES 关联表(关联表列名称)
)
SQL Server / Oracle / MS Access
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL PRIMARY KEY,
列名称2 数据类型,
列名称3 数据类型,
关联表列名称 数据类型 FOREIGN KEY REFERENCES 关联表(关联表列名称)
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD FOREIGN KEY (关联表列名称)
REFERENCES 关联表(关联表列名称)
命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
通过CREATE TABLE
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
关联表列名称 数据类型,
PRIMARY KEY (列名称1),
CONSTRAINT 约束名 FOREIGN KEY (关联表列名称)
REFERENCES 关联表(关联表列名称)
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD CONSTRAINT 约束名
FOREIGN KEY (关联表列名称)
REFERENCES 关联表(关联表列名称)
撤销约束
MySQL
ALTER TABLE 表名称
DROP FOREIGN KEY 约束名
SQL Server / Oracle / MS Access
ALTER TABLE 表名称
DROP CONSTRAINT 约束名
不推荐使用
会形成外键闭环,无法对表增删改
CHECK 约束
用于限制列中的值的范围
关键字
CHECK
描述
如果对单个列定义 CHECK 约束,那么该列只允许特定的值
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制
语法
创建约束
通过CREATE TABLE
MySQL
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
CHECK (列名称1 条件表达式)
)
SQL Server / Oracle / MS Access
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL CHECK (列名称1 条件表达式),
列名称2 数据类型,
列名称3 数据类型,
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD CHECK (列名称1 条件表达式)
命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
通过CREATE TABLE
CREATE TABLE 表名称
(
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型,
CONSTRAINT 约束名 CHECK (列名称1 条件表达式 AND 列名称2 条件表达式)
)
通过ALTER TABLE
ALTER TABLE 表名称
ADD CONSTRAINT 约束名 CHECK (列名称1 条件表达式 AND 列名称2 条件表达式)
撤销约束
MySQL
ALTER TABLE 表名称
DROP CHECK 约束名
SQL Server / Oracle / MS Access
ALTER TABLE 表名称
DROP CONSTRAINT 约束名
DEFAULT 约束
用于向列中插入默认值
关键字
DEFAULT
语法
创建约束
通过CREATE TABLE
CREATE TABLE 表名称
列名称1 数据类型 NOT NULL,
列名称2 数据类型,
列名称3 数据类型 DEFAULT “默认值”或函数,
通过ALTER TABLE
MySQL
ALTER TABLE 表名称
ALTER 列名称1 SET DEFAULT “默认值”或函数,
SQL Server / Oracle / MS Access
ALTER TABLE 表名称
ALTER COLUMN 列名称1 SET DEFAULT “默认值”或函数,
撤销约束
MySQL
ALTER TABLE 表名称
ALTER 列名称1 DROP DEFAULT
SQL Server / Oracle / MS Access
ALTER TABLE 表名称
ALTER COLUMN 列名称1 DROP DEFAULT
常用函数
数值型函数
字符串型函数
日期时间函数
聚合函数
聚合函数的使用之前,需要先明确无误的确定数据的范围,因此聚合函数不可放在WHERE语句中
流程控制函数
NULL 函数
abbr.
deptno
一般建表的时候用来简写“department No.”指部门编号