关系数据库标准语言——SQL
1.SQL
的基本概念
1.基本表
一个关系对应一个基本表。基本表是独立存在的表,不是由其他表导出的。一个,或者多个机泵表对应一个存储文件。
2.视图
视图是从一个或者几个基本表导出的表,是一个虚表。数据库中只存放视图的定义不存放视图的数据,这些数据任然存放在导出视图的基本表中。
2.SQL
的主要特点
1.语法简单,类似于英语的自然语言,简洁易用。
2.SQL
是一体化的语言,包括数据定义,数据查询,数据操纵,和数据控制等方面的功能,可以完成数据库活动中全部的工作。
3.SQL
是一种非过程化的语言,用户不需要关注具体的操作过程,不必了解数据的存取路径。
4.SQL
是一种面向集合的语言,每个命令的操作对象是一个或者对个关系,结果也是一个关系。
5.SQL
既是自含式语言又是嵌入式语言。自含式语言可以独立使用交互式命令,嵌入式语言可以将其嵌入到高级语言中使用。
3.SQL
的运用
1.数据库的创建和使用
1.创建数据库
``create database 数据库名`
[on
(
name=数据文件的逻辑名称,
filename='路径+数据文件名',
size=数据文件的初始大小,
maxsize=数据文件的最大容量,
filegrowth=日志文件自动增长的容量,
)]
[log on (
name=日志文件逻辑名称,
filename='路径+日志文件名',
size=日志文件初始文件大小,
maxsize=日志文件的最大容量,
filengrowth=日志文件自动增长容量’
)]
[collate数据库校验方式名称]
[for attach]
说明
(1)[]中的语句在创建数据库的过程中可以选用或者不用。
(2)数据库校验方式可以使Windows校验也可以是SQL
校验方式。
(3)for attach
表示将已经存在的数据文件附加到新的数据库文件中。
2.修改数据库
可以使用 alter database
命令修改数据库。(只有数据库管理员(DBA)或者有 create database
权限的人员才有权执行此命令)。
alter database 数据库名称
add file(
具体文件格式
)
说明
(1)add file:向数据库中添加数据文件
(2)add log file :向数据库中添加日志文件
(3)remove flie :从数据库中删除逻辑文件,并删除物理文件
(4)modify file :指定要修改的文件
(5)add filegroup:向数据库中添加文件组
……
3.删除数用户据库
drop database 数据库的名称
2.数据表的创建和使用
1.创建数据表
create 表名
(列名 数据类型(长度)[约束]
……
)
说明
1.定义数据表的约束
(1)null/not null 约束
既不是空格,也不是0,更不是null字符串,而是表示,不知道,不确定,或者没有数据。
(2)unique约束
用于指明基本表在某一列或者多个列的组合上取值必须唯一。定义了唯一约束的那些列称为唯一键,系统会自动为唯一键建立唯一索引,从而保证了唯一键的唯一性。
(3)primary key 约束
(主键约束)
用于定义基本表的主键,其唯一标识作用,其值不能为空,也不能重复,以保证实体的的完整性
(4)check 约束
check约束用来检查字段所允许的范围。
2.修改数据表
(1)add方式。用于增加新列和完整性约束。定义的方式和 create table
中的定义方式相同。
(2)alter方式。用于修改某些列。
注意
该方式不能改变列名,不能将含有空值的列的定义修改为 not null约束
,如果列中已有数据则不能改变列的宽度,也不能改变其数据类型,智能修改 null/not null 约束
,修改其他的约束的时候必须先将其删除然后重新定义新的约束。
(3)drop方式。只用于删除完整性约束定义
3.删除基本表
drop table 表名
3.单关系(表)数据的查询
1.查询的结构
select 列名[all|ditinct][as 别名]
from 表名
[where 检索的条件]
[group by 列名 having 条件表达式]
[ order by 列名[asc|desc] ]
2.无条件查询
相当于只进行投影操作
select
sno
from
s
3.条件查询
需要使用到where子句,通常有三部分构成,
(1)列名
(2)比较运算符
(3)列名,常数
4.常用的库函数以及统计汇总查询
注意
函数SUM和函数AVG只能对数值字段进行计算
5.分组查询
使用group by子句可以将查询的结果按照属性列或者属性列的组合在行的方向上进行分组,每组在属性列或者属性列的组合上值是相同的。
如果在分组后好需要进行一定条件的筛选操作,则需使用having子句。having子句作用于组,选择满足于条件的组。必须使用在group by 子句之后,但是group by子句可以不需要having子句。
6.查询结果排序
当需要对查询的结果排序的时候需要使用order by子句,order by子句必须出现在其他子句之后。排序的方式可以自己指定,升序(asc),降序(desc),如果不指定,默认为升序。
4.多关系(表)的连接查询
1.查询结构
1.表之间满足一定条件进行连接时,from子句指明进行连接的表名,where子句指明连接的条件以及连接的列名。
2.利用关键字JOIN进行连接
(1)inner join内连接(默认方式)
(2)left join 左外连接,用于显示符合条件的数据行以及左边表中不符合条件的数行,此时右边的数据行使用NULL来表示。
(3)right join 右外连接,用于显示符合条件的数据以及右边表中不符合条件得数据行,缺乏数据时用NULL来显示。
(4)full join显示符合条件的数据以及左边和右边不符合条件的数据行,缺乏数据时用NULL来显示。
(5)cross join 讲一个表的每一个记录和另一个表的每个记录皮胚匹配成新的数据行。
当join关键字放在from子句中是应该有关键字on与之对应,以表明连接的条件。
2.内连接查询
查询所有选课学生的学号,成绩,姓名、选课名称
select sno ,score,sn,cn
from s,c,sc
where s.sno=sc.sno and c.cno=sc.cno
3.外连接查询
外连接查询分为左外连接和右外连接,主表在左称为左外连接,主表在有称为右外连接。
4.交叉查询
对连接查询(cross join)的表没有任何特殊的要求,任何表都可以交叉查询操作
5.自连接查询
当一个表与自身进行连接操作时,称为表的自连接查询。
5.子查询
当where子句包含一个 select-from-where的查询块的时候,该查询块称之为子查询或者称为嵌套查询。
子查询的嵌套最多可以达到255层。
嵌套查询的执行时由里向外的,每一个子查询的结果都会被父查询用到。
1.普通子查询
执行顺序,先执行子查询,然后将子查询的结果作为父查询的条件。普通的子查询只执行一次。
1.返回一个值的普通子查询
当子查询返回只有一个值的时候,可以使用比较运算符将父查询和子查询连接起来
2.返回一组值的普通子查询
如果子查询的返回值不只是一个的时候,而是一个集合的时候,不能直接使用比较运算符,可以在比较运算符和子查询直接使用any或all
any的含义是任何一个的意思,all的意思是全部的意思。
可以使用in来代替“=any”
2.相关子查询
相关子查询的执行顺序是,先去父查询中的第一行记录,内部的子查询使用此行中相关的属性值进行查询,然后父查询根据子查询返回的结构判断此行是否满足查询条件。如果满足,把该行放入父查询的查询结果集合中。重复执行这一结果直到处理完父查询中的每一行的数据。即,相关子查询的执行次数是由父查询表的行数决定的。
6.其他类型的查询
1.集合运算查询
使用union操作符将来自不同查询的数据组合起来,形成一个具有综合信息的查询结果。union会自动将重复的数据行剔除掉,但是参加集合查询的各子查询的使用的表结构应该相同,即各子查询中的数据数目和对应的数据类型都必须相同。
2.将查询的几结果存储到表中
使用select……into语句可以将查询的结果存储到一个新建的数据库表或者临时表中
7.数据表中的数据操作
1.添加数据表中的数据
将新的记录添加到一个已经存在的表中。
1.添加一行新记录
insert……into 表名 [列名]
values(值)
注意
(1)表名是要添加记录的表的名字
(2)values子句是要添加的具体的值
(3)列名的顺序不一定要和定义表的时候列的顺序一致,但是,values添加得数据的顺序必须要和列名一一对应,即个数相等,数据类型对应。
(4)values中的数据必须用逗号分开,字符型数据必须要用单引号括起来,
添加多行记录
添加多行数据用于表间的复制,即将一个表中的多行数据抽取数行添加到另一个表中可以通过子查询来实现
insert into 表名
子查询
2.修改数据表中的数据
使用update语句对表中的一行或者多行的数据的某些列进行修改
update 表名
set列名=表达式
[where 条件]
3.删除表中的数据
使用delete语句可以删除表中的一行或者多行的数据
delete
from 表名
[where 条件]
注意
(1)其中表名是指要删除数据的数据表
(2)如果没有where子句,则代表删除的是整个数据表中的记录
8.视图
视图是一个虚拟表,其内容由查询定义。视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。视图中的行和列数据来自定义视图的查询所引用的基本表,并且在引用视图时动态生成。
视图的作用类似于筛选。
1.视图的创建
使用create view语句创建视图
create view 视图名
as select[(列名)]
from 表名
where 条件
说明
(1)视图的访问仅限于指定的列,从而达到了数据保密的目的
2.修改视图
使用alter view语句实现对视图的修改
alter view 视图名[视图列表]
as 子查询
3.视图的删除
使用drop view实现对视图的删除
drop view 视图名
4.视图的查询
视图的查询和对基本表的查询操作一样
5.更新视图
更新视图包括添加,修改,删除数据操作,其语法的格式同对基本表的操作一样
1.添加
insert into 视图名[(列名)]
values (值)
2.修改
update 视图名
set 列名=表达式
where 条件
3.删除
delete
from 视图名
where 条件
9.索引
1.索引的概述
索引是一种可以加快检索的数据库结构,它包含从表或者视图一列或者多列生成的键,以及映射到指定数据存储位置的指针。
通过设计、创造良好的索引可以显著的提高数据库的查询和应用程序的性能。
索引一旦创建,将由DBMS自动管理和维护。但是要避免在一个表中创建大量的索引,否则会影响插入,删除
更新数据库的性能,增加索引调整的成本,降低系统的响应速度。
2.缩影的分类
1.聚集索引
在聚集索引中,表中行的物理存储顺序与索引键的逻辑(索引)顺序相同。
真正的物理存储只有一个,因此在一个表中,只能包含一个聚集索引。创建和修改聚集索引会非常耗费时间,因为要涉及到物理存储顺序的调整。
可与考虑创建聚集索引的情况
(1)包含有限数量的唯一值的列。
(2)使用between,>、<、……等这样运算符返回的某个范围值的查询。
(3)返回大型结果集的查询。
2.非聚集索引
与聚集索引具有相似的索引结构,但是。不同的是,非聚集索引不影响数据行的物理存储顺序,数据行的物理存储顺序与索引键的逻辑(索引)顺序不同。
每个数据表可以有多个非聚集索引,非聚集索引可以提高查询数据的速度,但是,同样会降低插入和更新数据的速度。
3.唯一索引
(1)唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行在某种方式上具有唯一性。
(2)只有当唯一性是数据本身的特征时,指定唯一索引才有意义。
(3)聚集索引和非聚集索引都可以是唯一的,可以同为一个表创建一个聚集索引和多个非聚集索引,
(4)创建primary key和unique 约束的时候,会为指定的列自动创建唯一索引。
4.视图索引
视图的使用和基本表类似,所以对视图创建唯一聚集索引后结果集就可以直接存储子数据库中,就像带有聚集索引的基本表一样。
如果很少更新基本表的数据可考虑使用视图索引,效果会更佳。
5.全文索引
全文索引是目前搜索引擎的关键技术之一。也称为倒排文档技术。其原理就是先定义一个词库,然后在文档查找并存储没个词条出现的位置和频率。相当于对文件简历了一个以词库为目录的索引,这样查找某个词的时候就可以很快的定位到改词出现的位置。
6.xml索引
可以对xml类型的数据建立xml索引。
3.创建索引
可以使用create index语句创建索引,既可以创建聚集索引,又可以创建非聚集索引,既可以在一列上创建索引,也可以在多列上创建索引。
create [unique] [clustered|nonclustered] index 索引名
on 基本表或者视图名(列名)
4.修改索引
通常情况下,索引创建后有DBMS自动维护更新。
5.删除索引
drop index 视图或者表名.索引名
6.查看索引
1.使用Sp_helpindex查看索引
EXEC Sp_helpindex 表名