1,SQL语言是集DDL、DML和DCL于一体的数据库语言。
2,SQL分为交互式SQL、动态SQL、嵌入式SQL
3,DDL语句引导词
模式的定义和删除,包括定义Database, Table, View, Index,完整性约束条件等,也包括定义对象(RowType行对象, Type列对象)
- Create
创建数据库:Create database 数据库名;
创建表:
Create table 表名( 列名 数据类型 [Primary key |Unique] [Not null]
[, 列名 数据类型 [Not null] , … ]) ;
其中,[]代表可选。Primary key: 主键约束。每个表只能创建一个主键约束。Unique: 唯一性约束(即候选键)。可以有多个唯一性约束。 Not null: 非空约束。 Create Table有三种功能:定义关系模式、定义完整性约束(见下一篇博客)和定义物理存储特性。
- Alter
alter table tablename
[add {colname datatype, …}] 增加新列
[drop {完整性约束名}] 删除完整性约束
[modify {colname datatype, …}] 修改列定义
删除学生姓名必须取唯一值的约束:Alter Table Student Drop Unique( Sname );
- Drop
drop table 表名
注意,SQL-delete语句只是删除表中的元组(没有删除关系模式), 而撤消基本表drop table的操作(删除关系模式)是撤消包含表格式、表中所有元组、由该表导出的视图等相关的所有内容,所以使用要特别注意。
4,DML语句引导词
各种方式的更新与检索操作,如直接输入记录,从其他Table(由SubQuery建立)输入; 各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找等; 各种聚集操作,求平均、求和、…等,分组聚集,分组过滤等。
- Select
Select 列名 | expr | agfunc(列名) [[, 列名 | expr | agfunc(列名) ] … ]
From 表名1 [, 表名2 … ]
[ Where 检索条件 ]
[ Group by 分组条件 [ Having 分组过滤条件] ] ;
多表联合检索可以通过连接运算来完成,而连接运算又可以通过广义笛卡尔积后再进行选择运算来实现。连接操作是很费时间的。注意多表的连接查询包括等值连接和不等值连接。没有Group b子句不能使用Having子句
- Delete
Delete From 表名 [ Where 条件表达式] ;where条件缺省时表示删除表中的所有元组。
- Insert
insert into 表名[ (列名 [, 列名 ]… ]
values (值 [, 值] , …) ;
values 后面值的排列,须与 into 子句后面的列名排列一致; 若表名后的所有列名省略, 则 values后的值的排列,须与该表存储中的列名排列一致。注意上面的是插入单一元组,也可以进行批量插入,把values变成Select就可以。当新增元组时, DBMS 会检查用户定义的完整性约束条件等,如不符合完整性约束条件,则将不会执行新增动作。
- Update
Update 表名
Set 列名 = 表达式 | (子查询)
[ [ , 列名 = 表达式 | (子查询) ] … ]
[ Where 条件表达式] ;
如果where语句缺省,表示更新所有元组。
5,DCL语句引导词
安全性控制:授权和撤消授权。
- Grant
GRANT {all PRIVILEGES | privilege {,privilege…}}
ON [TABLE] tablename | viewname
TO {public | user-id {, user-id…}}
[WITH GRANT OPTION];
//user-id ,某一个用户账户,由DBA创建的合法账户
//public, 允许所有有效用户使用授予的权利
//privilege是下面的权利
//SELECT | INSERT | UPDATE | DELETE | ALL PRIVILEDGES
//WITH GRANT OPTION选项是允许被授权者传播这些权利
授予视图访问的权利,并不意味着授予基本表访问的权利(两个级别:基本关系级别和视图级别); 授权者授予的权利必须是授权者已经拥有的权利。
- Revoke
REVOKE {all privilEges | priv {, priv…} } ON tablename | viewname
FROM {public | user {, user…} };
6,子查询
很多时候需要进行下述条件的判断:
集合成员资格:某一元素是否是某一集合的成员
集合之间的比较:某一个集合是否包含另一个集合等
集合基数测试:测试集合是否为空;测试集合是否存在重复元组
- 相关子查询
内层查询需要依靠外层查询的某些参量作为限定条件才能进行的子查询;外层向内层传递的参量需要使用外层的表名或表别名来限定。例如:
//求学过001号课程的同学的姓名
Select Sname
From Student Stud
Where S# in ( Select S#
From SC
Where S# = Stud.S# and C# = ‘001’ ) ;
- some与all子查询
- EXISTS和NOT EXISTS子查询
[not] Exists (子查询) 语义:子查询结果中有无元组存在
示例:列出没学过李明老师讲授任何一门课程的所有同学的姓名
Select Sname From Student
Where not exists //不存在
( Select * From Course, SC, Teacher //学过一门课程
Where Tname=‘李明’ and Course.T# =Teacher.T#
and Course.C# = SC.C# and S# = Student.S# );
7,关系代数操作
语法:子查询 { Union [ALL] | Intersect [ALL] | Except [ALL] 子查询 }
通常情况下自动删除重复元组:不带ALL。若要保留重复的元组,则要带ALL。
- UNION 并
- INTERSECT 交
- EXCEPT 差
8,空值的处理
空值是其值不知道、不确定、不存在的值; 数据库中有了空值,会影响许多方面,如影响聚集函数运算的正确性,不能参与算术、比较或逻辑运算等。 is [ not ] null (测试指定列的值是否为空值)
9,外连接和内连接
语法如下图:
10,视图
对应概念模式的数据在SQL中被称为基本表(Table), 而对应外模式的数据称为视图(View)。
基本表是实际存储于存储文件中的表,基本表中的数据是需要存储的;视图在SQL中只存储其由基本表导出视图所需要的公式,即由基本表产生视图的映像信息,其数据并不存储,而是在运行过程中动态产生与维护的; 对视图数据的更改最终要反映在对基本表的更改上。
定义视图
create view view_name [(列名[,列名] …)]
as 子查询 [with check option]
如果视图的属性名缺省,则默认为子查询结果中的属性名;也可以显式指明其所拥有的列名。 with check option指明当对视图进行insert,update,delete时,要检查进行insert/update/delete的元组是否满足视图定义中子查询中定义的条件表达式。
定义视图,有时可方便用户进行检索操作。可以理解为封装了一个函数,使用的时候调用即可,不必每次都写一遍这个函数了。
- 视图的更新
是比较复杂的问题,因视图不保存数据,对视图的更新最终要反映到对基本表的更新上,而有时,视图定义的映射不是可逆的。
- 撤销视图
Drop View view_name