SQL必知必会
第一章 了解SQL
1.1 数据库基础
数据库(database)保存有组织的数据的容器
表(table)某种特定类型数据的结构化清单。数据库中的每个表都有一个用来标识自己的名字。此名字是唯一的。
模式(schema)关于数据库和表的布局及特性的信息。
列(column)表中的一个字段。所有表都是由一个或多个列组成的。
数据类型(datatype)所容许的数据的类型。每个表列都有相应的数据类型,它限制该列中存储的数据。
行(row)表中的一个记录。
主键(primary key)一列,其值能够唯一标识表中每一行。
-
- 任意两行都不具有相同的主键值;
- 每个行都必须具有一个主键值(主键值不允许NULL值)
- 主键列中的值不允许修改或更新
- 主键值不嫩恶搞重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
结构化查询语言(SQL)Structured Query Language
第二章 创建和操纵表
班级信息ClassInfo
班级编号 |
班主任编号 |
学生编号 |
年级 |
ClassID |
TeacherID |
StudentID |
Grade |
学生信息StudentInfo
学生编号 |
性别 |
年龄 |
身份证 |
学生姓名 |
StudentID |
Gender |
Age |
CardID |
StudentName |
学生成绩StudentAchieve
学生编号 |
语文 |
数学 |
英语 |
年份 |
班级编号 |
StudentID |
Chinese |
Math |
English |
TestYear |
ClassID |
2.1 创建表
为利用CREATE TABLE创建表,必须给出下列信息:
-
- 新表的名字,在关键字CREATE TABLE之后给出;
- 表列的名字和定义,用逗号分隔;
CREATE TABLE ClassInfo ( ClassID CHAR(20) NOT NULL, --班级编号 TeacherID CHAR(20) NOT NULL, --班主任编号 StudentID CHAR(20) NOT NULL, --学生编号 Grade CHAR(15) NOT NULL --年级 )
CREATE TABLE StudentInfo ( StudentID CHAR(20) NOT NULL, --学生编号 StudentName CHAR(50) NOT NULL, --学生姓名 Gender CHAR(5) NOT NULL, --性别 Age INT NOT NULL DEFAULT 0, --年龄 CardID VARCHAR(50) NULL DEFAULT '' --身份证 )
CREATE TABLE StudentAchieve ( StudentID CHAR(20) NOT NULL, --学生编号 ClassID CHAR(20) NOT NULL, --班级编号 Chinese DECIMAL(10,5) NOT NULL DEFAULT 0, --语文 Math DECIMAL(10,5) NOT NULL DEFAULT 0, --数学 English DECIMAL(10,5) NOT NULL DEFAULT 0 --英语 )
2.2 更新表
为更新表定义,可使用ALTER TABLE语句。
为了使用ALTER TABLE更改表结构,必须给出下面的信息:
-
- 在ALTER TABLE之后给出要更改的表名
- 所做更改的列名
ALTER TABLE dbo.StudentAchieve ADD TestYear CHAR(20) NOT NULL --考试年份
添加考试年份的列
ALTER TABLE dbo.StudentAchieve DROP COLUMN TestYear
删除考试年份的列
2.3 删除表
DROP TABLE dbo.StudentAchieve
删除学生成绩这张表。删除表没有确认,也不能撤销,执行这条语句将永久删除该表。
注:可使用关系规则防止意外删除
第三章 检索数据
3.1 检索单个列
SELECT StudentName FROM dbo.StudentInfo
3.2 检索多个列
SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo
3.3 检索所有列
SELECT * FROM dbo.StudentInfo
第四章 排序检索数据
4.1 排序数据
SELECT StudentName FROM dbo.StudentInfo ORDER BY StudentName
Order by子句的位置:应保证它是slect语句中最后一条子句。
4.2 按多个列排序
SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY StudentName,StudentID
4.3 按列位置排序
SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY 1,3
4.4 指定排序方向
SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY Gender DESC
DESC降序排列,DESCENDING
ASC升序排列,默认
第五章 过滤数据
5.1 使用WHERE子句
SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Age=5
5.2 where子句操作符
操作符 |
说明 |
= |
等于 |
<> |
不等于 |
!= |
不等于 |
< |
小于 |
<= |
小于等于 |
!< |
不小于 |
> |
大于 |
>= |
大于等于 |
!> |
不大于 |
BETWEEN |
再指定的两个值之间 |
IS NULL |
为NULL值 |
5.2.1 检查单个值
SELECT StudentID,ClassID FROM dbo.StudentAchieve WHERE Chinese<95
5.2.2 不匹配检查
SELECT * FROM dbo.StudentInfo WHERE CardID <>''
5.2.3 范围值检查
SELECT StudentID,Math FROM dbo.StudentAchieve WHERE Math BETWEEN 90 AND 100
5.2.4 空值检查
SELECT StudentName,StudentID FROM dbo.StudentInfo WHERE CardID IS NULL
第六章 高级数据过滤
6.1 组合WHERE子句
6.1.1 AND操作符
SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Gender='女' AND Age=6
6.1.2 OR操作符
SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Gender='女' OR Age=6
6.2 IN 操作符
SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Age IN (5,6)
6.2 NOT操作符
SELECT StudentID,StudentName,Gender FROM dbo.StudentInfo WHERE NOT Gender='女'
第七章 用通配符进行过滤
7.1 LIKE操作符
通配符(wildcard)用来匹配值的一部分的特殊字符。
搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。
7.1.1 百分号(%)通配符
SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE CardID LIKE 'card%'
检索任意以card起头的词。
%告诉DBMS接受card之后的任意字符,不管他有多少字符。
SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE CardID LIKE '%01%'
%可以匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。
7.1.2 下划线(_)通配符
下划线的用途与%一样,但下划线只匹配一个字符而不是多个字符。
SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE StudentName LIKE '名_2'
7.1.3 方括号([])通配符
方括号通配符用来指定一个字符集,它必须匹配指定位置得一个字符。
SELECT * FROM dbo.StudentInfo WHERE CardID LIKE 'card000[23]%'
找出以card0002或card0003开头得cardid
此通配符可以用前缀字符^(脱子号)来否定。
SELECT * FROM dbo.StudentInfo WHERE CardID LIKE 'card000[^23]%'
7.2 使用通配符得技巧
-
- 不用过分使用通配符。如果其他操作符能达到相同得目的,应该使用其他操作符。
- 在确实需要使用通配符时,除非绝对又必要,否则不要把它们用在搜索模式得开始处,把通配符置于搜索模式得开始处,搜索起来时最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
第八章 创建计算字段
8.1 计算字段
字段(field)基本上与列(column)的意思相同,经常互换使用,不过数据列一般称为列,而术语字段通常用在计算字段的连接上。
8.2 拼接字段
拼接(concatenate)将值联结到一起构成单个值。
SELECT StudentID+'name: '+StudentName FROM dbo.StudentInfo
SELECT RTRIM(StudentID)+'name: '+RTRIM(StudentName) FROM dbo.StudentInfo
RTRIM()函数去掉右边的所有空格。
SELECT RTRIM(StudentID)+'name: '+RTRIM(StudentName) info FROM dbo.StudentInfo
使用别名
8.3 执行算术计算
SELECT StudentID,Chinese+Math+English AS total FROM dbo.StudentAchieve
第九章 使用数据处理函数
9.1 函数
可移植(portable)所编写的代码可以在多个系统上运行。
9.2 使用函数
9.2.1 文本处理函数
SELECT StudentID,UPPER(CardID) cardinfo FROM dbo.StudentInfo
UPPER()将文本转换为大写
常用的文本处理函数
函数 |
说明 |
LEFT() |
返回串左边的字符 |
LENGTH() |
返回串的长度 |
LOWER() |
将串转换为小写 |
LTRIM() |
去掉串左边的空格 |
RIGHT() |
返回串右边的字符 |
RTRIM() |
去掉串右边的空格 |
SOUNDEX() |
返回串的SOUNDEX值 |
UPPER() |
将串转换为大写 |
SOUNDEX()函数是一个将任何文本串转换为描述其语音表达的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。
9.2.2 日期和时间处理函数
日期和时间采用相应的数据类型存储在表中,每种DBMS都有自己的变体。日期和时间值以特殊的格式存储,以便能快速和有效地排序或过滤,并且节约物理存储空间。
9.2.3 数值处理函数
函数 |
说明 |
ABS() |
绝对值 |
COS() |
余弦 |
EXP() |
指数 |
PI() |
圆周率 |
SIN() |
正弦 |
SQRT() |
平方根 |
TAN() |
正切 |
第十章 汇总数据
10.1 聚集函数
聚集函数(aggregate function)运行在行组上,计算和返回单个值的函数。
函数 |
说明 |
AVG() |
平均值 |
COUNT() |
行数 |
MAX() |
最大值 |
MIN() |
最小值 |
SUM() |
和 |
10.1.1 AVG()函数
SELECT AVG(Chinese) AS avg_chinese FROM dbo.StudentAchieve
SELECT AVG(Chinese) AS avg_chinese_11 FROM dbo.StudentAchieve WHERE ClassID='c00011'
AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。只能用于单个列。
AVG()函数忽略值为NULL的行。
10.1.2 COUNT()函数
COUNT()函数又两种使用方式
-
- 使用COUNT(*)对表中行的数据进行计数,不管表列中包含的是空值还是非空值。
- 使用COUNT(column)对特定列中具有值得行进行计数,忽略NULL值
SELECT COUNT(*) AS num FROM dbo.StudentInfo
SELECT COUNT(StudentID) AS num FROM dbo.StudentInfo
10.1.3 MAX()函数
SELECT MAX(Math) AS max_math FROM dbo.StudentAchieve
10.1.4 MIN()函数
SELECT MIN(Math) AS min_math FROM dbo.StudentAchieve
10.1.5 SUM()函数
SELECT sum(Math) AS sum_math FROM dbo.StudentAchieve
SELECT sum(Math+Chinese) AS total FROM dbo.StudentAchieve
10.2 聚集不同值
以上5个聚集函数都可以如下使用:
-
- 对所有得行执行计算,指定ALL参数或不给参数。
- 值包含不同的值,指定DISTINCT参数
SELECT AVG(distinct Math) AS math_avg FROM dbo.StudentAchieve
10.3 组合聚集函数
SELECT COUNT(*) as num_count,MIN(Math) AS min_math,MAX(Math) AS max_math FROM dbo.StudentAchieve
第十一章 分组数据
11.1 数据分组
SELECT COUNT(*) AS math_95 FROM dbo.StudentAchieve WHERE Math>95
11.2 创建分组
SELECT StudentID,COUNT(*) AS column1 FROM dbo.StudentAchieve GROUP BY StudentID
在具体使用GROUP BY子句前,需要知道一些重要的规定:
-
- GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
- 如果在GROUP BY子句中快安了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时指定的所有列都一起计算(所以不能从个别的列取回数据)。
- GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
- 大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)。
- 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
- 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组
- GROUP BY子句必须出现在WHERE子句之后,ORDER BY子向之前。
11.3 过滤分组
SELECT StudentID,COUNT(*) AS column1 FROM dbo.StudentAchieve GROUP BY StudentID HAVING COUNT(*)=2
11.4 分组和排序
ORDER BY与GROUP BY
ORDER BY |
GROUP BY |
排序产生的输出 任意列都可以使用(甚至非选择的列也可以使用) 不一定需要 |
分组行。但输出可能不是分组的顺序 只可能使用选择列或表达式列,而且必须使用每个选择列表达式 如果与聚集函数一起使用列(或表达式),则必须使用 |
11.5 SELECT子句顺序
子句 |
说明 |
是否必须使用 |
SELECT |
要返回的列或表达式 |
是 |
FROM |
从中检索数据的表 |
仅在从表选择数据时使用 |
WHERE |
行级过滤 |
否 |
GROUP BY |
分组说明 |
仅在按组计算聚集时使用 |
HAVING |
组级说明 |
否 |
ORDER BY |
输出排序顺序 |
否 |
第十二章 使用子查询
12.1 子查询
查询(query)任何SQL语句都是查询。
SQL还允许创建子查询(subquery),即:嵌套在其他查询中的查询。
12.2 利用子查询进行过滤
SELECT StudentName FROM dbo.StudentInfo WHERE StudentID IN ( SELECT StudentID FROM dbo.StudentAchieve WHERE Math > 95 );
12.3 作为计算字段使用子查询
SELECT StudentID,( SELECT COUNT(*)FROM dbo.StudentAchieve WHERE StudentID = StudentID) AS column1 FROM dbo.StudentInfo;
第十三章 联结表
13.1 联结
可伸缩性(scale)能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好、
13.2 创建联结
SELECT StudentName,Math, Chinese FROM dbo.StudentInfo,dbo.StudentAchieve WHERE StudentAchieve.StudentID = StudentInfo.StudentID;
13.2.1 WHERE子句的重要性
笛卡儿积(cartesian product)由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
SELECT StudentName,Math,Chinese FROM dbo.StudentInfo,dbo.StudentAchieve
13.2.2 内部联结
SELECT StudentName, Math,Chinese FROM dbo.StudentInfo INNER join dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID
13.2.3 联结多个表
SELECT StudentName,Math,Chinese, Grade FROM dbo.StudentInfo,dbo.StudentAchieve, dbo.ClassInfo WHERE StudentInfo.StudentID = StudentAchieve.StudentID AND ClassInfo.StudentID = StudentAchieve.StudentID AND Math > 90;
第十四章 创建高级联结
14.1 使用表别名
SELECT StudentName,Math, Chinese,Grade FROM dbo.StudentInfo AS a, dbo.StudentAchieve AS b, dbo.ClassInfo AS c WHERE a.StudentID = b.StudentID AND c.StudentID = a.StudentID AND Math > 90;
14.2 使用不同类型的联结
14.2.1 自联结
SELECT StudentID,StudentName,Gender FROM dbo.StudentInfo WHERE Gender =( SELECT Gender FROM dbo.StudentInfo WHERE StudentID = 's00001')
SELECT a.StudentID,a.StudentName,a.Gender FROM dbo.StudentInfo AS a,dbo.StudentInfo AS b WHERE a.Gender = b.Gender AND b.StudentID = 's00001';
14.2.2 自然联结
SELECT StudentName,Math, Chinese,Grade FROM dbo.StudentInfo AS a, dbo.StudentAchieve AS b, dbo.ClassInfo AS c WHERE a.StudentID = b.StudentID AND c.StudentID = a.StudentID AND Math > 90;
14.2.3 外部联结
SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo LEFT JOIN dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID;
SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo RIGHT JOIN dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID;
14.3 使用带聚集函数的联结
SELECT Grade,COUNT(Age) AS age_count,Age FROM dbo.StudentInfo INNER JOIN dbo.ClassInfo ON ClassInfo.StudentID = StudentInfo.StudentID GROUP BY ClassInfo.Grade,Age
14.4 使用联结和联结条件
-
- 注意所使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的。
- 关于确切的联结语法,应该查看具体的文档,看相应的DBMS支持何种语法(大多数DBMS使用这两章中描述的某种语法形式)。
- 保证使用正确的联结条件(不管是采用哪种语法),否则将返回不正确的数据。
- 应该总是提供联结条件,否则会得出笛卡儿积。
- 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在起测试它们前,分别测试每个联结。这将使故障排除更为简单。
第十五章 组合查询
15.1 组合查询
SQL允许执行多个查询,并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
15.2 创建组合查询
15.2.1 使用UNION
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5 UNION SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender='男'
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5 OR Gender='男'
15.2.2 UNION规则
-
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键宇UNION分隔(因此,如果组合4条SELECT语句,将要使用3个UNION关键宇)。
- UNION中的每个查询必须包含相同的列、表达式或聚集西数(不过各个列不需要以相同的次序列出)。
- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
15.2.3 包含或取消重复的行
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5 UNION ALL SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender='男'
15.2.4 对组合查询结果排序
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5 UNION SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender='男' ORDER BY Gender
第十六章 插入数据
16.1 数据插入
16.1.1 插入完整的行
INSERT INTO dbo.StudentInfo VALUES( 's00010','新的名字', '男',7,'cardcard' )
更标准的写法:
INSERT INTO dbo.StudentInfo(StudentID,StudentName,Gender,Age,CardID) VALUES('s00010','新的名字','男',7,'cardcard')
16.1.2 插入部分行
INSERT INTO dbo.StudentInfo( StudentID,StudentName,Gender, Age) VALUES( 's00014','新的名字2', '女',7)
16.1.3 插入检索出的数据
INSERT INTO dbo.StudentInfo(StudentID,StudentName,Gender,Age) VALUES('s00014','新的名字2', '女',7)
16.2 从一个表复制到另一个表
SELECT * INTO #tmp1 FROM dbo.StudentInfo
第十七章 更新和删除数据
17.1 更新数据
UPDATE dbo.StudentInfo SET CardID='cardnew' WHERE StudentID='s00002' AND Age=7
17.2 删除数据
DELETE FROM dbo.StudentInfo WHERE StudentID='s00002' AND Age=7
第十八章 使用视图
18.1 视图
视图不包含任何列或数据,它包含的是一个查询。
18.1.1 为什么使用视图
-
- 重用SQL语句
- 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
- 使用表的组成部分而不是整个表。
- 保护数据。可以给用户授予表的特定部分的访问权限而不是鳖个表的访问权限。
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
18.1.2 视图的规则和限制
-
- 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
- 对于可以创建的视图数目没有限制。
- 为了创建视图,必须具有足形的访问权限。这些限制通常由数据库管理人员授子。
- 视图可以嵌套,即:可以利用从其他视图中检素数据的查询来构造一个视图。所允许的恢套层数在不同的DBMS中有所不同(嵌套视图可能会严重降低查询的性能,因此在产品环境中使用之前,应该对其进行详细的测试)。
- 许多DBMS禁止在视图查询中使用ORDER BY子句。
- 有的DBMS要求命名返回的所有列,如果列是计算字段,则需要使用别名
- 视图不能索引,也不能有关联的触发器或默认值。
- 有的DBMS把视图作为只读的查询,这表示可以从视图检索数据,但不能将数据写回底层表。详情请参阅具体的DBMS文档。
- 有的DBMS允许创建这样的视图,它不允许进行导致行不再属于视图的插入或更新。例如,有这样一个视图,它只检索带有电子邮件地址的客户。如果更新东个客户,刪除他的电子邮件地址,这将使该客户不再属于视图。这是默认行为,而且是允许的,但在具体的DBMS上可能能够防止这种情况发生
18.2 创建视图
18.2.1 利用视图简化复杂的联结
CREATE VIEW student_view AS SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo LEFT JOIN dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID;
18.2.2 用视图重新格式化检索出的数据
CREATE VIEW student_view AS SELECT RTRIM(StudentID)+'('+RTRIM(StudentName)+')' AS stuinfo FROM dbo.StudentInfo
SELECT * FROM student_view
第十九章 使用存储过程
19.1 存储过程
存储过程简单来说,就是为了以后的使用而保存的一条或多条SQL语句的集合。可将其视为批文件。
19.2 为什么要使用存储过程
简单、安全、高性能。
19.3 执行存储过程
EXECUTE
EXECUTE后面跟着存储过程和需要传递给它的任何参数。
19.4 创建存储过程
CREATE PROCEDURE test AS DECLARE @n INTEGER SELECT @n=COUNT(*) FROM dbo.StudentInfo WHERE CardID IS NOT NULL RETURN @n
第二十章 管理事务处理
20.1 事务处理
事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的SQL操作要么完全执行,要么完全不执行。
-
- 事务 (transaction)指一组SQL语句。
- 回退(ro11back)"指撤销指定SOL语句的过程。
- 提交(commit)指将未存储的SOL语句结果写入数据库表。
- 保留点(savepoint)指事务处理中设置的临时占位符(placcholder),你可以对它发布回退(与回退整个事务处理不同)。
20.2 控制事务处理
BEGIN TRANSACTION operation --**** COMMIT TRANSACTION operation
20.2.1 使用ROLLBACK
ROLLBACK operation
20.2.2 使用保留点
SAVE TRANSACTION operation
第二十一章 使用游标
21.1 游标
结果集(result set)SQL查询所检索出的结果。
游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,二十被该语句检索出来的结果集。
21.2 使用游标
21.2.1 创建游标
DECLARE testcursor CURSOR FOR SELECT StudentID FROM dbo.StudentInfo
21.2.2 使用游标
DECLARE @n [char] (20) DECLARE testcursor CURSOR FOR SELECT StudentID FROM dbo.StudentInfo OPEN testcursor FETCH NEXT FROM testcursor INTO @n BEGIN --*** FETCH NEXT FROM testcursor INTO @n END
21.2.3 关闭游标
CLOSE testcursor
第二十二章 了解高级SQL特性
22.1 约束
约束(constraint)管理如何插入或梳理数据库数据的规则
22.1.1 主键
表中任意列只要满足以下条件,都可以用于主键:
-
- 任意两行的主键值都不相同。
- 每行都具有一个主键值(即列中不允许NULL值)。
- 包含主键值的列不修改或更新。
- 主键值不能重用。如果从表中删除菜一行,其主键值不分配给新行。
22.1.2 外键
外键是表中的一个列,其值必须再另一个表的主键中列出。
外键可以帮助防止意外的删除。
22.1.3 唯一约束
唯一约束用来保证一个列(或一组列)中的数据唯一。
22.1.4 检查约束
检查约束用来保证一个列(或一组列)中的数据满足一组指定的条件。
CHECK
22.2 索引
CREATE INDEX
22.3 触发器
CREATE TRIGGER
22.4 数据库安全
-
- 对数据库管理功能(创建表、更改或刪除己存在的表等)的访问;
- 对特定数据库或表的访问;
- 访问的类型(只读、对特定列的访问等)
- 仅通过视图或存储过程对表进行访问;
- 创建多层次的安全措施,从而允许多种基于登录的访问和控制;
- 限制管理用户账号的能力。
作者:可达鸭要进化
出处:http://www.cnblogs.com/Aries-rong/
本文版权归作者和博客园共有,欢迎转载,但是未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。