导图社区 SQL基础
SQL决不仅仅是一个查询工具,还用于控制DBMS提供给用户的所有功能,很详细的思维导图,值得收藏。
编辑于2022-03-31 23:36:05这是一篇关于IELTS Economic Reading Vocabul的思维导图,主要内容包括:1. Basic Economic Concepts,2. Market and Trade,3. Economic Policies and Regulation,4. Economic Phenomena and Trends,5. Impacts and Consequences。
这是一篇关于雅思经济类阅读常用单词的思维导图,主要内容包括:一、经济基本概念,二、市场与贸易,三、经济政策与调控,四、经济现象与趋势,五、影响与后果。
这是一篇关于气候变化话题核心词汇(附中文)的思维导图,主要内容包括:一、基本概念,二、温室气体与污染物,三、气候变化影响,四、应对措施与政策,五、相关术语与行动。
社区模板帮助中心,点此进入>>
这是一篇关于IELTS Economic Reading Vocabul的思维导图,主要内容包括:1. Basic Economic Concepts,2. Market and Trade,3. Economic Policies and Regulation,4. Economic Phenomena and Trends,5. Impacts and Consequences。
这是一篇关于雅思经济类阅读常用单词的思维导图,主要内容包括:一、经济基本概念,二、市场与贸易,三、经济政策与调控,四、经济现象与趋势,五、影响与后果。
这是一篇关于气候变化话题核心词汇(附中文)的思维导图,主要内容包括:一、基本概念,二、温室气体与污染物,三、气候变化影响,四、应对措施与政策,五、相关术语与行动。
SQL基础
表中数据的操作
数据查询
语法格式
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。
HAVING短语:筛选出只有满足指定条件的组
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
查询列表达式
目标列表达式格式:
*/表名.属性列/count(*)/属性列表达式
属性列库函数:count|sum|avg|max|min ([distinct]属性名)
无条件查询
SELECT子句中的<查询列表>指出要查询哪些列的数据;
FROM子句的<基表名|视图名>指出要查找的数据源;
无条件查询是指查询所有的数据集。
条件查询
在SELECT命令中使用WHERE子句给出查询条件来实现;
WHERE子句是比较运算、逻辑运算、集合运算和特殊的运算符所构成。
运算类别
比较运算
=
等于
<>或!=
不等于
<
小于
<=或!>
小于等于
>
大于
>=或!<
大于等于
逻辑运算
NOT
逻辑非,用于选择不满足条件的记录行
AND
逻辑与,用于选择同时满足多个条件的记录行
OR
逻辑或,用于选择满足任意一个条件的记录行
集合运算
IN
属于集合(或查询返回值构成的集合)
NOT IN
不属于集合(或查询返回值构成的集合)
特殊运算
BETWEEN A AND B
大于或等于A且小于或等于B
LIKE
模式匹配,“%”表示匹配任意多个字符,“-”匹配一个字符
NOT LIKE
为LIKE的否定形式
IS NULL
为空值
IS NOT NULL
为非空值
条件运算符的优先级顺序
纵向由高到低;
横向同行优先级相同,在具体的运算表达式中在左边者优先;
如有括号则括号优先。
优先级由上
至下递减
=、<>或!=、<、<= 或!>、>、>=或!<
IN,NOT IN,BETWEEN A AND B,LIKE,NOT LIKE,IS NULL,IS NOT NULL
NOT
AND
OR
条件表达式
1) 属性名θ {属性名|常量}
2) 属性名[not] between {属性名|常量 } and {属性名|常量}
3) 属性名 [not] like 字符串常数
4) 属性名 is [not] null
5) {属性名|常量} {[not] in | {any|all}} {值1[,值2]…|(select 子句}
6) [not] exists (select 子句)
7) 条件表达式 {and|or } 条件表达式
条件查询示例:
单一条件
查询医生基本信息表中所有男医生的基本信息。
% (百分号) 代表任意长度(长度可以为0)的字符串
例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串
_ (下横线) 代表任意单个字符
例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
SELECT * FROM Doctor WHERE Dsex='男'
字符串匹配
查询职称为副的医生信息
Select * From Doctor Where Dlevel Like ‘副%’
多重条件
查询年龄小于或等于40岁的男医生信息
SELECT * FROM Doctor
WHERE Dsex='男' and Dage<=40
包含查询(IN)
查询部门编号为102,103和201的医生信息
使用ORDER BY子句查询
通常在查询时,需要按一定顺序显示,可以使用ORDER BY子句列进行排序,ASC和DESC分别表示升序和降序,用户可以任选,系统缺省为升序。
SELECT * FROM Doctor
WHERE Ddeptno IN ('102','103','201')
排序查询
使用ORDER BY子句查询
通常在查询时,需要按一定顺序显示,可以使用ORDER BY子句列进行排序,ASC和DESC分别表示升序和降序,用户可以任选,系统缺省为升序。
如果按多列进行排序,应分别指出用于排序的列名及相关的升序或降序方式,排序方式的先后顺序与ORDER BY后面排序列的顺序一致。即首先由ORDER BY后面的第一列确定顺序,其次由第二列确定顺序,再由第三列确定顺序……依此类推。
在SQL SERVER中,空值为最小。
单一排序标准
按照年龄升序查询男医生信息
SELECT * FROM Doctor
WHERE Dsex='男'
ORDER BY Dage ASC
多重排序标准
按部门编号升序而按年龄降序查询医生信息
SELECT * FROM Doctor
ORDER BY Ddeptno ASC ,Dage DESC
带表达式的查询
在SQL查询中,可以使用由加(+)、减(-)、乘(*)、除(/)等算术运算符组成表达式。
除FROM子句外,其他的查询子句均可使用表达式。
实例
SELECT Mno 编号,Mname 药品名,Mprice 单价,
Mprice*1.15 调整单价,Munit单位,Mtype 类型
FROM medicine
WHERE Mprice*1.15>=30
统计查询
带聚集函数的统计查询
在实际应用中,经常要对一个数据集进行统计、求和、求平均等汇总操作,一般数据库系统都提供了聚集函数可以实现这一功能。
聚集函数一般要忽略NULL值,不对NULL值进行操作,除MIN,MAX,COUNT3个函数适合于任何数据类型外,其余的聚集函数一般都要求是数值型。
聚集查询
统计医生人数。
SELECT COUNT(Dno)人数
FROM Doctor
分组查询:GROUP BY子句
GROUP BY子句主要是完成将查询结果分组
当WHERE子句和GROUP BY子句一起使用时,WHERE子句必须在GROUP BY子句的前面。
执行过程:是先按WHERE子句找出满足条件的数据行,然后按GROUP BY子句指定的列来计算聚集函数的值。
聚集查询示例:分组统计
按部门编号统计不同部门的医生人数
SELECT Ddeptno 部门编码, COUNT(Dno)人数
FROM Doctor
GROP BY Ddeptno
分组查询:HAVING子句
当需要选出符合条件的分组统计值时,在GROUP BY子句之后,可使用HAVING子句实现。
HAVING子句与WHERE子句区别是:WHERE子句作用在分组之前选择符合条件的记录,而HAVING子句是作用在分组之后选择符合条件的分组结果。
HAVING子句必须在含有GROUP BY子句的查询语句使用,不能单独使用。
聚集查询示例:条件分组统计
在医生基本信息表中,按部门统计男医生的平均年龄不超过40岁的部门编号,并按平均年龄升序显示。
连接查询
多表间的连接查询
多表查询的理论基础是关系运算。
多表间的连接运算遵循笛卡尔规则,但“笛卡尔”查询会产生大量的无意义的数据记录。因此,在进行连接时加上一些限制条件,使产生的数据记录是笛卡尔连接结果集的子集。
进行连接运算的表,必须存在着有某种关系的公共列,连接运算实际是比较各表的公共列值,如果满足条件的连接产生组合输出行。
执行过程:嵌套循环法(NESTED-LOOP)
SELECT <查询列表> [ INTO <新表名> ] FROM <基表名1|视图名1> [ 别名1 ] [,<基表名2|视图名2> [ 别名2 ]] …… WHERE <别名1.列名1> 比较运算符 <别名2.列名2>…… [ GROUP BY <分组条件>] [ HAVING <分组后筛选条件>] [ ORDER BY <排序列名>[ ASC | DESC ] ]
内连接
要求参与连接运算的表(或视图),满足给定的连接条件。
根据连接条件的不同特点,可分为等值连接、非等值连接、自然连接、自连接。
自然连接
在连接查询中,如果要求连接条件列的列名相同,并且查询结果列不重复,称这样的连接为自然连接。
连接查询示例:自然连接
在医院信息数据库中,需要查询开出处方的医生信息。
SELECT Rno,Pno,D.Dno,Dname,Dsex,Dage,Ddeptno,Dlevel
FROM RecipeMaster R,Doctor D
WHERE R.Dno=D.Dno
自连接
SELECT语句不但支持不同表之间的连接,而且支持表自身的连接,称这样的连接为自连接。
可以把自连接理解为同一张表(或视图)的两个副本之间的连接。
连接查询示例:自连接
在医院部门表中,需要医院的各部门名称和上级部门名称。
SELECT First.DeptName 部门名称,Second.DeptName 上级部门
FROM Dept First ,Dept Second
WHERE First.ParentDeptNo=Second.DeptNo
外连接
在某些应用中,两张表的连接查询,要输出一张表的所有记录,另外一张表输出满足连接条件的记录,如果没有满足条件的记录,则用NULL匹配输出,称这种连接查询为外连接。
左连接(LEFT OUTER JOIN):输出左表的所有记录相关列值,右表输出与左表匹配的记录,如果没有与左表匹配的记录,则使用NULL匹配输出。
右连接(RIGHT OUTER OUT):输出右表的所有记录相关列值,左表输出与右表匹配的记录,如果没有与右表匹配的记录,则使用NULL匹配输出。
全外连接( FULL OUTER JOIN )
外连接示例:SQL SERVER。
在医院部门表中,查询医院的各部门名称和该部门医生姓名。
SELECT DeptName 部门名称,DName 医生姓名
FROM Dept left outer join Doctor
ON Dept.DeptNo=Doctor.Ddeptno
外连接示例: ORACLE。
在医院部门表中,查询医院的各部门名称和该部门医生姓名。
SELECT DeptName 部门名称,DName 医生姓名
FROM Dept , Doctor
WHERE Dept.DeptNo (+)=Doctor.Ddeptno
嵌套查询
在查询的条件子句含有SELECT查询子句.
外层的查询被称为主查询(或父查询)
内层的SELECT查询子句被称为子查询
嵌套查询可分为不相关子查询和相关子查询。
不相关子查询
子查询的查询条件不依赖于主查询。
执行顺序从嵌套层次最内层子查询开始执行,每个子查询在其直接外查询处理之前执行,查询返回结果作为父查询的查询条件,最后执行最外层的主查询。
嵌套查询示例:不相关子查询。
在医院数据库中,查询与医生刘伟诊断关系患者:
SELECT Pname FROM Patient
WHERE Pno IN ( SELECT Pno FROM RecipeMaster
WHERE Dno = ( SELECT Dno FROM doctor
WHERE Dname=‘刘伟’)
IN和NOT IN运算符
IN表示某元素值是属于集合,而NOT IN则表示元 素不属于集合。
嵌套查询示例:IN和NOT IN运算符
在医院数据库中,查询所开处方不包含药品“胃立康片”的医生。
SELECT Dname
FROM doctor
WHERE Dno IN (SELECT Dno FROM RecipeMaster
WHERE Rno IN (SELECT Rno FROM RecipeDetail
WHERE Mno NOT IN
(SELECT Mno FROM Medicine
WHERE Mname='胃立康片')
ANY和ALL运算符
ANY运算符是检查在子查询结果集中是否满足给定的条件。如果子查询的结果集中至少有一个值满足条件,则比较运算结果为真,否则为假。
ALL运算符是检查在子查询结果集中所有值是否都满足给定的条件。只有当结果集的所有值均满足给定的条件,则比较运算结果为真,否则为假。
在ANY和ALL一般需要=,!=,>,<,<=或>=等比较运算符配合使用。
相关子查询
依赖于主查询的子查询,即子查询的条件子句含有主查询中表的信息有关。
EXISTS与NOT EXISTS运算符
通常与相关子查询相连。如果EXISTS运算符限定的子查询有查询记录返回,那么该条件为真,否则为假。
NOT EXISTS运算符限定的子查询返回的记录集为空,那么该条件为真,否则为假。
与IN,ANY,ALL 区别:
不用指定匹配的列值,而使用*作为选择列表。
EXISTS,ANY,ALL只能用于嵌套查询,而IN,NOT IN也可用于集合。
EXISTS一般只用于相关子查询。
联合查询:UNION
UNION运算符就是将多个查询结果集合并返回,当两个结果集有相同记录时,则合并成唯一记录返回。
数据增加
用VALUES插入,格式为:
INSERT INTO <基表名> [(<列名表>)]
VALUES(<值表>)
<基表名>是指要插入数据的目标表;
<列名表>是指定目标表的目标列,该参数可以省略;如果省略列名表,表示向目标表所有列插入数据;
<值表>是指定具体要插入的值。
用SELECT插入,格式为:
INSERT INTO <基表名> [(<列名表>)]
<SELECT 子句>
<SELECT子句>可以使用前面介绍的所有SELECT查询语句,但要保证<SELECT子句>中选择的列与<列名表>中的列一一对应,且数据类型和长度兼容,但列名可以不同,只要求位置相对应。
数据修改
数据修改语法格式:
UPDATE<基表名>
SET <列名1>=<表达式2>,<列名2>=<表达式2>…
[WHERE <条件表达式>]
数据删除
数据删除语法格式:
DELETE FROM <表名>
[WHERE<条件>]
视图
视图的特点:
虚表,是从一个或几个基本表(或视图)导出的表
只存放视图的定义,不会出现数据冗余
基表中的数据发生变化,从视图中查询出的数据也随之改变
当视图建立后,用户可以象基表一样对视图进行数据查询,在某些特殊情况下,还可以对视图进行修改和插入操作。
视图优点:
限制用户直接存取基表的某些列或记录,从而为基表带来附加的安全性;
视图可定义在多个基表上或其他视图上,通过视图可得到多个表经计算后的数据,从而隐藏数据的复杂性。
创建视图语法:
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
省略列名时,则由子查询中SELECT目标列中的诸字段组成
明确指定视图的所有列名:
某个目标列是集函数或列表达式
目标列为 *
多表连接时选出了几个同名列作为视图的字段
需要在视图中为某个列启用新的更合适的名字
DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。
子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语
操作
修改操作:DBMS自动加上Ddeptno= ‘101'的条件
删除操作:DBMS自动加上Ddeptno= ‘101'的条件
插入操作:DBMS自动检查Ddeptno属性值是否为‘101'
如果不是,则拒绝该插入操作
如果没有提供Ddeptno属性值,则自动定义Ddeptno为‘101'
删除视图
删除视图语法:
DROP VIEW <视图名>
删除视图示例:
删除视图DiagView 。
DROP VIEW DiagView
视图的实现
1.实体化视图(View Materialization)
有效性检查:检查所操作的视图是否存在
执行视图定义,将视图临时实体化,生成临时表
对视图的操作转换为对临时表的操作
操作完毕删除被实体化的视图(临时表)
2.视图消解法(View Resolution)
进行有效性检查,检查操作的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义
把视图定义中的子查询与用户的查询、更新请求结合起来,转换成等价的对基本表的查询、更新操作
执行修正后的查询、更新操作
视图的查询
SELECT * from DiagView
where Pname=‘刘姚辉’
视图实体化法
视图消解法
有些情况下,视图消解法不能生成正确查询。采用视图消解法的DBMS会限制这类查询。
更新视图
由于视图是不存储数据的虚表,数据是来自其他基表部分数据,因此,对视图的更新最终是对基表的更新。
SQL语言标准规定:只能对直接定义在一个基表上的视图进行插入、修改、删除等更新操作,对定义在多个基表或其它视图之上的视图,数据库管理系统不允许进行更新操作。
例如:在医院数据库中,创建了医生为患者的诊断信息视图。该视图为不可修改视图。
尽管视图数据只来源于一个基表,如果SELECT语句含有GROUP BY、DISTINCT或聚集函数等,除可执行删除操作外,不能进行插入或修改操作。
例如:在医院数据库中,如果需要统计每位医生每天诊断工作量,建立如下视图,该视图除可执行删除操作外,不能进行插入或修改操作。
如果视图中包含由表达式计算的列,则不允许进行更新操作。
例如:在药品信息表中,假如为药品单价提高15%后建立的药品价格视图,则不能修改该视图中的药品单价。
尽管视图满足上述3个条件,如果该视图中没有包含基表的所有NOT NULL列,则不能对该视图进行插入操作。
原因是,对视图的插入实际是对基表的插入操作,当视图没有包含基表的所有NOT NULL列时,在向视图进行插入时,系统默认为NULL,这与定义中的NOT NULLL相矛盾,因此系统就会拒绝插入并给出错误提示。
视图的作用
视图能够简化用户的操作
当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作
基于多张表连接形成的视图
基于复杂嵌套查询的视图
含导出属性的视图
视图使用户能以多种角度看待同一数据
视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要
视图能够对机密数据提供安全保护
对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
通过WITH CHECK OPTION对关键数据定义操作时间限制
利用视图可以清晰地表达查询
复杂查询分步实现
视图对重构数据库提供了一定程度的逻辑独立性
物理独立性与逻辑独立性的概念?
视图在一定程度上保证了数据的逻辑独立性
由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变
索引
索引的概念
类似于词典的索引,索引是关于数据位置信息的关键字表。
数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的记录所在的存储位置。
可以为表中的单列或多列创建索引;
索引通常采用采用B树或B+树等结构。
数据库系统检索数据时,根据索引提供的信息,可以直接找到与该条件临近的数据区,而不是一条一条记录地比较,因此可提高查询速度。
索引的概念
建立索引是加快查询速度的有效手段
索引由DBMS内部实现,属于内模式范畴
建立索引
DBA或表的属主(即建立表的人)根据需要建立
有些DBMS自动建立以下列上的索引: PRIMARY KEY和 UNIQUE
维护索引
DBMS自动完成
使用索引
DBMS自动选择是否使用索引以及使用哪些索引
分类
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致
在一个基本表上最多只能建立一个聚簇索引
聚簇索引的用途:对于某些类型(范围查找)的查询,可以提高查询效率
聚簇索引的适用范围
很少对基表进行增删操作
很少对其中的变长列进行修改操作
示例:
CREATE CLUSTER INDEX Stusname ON Student(Sname);
非聚簇索引
数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。
索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(也可以由聚簇索引规定)。
在搜索数据值时,先对非聚集索引进行搜索,找到数据值在表中的位置,然后从该位置直接检索数据。
由于索引包含描述查询所搜索的数据值在表中的精确位置的条目,这使非聚集索引成为精确匹配查询的最佳方法。
唯一值索引
唯一索引确保索引列不包含重复的值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。
聚集索引和非聚集索引都可以是唯一的。因此,只要列中的数据是唯一的,就可以在同一个表上创建一个唯一的聚集索引和多个唯一的非聚集索引。
创建PRIMARY KEY或UNIQUE约束会在表中指定的列上自动创建唯一索引。
在同一个列组合上创建唯一索引而不是非唯一索引可为查询优化器提供附加信息,所以最好创建唯一索引。
索引原则
选择数据量较大的表建立索引
一般来说,对于数据量较大的表,数据库系统越有机会找到最短路径,索引越能更好地改善响应的时间,越能显示出优势。
索引对于列中的数据多而杂的列是特别有用。例如,在医院信息系统中,如果对患者诊断信息建立索引,速度提高的效果就比较明显。但是,不适宜在性别列上建立索引,因为有大量重复值,对其索引反而会降低查询速度。
对于数据量较小的表最好不要建立索引,因为对小表索引,速度提高不仅不明显,反而会增大系统的开销,除非有特殊需要,要建立唯一索引来加强唯一。
建立索引的数量要适量(需要付出代价)
尽管对一个基表可以建立多个索引,提高查询速度,但不宜建立太多的索引,最好不超过3个。
索引要占用磁盘空间;
系统要维护索引结构,维护索引结构系统要花费一定的开销,尤其是经常要插入或删除的表,其维护索引结构的代价是很大的,因此建立索引会减慢插入、修改、删除的执行速度。
用户应该在加快查询速度和降低更新速度之间作出权衡。对于一个仅用来查询的表来讲,建立多个索引是比较合适的,但对更新操作比较频繁的表来讲最好少建立一些索引。
选择合适的时机建立索引
通常,建立索引应选择在表中装入数据之后。如果先建立索引后装入数据,则每次插入一行数据都要对索引进行更新,这样会很浪费时间。
但是,如果要保证装入数据的唯一性,则只能以牺牲系统性能为代价,而在装入数据前建立唯一性索引。
优先考虑主键列建立索引
当主键包含多列时,最好把数据差异最多的列放在索引命令列表的首位。
如果各列数据种类相近,则最好把经常用到的列放在前面。
最好选择包含大量非重复值的列,如医生编号。
如果只有很少的非重复值,如性别只有男和女,最好不要使用索引查询,此时采用顺序扫描更为有效。
创建索引语法格式
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX <索引名>
ON < 基表名 | 视图名> ( 列名[ ASC | DESC ] [ ,...n ] )
创建索引示例
单列索引
在药品基本信息表中,假如在药品名称上,按照升序创建非聚簇索引。
CREATE NONCLUSTERED INDEX MedIndex
ON Medicine(Mname ASC)
复合索引
在处方详细信息表中,假如在处方编码和药品编码上,创建聚簇索引。
CREATE CLUSTERED INDEX RDIndex
ON RecipeDetail (Rno ASC,Mno DESC)
唯一索引
在医生基本信息表上,假如在医生编码上,创建唯一索引。
CREATE UNIQUE INDEX DoctorIndex
ON Doctor (Dno ASC)
删除索引
删除索引语法
DROP INDEX 索引名
删除索引示例
删除DoctorIndex索引。
DROP INDEX DoctorIndex
数据表的操作
数据类型
char(n)
固定长度字符串,长度范围是1~8000,默认值为1。
nchar(n)
固定长度Unicode字符串,长度范围是1~4000,默认值为1。
varchar(n)
变长字符串,长度范围是1~8000,如省略n,则默认最大长度是1。
nvarchar(n)
包含n个字符的可变长度Unicode字符数据,n的取值介于1与4000之间;如省略n,则默认长度是1。
text
变长字符数据,最多达到231-1字节,行中存储指向第一个数据页的指针,实际的文本是以B-树页面存储。
ntext
变长Unicode字符数据,最多可达230-1字节,行中存储指向第一个数据页的指针,实际的文本是以B-树页面存储。
dec(n,m)
decimal(n,m)
数值型,n是位数,范围是1~38,m是小数点右边的位数,范围是0~n。可用decimal(n)表示decimal(n,0);如果用不带参数的decimal时,系统默认表示decimal(38,0),但是,这时SQL Server最大可达到28位。推荐decimal使用明确的n,有助于提高程序的清晰度。
numeric(n,m)
int,integer
四字节二进制整数,范围是-231~231-1。
float(n)
浮点数,n是尾数位数,范围是1~53。如果n为1~24则指定单精度(4字节),如果n为25~53则指定双精度(8字节);注意:可以使用Float本身表示Float(53)。
real
等价于Float(24),Real列有7位数精度。
smalldatetime
四字节日期和时间,日期范围是~6-6-2079;时间精度是自午夜开始的1分钟之内。
Datetime
八字节日期和时间,日期范围是~12-31-9999,时间精度:3.33毫秒之内。
binary(n)
定长二进制数据,长度范围是1~8000字节,如省略n,则默认值是1。
varbinary(n)
变长二进制数据,长度从1~8000字节,如省略n,则默认值是1。
image
变长二进制数据,用于储存图形数据,最长为231-1字节,行中存储指向第一个数据页的指针,实际的数字以B-树的页面存储。
常用完整性约束
主码约束: PRIMARY KEY
唯一性约束:UNIQUE
非空值约束:NOT NULL
参照完整性约束:Foreign Key
<表名>:要修改的基本表
ADD子句:增加新列和新的完整性约束条件
DROP子句:删除指定的完整性约束条件
ALTER子句:用于修改列名和数据类型
DROP TABLE <表名> [RESTRICT|CASCADE];
RESTRICT:拥有表的对象(Check、Foreign Key、视图、触发器、存储过程、函数等)时禁止删除;
CASCADE:级联删除表的所有对象
不同数据库产品略有执行策略的差别
使用ALTER TABLE语句还可以从表中删除已有的列,但删除列之前,必须删除任何引用该列的约束、缺省表达式、计算列表达式或索引
数据库的操作
数据库是包含多个对象的集合,包含了相关的基表、视图、索引、存储过程、与数据库安全性有关的控制机制及其他对象。
简单示例: 为了创建数据库,用户必须是系统管理员或者被授权使用CREATE DATABASE语句 : Create Database HIS
可以对数据库原始定义进行更改,更改包括:
扩充数据库的数据或事务日志存储空间;
收缩分配给数据库的数据或事务日志空间;
添加或删除数据和事务日志文件;
更改数据库的配置设置;
更改数据库名称;
更改数据库的所有者等。
SQL简介
SQL:Structured Query Language
SQL决不仅仅是一个查询工具,还用于控制DBMS提供给用户的所有功能:
数据定义(Data definition):
SQL可用于定义被存放数据的结构和组织,以及数据项之间的关系。
数据检索(Data retrieval):
SQL能使用户或应用程序从数据库中检索数据并使用这些数据。
数据操纵(Data manipulation):
用户或应用程序通过SQL更改数据库,如增加新数据,删除旧数据,修改已存入的数据等。
存取控制(Access control):
SQL可用来限制用户检索,增加和修改数据的权限,保护所存储的数据不被非法存取。
数据共享(Data sharing):
SQL可用于调整数据让并发用户共享,以保证用户之间彼此不受影响。
数据完整性(Data integrity):
SQL能对数据库的完整性条件作出规定,以使其不会因为修改紊乱或系统出错而被破坏。
工作机理
支持三级模式
综合统一
集DDL、DML、DCL的功能于一体
可以在运行后根据需要随时修改模式
数据操作符统一
高度非过程化
只需提出“做什么”,而无需指明“怎么做”。
无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成
面向集合的操作方式
操作对象和结果均为集合
以同一种语法结构提供两种使用方法
既是自主式语言,又是嵌入式语言
语言简洁,易学易用,核心功能只需9个动词
DDL:CREATE、DROP、ALTER
DML: SELECT、INSERT、UPDATE、DELETE
DCL:GRANT、REVOKE
学习目标
掌握表中数据的操作(查询、更新)
掌握视图、索引的概念
理解索引的建立原则
理解视图的实现机理及作用
能够实现SQL与关系代数表达式的等价转换