课前(等待操作)
#
insert into 后跟子查询的实践
即 insert into name select 列 from name1 where ---
视图
#
视图是从一个或者几个基本表导出的表
视图的子查询通常不允许有order by和distinct短语
//mysql是允许的
with check option //表示对视图进行update、insert、delete时要满足子查询中的条件表达式
视图可以从多表建立;
可以从其他视图;以及视图和基本表;
基本表为了避免冗余数据,
一般只存放基本基本数据,
而那些通过计算等派生的数据一般用视图,
因为视图不是实际存在的,是虚表。
派生出基本表没有的列叫做虚拟列,
带虚拟列的视图也成为表达式视图。
还可以用带有函数集和group by 子句的查询来定义视图,这种视图又成为分组视图
视图 用了as
create view name(列,列2)as select ....
where 后面不能用集函数作为表达式
集函数 类似count(),avg()等
关于with check on 的实例
#
加入with check on 语句的view 在以后添加数据时,会先判断是否满足创建view表时的条件:
create view view_uni as select id,name,sal from uni where id <3 with check option;
select * from view_uni;
+------+-------+------+
| id | name | sal |
+------+-------+------+
| 1 | Jan | 1000 |
| 2 | Grand | 2000 |
+------+-------+------+
这里设置了id < 3,当插入id >=3 时
#
insert into view_uni(id) values(3);
ERROR 1369 (HY000): CHECK OPTION failed 'day32.view_uni'
修改(更新)视图会修改基本表
#
update view_uni set id=4 where sal=2000;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from view_uni;
+------+--------+------+
| id | name | sal |
+------+--------+------+
| 1 | Jan | 1000 |
| 4 | Grand | 2000 |
| 3 | Grands | 3000 |
| 2 | guo | 4000 |
+------+--------+------+
mysql> select * from uni;
+------+--------+------+
| id | name | sal |
+------+--------+------+
| 1 | Jan | 1000 |
| 4 | Grand | 2000 |
| 3 | Grands | 3000 |
| 2 | guo | 4000 |
+------+--------+------+
依赖列被修改时,该列也会被修改
#
create view view_uni as select id,name,sal,sal*1.5 as upsal from uni;
//upsal 依赖sal
select * from view_uni;
+------+--------+------+--------+
| id | name | sal | upsal |
+------+--------+------+--------+
| 1 | Jan | 1000 | 1500.0 |
| 4 | Grand | 2000 | 3000.0 |
| 3 | Grands | 3000 | 4500.0 |
| 2 | guo | 4000 | 6000.0 |
+------+--------+------+--------+
update view_uni set sal=1500 where id=1;
select * from view_uni;
+------+--------+------+--------+
| id | name | sal | upsal |
+------+--------+------+--------+
| 1 | Jan | 1500 | 2250.0 |
| 4 | Grand | 2000 | 3000.0 |
| 3 | Grands | 3000 | 4500.0 |
| 2 | guo | 4000 | 6000.0 |
+------+--------+------+--------+
#
视图的作用
1.试图能简化用户的操作
2.视图用户能以多种角度看待同一问题;
3.视图对重构数据库提供了一定程度的逻辑独立性;
4.视图能对机密数据提供安全保护。
授权
#
grant slect(权限) on table(对象类型)uni(对象)to user(用户)
+--------+--------+------+--------+--------+--------+--------+--------+---------+
| 对象 | 对象类型 | 操作权限 |
+--------+--------+------+--------+--------+--------+--------+--------+---------+
| 属性列 | table | select,insert,update,delete,all privileges |
| 视图 | table | select,insert,update,delete,all privileges |
| 基本表 | table | select,insert,update,delete,index all privileges |
| 数据库 | database | createtable |
+--------+--------+------+--------+--------+--------+--------+--------+---------+
收回权限
#
revoke slect(权限) on table(对象类型)uni(对象)to user(用户)
嵌入式SQL
#
DBMS课采用两种方式处理
一是预处理,DMBS预处理程序时将其主语言调用语句
二是修改、扩充主语言使之能处理sql语句
#
在c中以;结束,开头加exec sql
exec sql <sql语句>
exec sql drop table uni
数据库单元与源程序工作单元之间的通信主要包括:
#
1.向主语言传递SQL语句执行状态信息,使主语言能够据此信息控制程序流程,主要SQL通信区(SQLCA)SQL通信(SQLCA)区是一个数据结构;
2.主语言向SQL提供参数,主要用主变量(Host Variable)实现;
3.将SQL语句查询数据库的结果交主语言进一步处理,主要用主变量和游标(Cursor)实现
#
主变量
我们把SQL语句中实用的主语句程序变量叫做 主变量
主变量
输入主变量
由引用程序对其赋值,SQL语句调用。
输出主变量
由SQL语句对其赋值豁设置状态信息,返回给应用程序
主变量可能即是输入主变量又是输出主变量。
一个主变量可以附带一个指示变量
指示变量是一个整形变量,用来 指示 主变量的值或条件
所有主变量和指示变量必须在SQL语句begin declare section与end declare section之间进行说明
SQL语句中主变量、指示变量前要加:作为标志
游标
#
SQL语句是面向集合的,一次可产生或处理多条记录,而主语言是面向记录的,一组主变量只能存放一条记录,为此引入 游标
游标:是系统为什么用户开设的一个数据缓冲区,存放SQL语句执行结果的,每个游标区都有一个名字。用户可以通过游标逐一获取记录,并赋值给主变量,交由主语句进一步处理。
游标实际上反映了嵌入式SQL的工作原理
不使用游标的语句:
#
*说明性语句
*数据定义语句
*数据控制语句
*查询结果为单一记录的select语句
*非current形式的update语句
*非current形式的delete语句
*insert语句
所有的说明性语句及数据定义与控制语句都不需要使用游标。它们是嵌入式SQL语句中最简单的一类语句。
使用游标的语句
# *查询结果为多条的select语句
*current形式的update语句
*current形式的delete语句
动态SQL
#
为了弥补静态SQL语句的不足
动态SQL语句有三种形式:
*语句可变
*条件可变
*数据库对象可变、查询条件均可变
查询优化
#
查询优化的一般准则
*选择运算尽可能先做。在优化策略中这是最重要最基本的一条。
*在执行链接前对关系适当的预处理
*把投影(project)和选择运算同时进行。
*把投影同其前或后的双目运算结合起来
*把某些选择同它前面要执行的笛卡尔积结合起来成为一个连接运算,连接特别是等值连接运算要比同样关系的笛卡尔积省很多时间
*找出公共子表达式
关系数据理论
#
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。
满足最低要求的叫做第一范式。
第一范式:
满足这个关系模式:每一个分量必须是不可分的数据项。