Sql Server期末复习

2023-11-11

基础概念

数据库管理系统:是位于用户与操作系统之间的一层数据管理软件。

数据库系统:由数据库、数据库管理系统、应用程序和数据库管理员组成

​ 即 DBS=DB+DBMS + 应用程序 + DBA

数据库系统的三层模式结构:外模式、模式、内模式

  • 模式:也成逻辑模式,是数据库中全体数据的逻辑结构和特征的描述。
  • 外模式:子模式/用户模式,一个数据库可以有多个外模式,数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述。
  • 内模式:存储模式,一个数据库只有一个内模式,是数据物理结构和存储方式的描述。

二级映像功能:外模式/模式映像 和 模式/内模式映像

  • 外模式/模式映像 :模式改变时由数据库管理员对各个外模式/模式的映像进行改变,从而保证外模式保持不变,应用程序是依据外模式编写的,从而保持应用程序保持不变。保证了数据和程序的逻辑独立性。
  • 模式/内模式映像:数据库的存储结构发生改变时,由数据库管理员对模式/内模式的映像作改变,可以使模式保持不变,从而应用程序也不必发生改变。保证了数据和应用程序的物理独立性。

域: 是一组具有相同数据类型的值得集合。

候选码: 某一属性的值能唯一标识一个元组,其子集不能。

主码: 在多个候选码中选定一个作为主码。

主属性: 候选码的属性叫作主属性。非主属性就是不是候选码的属性也叫非码属性。

全码: 关系模式中所有属性都是候选码,都是主属性。

关系代数

  • 传统的关系代数: 并、交、差、笛卡尔积
  • 专门的关系代数: 选择、投影、连接、除
SQL功能 动词
数据查询 SELECT
数据定义 CREATE、DROP、ALTER
数据操纵 INSERT、UPDATE、DELETE
数据控制 GRANT、REMOVE

创建模式:
CREATE SCHEMA 模式名 AUTHORIZATION 用户名 模式下可以定义表等

删除模式:
DROP SCHEMA 模式名 CASCADE|RESTRICT

创建表:
CREATE TABLE 表名(列名 数据类型 列级完整性约束,…)

修改表:ALTER TABLE 表名

​ ADD 新列名 数据类型 约束条件,

		  ADD 表级完整性约束,	

​ DROP 列名 CASCADE|RESTRICT

​ ALTER COLUMN 列名 数据类型 ,修改列属性

删除表: DROP TABLE 表名 CASCADE|RESTRICT 默认RESTRICT

建立索引: CREATE UNIQUE|CLUSTER INDEX 索引名

  • UNIQUE: 每一个索引值对应一个唯一的数据记录
  • CLUSTER:聚簇索引。

修改索引ALTER INDEX 旧索引名 RENAME TO 新索引名

删除索引: DROP INDEX 索引名

数据查询

SELECT <ALL|DISTINCT> 目标列 FROM 表名 DISTINCT去重,

SELECT * FROM 表名 ;查询全部表的全部列信息

查询满足条件的元组:用到where子句

SELECT * FROM 表名 WHERE 查询条件

查询条件 谓词
比较 =,>,<,>=,<=,!=,!>,!<
确定范围 BETWEEN AND, NOT BETWEEN AND
确定集合 IN , NOT IN
字符匹配 LIKE, NOT LIKE
空值(*) NULL ,IS NOT NULL 不用==0
多重条件(逻辑运算) AND ,OR , NOT

如:查询年龄不大于20的学生姓名:

SELECT * FROM STUDENTS WHERE age<=20;

集合的使用:IN 查询 年龄在18 19 20的学生信息

select * from students where age IN (18,19,20);

字符匹配:LIKE

查询姓刘的学生信息

select * from students where name LIKE “刘%”

查询姓李并且名字为两位的学生信息

select * from students where name LIKE “李_”

(如果数据库为ASCII编码需要两个_,GBK编码一个 _)

查询第二个字为阳的学生信息

select * from students LIKE “_阳%”

空值: NULL

查询成绩为0的学生信息

select * from students where grade IS NULL;

AND 表并且 OR 表或者 可以用来连接多个条件

排序 : ORDER BY

按照某列属性的值对数据进行排序

默认为升序,DESC为降序 ASC为升序

如:学生信息按照成绩降序

select name from students ORDER BY grade DESC;

order by 与where 和group by 之间可以联合使用

select * from 表名 where 条件 group by 列名 order by 列名

聚集函数

聚集函数只能用于select 子句和GROUP BY HAVING子句

函数 作用
COUNT(*) 统计元组个数
COUNT(DISTINCT |ALL) <列名> 统计一列中值得个数
SUM … <列名> 计算一列值的总和
AVG … <列名> 计算一列值的平均值
MAX … <列名> 计算一列最大值
MIN … <列名> 计算一列值的最小值

使用DISTINCT表示在计算时取消重复值,重复值不重复计算

分组 :GROUP BY

将查询到的结果按照一列或多列的值分组,值相等为一组。

查询课程号及选课人数

select Cno,COUNT(*) from SC group by Cno;

嵌套查询:在查询中不能增加order by语句

EXISTS:带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值true和逻辑假值false

查询所有选修了1号课程的学生姓名

select name from students where EXISTS (select * from SC where Sno=students.Sno AND Cno=“1”);

集合查询:

集合操作主要包括并操作UNION、交操作INTERSECT、差操作EXCEPT

数据更新

数据更新包括数据的插入、修改、删除。

数据插入

数据的插入通常有两种形式,一种是插入元组,另一种是插入子查询结果。

INSERT INTO <表名> [插入的属性列] VALUES <插入对应属性列数值>;不写属性列默认为全部属性

INSERT INTO <表名>[属性列] 子查询

将student表中的年龄大于18的插入到students表中

如:insert into Students(name,age) select name,age from student where age>18;

数据修改

UPDATE 表名 SET <列名>=<表达式值> [WHERE <条件>]

修改一个元组的值:

将姓名为张三的学生年龄改为20

update students set age=20 where name=“张三”

修改多个元组的值:

如:将所有学生的年龄加1

update students set age = age+1

通过子查询进行数据的修改:

如:将男生的成绩全部置0

update students set grade=0 where Sno IN (select Sno from students where sex = “男” );

数据删除

DELETE FROM <表名> WHERE <条件>

删除一个元组的值

DELETE FROM <表名> WHERE <条件>

删除多个元组的值

DELETE FROM <表名> 删除表中的所有数据,清空表

带子查询的删除语句

视图操作

视图

  • 可以用来简化用户的操作
  • 让用户以多种角度看待同一数据
  • 对重构数据库提供了一些逻辑独立性
  • 能够对机密数据提供安全保护
  • 更清晰的表达查询

创建视图:

CREATE VIEW <视图名> [<列名>] AS <子查询> [WITH CHECK OPTION]

子查询可以是任意的SELECT语句

WITH CHECK OPTION 表示对视图进行更新操作的行满足满足视图定义的谓语条件(子查询的条件表达式)

删除视图:

DROP VIEW <视图名> [CASCADE]

查询视图Student(和表的操作类似)

SELECT * FROM Student WHERE age>18

视图的更新和表的更新类似,增加、修改、删除,语法也相同 注:并不是所有的视图都是可以更新的

数据库安全性控制

关系数据库的存取权限表

对象 操作类型
模式 CREATE SCHEMA
基本表 CREATE TABLE , ALTER TABLE
视图 CREATE VIEW
索引 CREATE INDEX
基本表和视图 SELECT , INSERT INTO , UPDATE ,DELETE ,REFERENCES , ALL PRIVILEGES
属性列 SELECT , INSERT , UPDATE , REFERENCES , ALL PRIVILEGES(全部属性)

授权

授予与收回 GRANT <权限> ON <对象类型> TO <用户> [WITH GRANT OPTION]

WITH GRANT OPTION :传播授权的权利,可以对其他用户授权

例:将查询表Stu的权限授予用户u1

grant select on table Stu to u1

REVOKE 回收 REVOKE <权限> ON <对象类型> FROM <用户>[CASCADE|RESTRICT]

例:回收u1查询Stu表的权限

revoke select on table Stu from u1 (from public 则对所有用户回收权限)

角色

数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合

创建角色 CREATE ROLE <角色名>

给角色授权 GRANT <权限> ON <对象类型> TO ROLE

将一个角色授予其他角色或用户 GRANT <角色1>… TO <角色3> [WITH ADMIN OPTION]

角色权限的收回 REVOKE <权限> ON <对象类型> FROM <角色>

数据库完整性

实体完整性

  • PRIMARY KEY

主码自动建立索引

  • 检查主码是否唯一
  • 主码的各个属性是否为空

参照完整性

  • FOREIGN KEY REFERENCES

用户定义的完整性

属性约束

  • NOT NULL 不为空
  • UNIQUE 列值唯一
  • CHECK 是否满足条件表达式

完整性约束子句 CONSTRAINT

CONSTRAINT <完整性约束条件名><完整性约束条件>

完整性约束条件:UNIQUE , NOT NULL , PRIMARY KEY , FOREIGN KEY ,CHECK …

例:sname char(20)CONSTRAINT C1 NOT NULL ;创建表,表的列属性的完整性约束

以上的完整性都是建立表时进行使用。

删除完整性 DROP CONSTRAINT C4

增加完整性 ADD CONSTRAINT ….

断言

断言创建后,任何对断言所涉及的操作都会触发断言,任何使断言不为真值的操作都会被拒绝执行

创建断言 CREATE ASSERTION <断言名> <CHECK 子句>

例:限制数据库课程最多60个人选修

CREATE ASSERTION ASS_SC CHECK (60 >= (SELECT COUNT(*) FROM Course,SC WHERE SC.Cno=Course.Cno AND Cname=“数据库” ))

删除断言 DROP ASSERTION <断言名>

触发器 用户定义在关系表上的一类由事件驱动的特殊过程,一个数据表可以定义多个触发器

创建触发器 CREATE TRIGGER

CREATE TRIGGER <触发器名> ;触发事件发生,触发器激活

{BEFORE|AFTER} <触发事件> ON <表名> ;指明触发时间是在执行前还是执行后

REFERENCING NEW|OLD ROW AS <变量> ;REFERENCING 指出引用变量

FOR EACH {ROW|STATEMENT} ;触发器类型 ROW为行级触发器 ,STATEMENT语句级

[WHEN <触发条件>]<触发动作题> ;触发条件为真时才执行触发动作体

例:定义一个before行级触发器,为教师表teacher定义完整性约束“教授规则不低于4000,低于4000则自动改为4000”

create trigger 触发器1 before insert or update ON teacher

REFERENCING NEW row AS newtupl

FOR EACH ROW BEGIN

	IF(newtupl,job = “教授”) AND  (newtupl.sal < 4000)

​ THEN newtupl.sal = 4000;

​ END IF

END

规范化

1NF

↓ 消除非主码属性对码的部分函数依赖

2NF

↓ 消除非主属性对码的传递函数依赖

3NF

↓ 消除主属性对码的部分和传递函数依赖

BCNF

↓ 消除非平凡且非函数依赖的多值依赖

4NF

数据库设计方法

数据库设计基本步骤:

需求分析阶段 – 概念结构设计阶段 – 逻辑结构设计 – 物理结构设计 – 数据库实施 – 运行维护

需求分析阶段 数据字典:数据字典包含数据项、数据结构、数据流、数据存储和处理过程几部分。

概念结构设计:

E-R模型 (实体、属性、实体之间的联系 一对一,一对多,多对多)

E-R图 实体用矩形,属性用椭圆形,联系用菱形

逻辑结构设计:逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与数据库管理系统产品所支持的数据模型相符合的逻辑结构。

数据库恢复

事务 用户定义的数据库操作序列,这些操作要么全做,要么不做,是不可分割的工作单位

定义事务的语句

  • BEGIN TRANSACTION
  • COMMIT 表示提交,提交事务操作
  • ROLLBACK 回滚,对已完成的操作全部撤销,回滚到事务开始状态

事务的ACID属性

  • 原子性
  • 一致性
  • 隔离性
  • 持续性

故障的种类

  • 事务内部的故障 非预期的
  • 系统故障 软故障,是指造成系统停止运行的任何事件,使得系统重新启动
  • 介质故障 硬故障
  • 计算机病毒

恢复的技术

  • 数据转储
  • 登记日志文件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sql Server期末复习 的相关文章

  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • 默认情况下 dbo 架构中的 EF 6 Code First __MigrationHistory

    我是代码优先实体框架的新手 第一次运行我的应用程序后登录数据库时 当我看到 MigrationHistory 表时 我有点困惑 我现在了解对此表的需求 但不喜欢它位于用户表内的标准 dbo 模式中 我认为它很唐突且有风险 我的第一个想法是将
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • 为什么 SSRS 报表从 SQL Server Reporting Services 运行时生成的数据与使用“预览”选项卡运行时生成的数据不同?

    我有一个运行我想要的数据的报表 从 预览 选项卡 即 或者在 VS 2010 中使用 F5 运行时 但是当我将报表 rdl 文件 上传到 SQL Server Reporting Services 并运行更新后的报表时从那里报告 它仍然显示
  • TSQL - 执行CLR权限

    我从 CLR net Assembly 获得了一个 sql 过程 该过程在执行时返回错误 Msg 6522 Level 16 State 1 Procedure sp HelloWorld Line 0 A NET Framework er
  • sql脚本变量默认值

    我有一个脚本文件 例如测试 sql 我想从另一个脚本调用它 比如 caller sql 在 sqlcmd 模式下使用 r test sql 这工作正常 但我想在 test sql 中使用脚本变量 当我从 caller sql 调用 test
  • 如何在SQL Compact Edition中导入数据? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我似乎没有找到合适的工具 也没有找到
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • 从VBA中的数组批量插入到sql中

    我正在尝试在 Excel 中构建一个按钮 将所选区域上传到 SQL Server 中的表中 第一行将自动视为列标题 这件事该怎么继续下去呢 我想要的是简单和超快的上传 这是我的想法 我将选择选定的区域 然后将其保存为 txt 文件 然后对其
  • Invoke-Sqlcmd 运行脚本两次

    我遇到了一个非常奇怪的问题并且可以重复 基本上 我使用invoke sqlcmd通过使用 inputfile来调用脚本文件 但是如果脚本文件存在一些执行错误 例如插入到列不应为空的表中 则脚本文件将被执行两次 我也可以从探查器中看到这两个执
  • 打开脚本任务时 SSIS 丢失文件引用

    我们使用自定义审核程序集 C 在脚本任务中记录 SSIS 中的多种操作 我们将在 GAC 中构建自定义程序集 用于运行时 并发布到 IDE VS2008 的公共程序集区域以供设计时文件引用 后构建完成后 自定义程序集可在运行时使用 并可在文
  • 如何找到在SQL Server中注册的程序集?

    我在 SQL Server 中注册了一个程序集 CREATE ASSEMBLY CLRFunctions AUTHORIZATION dbo FROM 0x4D5A90000300000 WITH PERMISSION SET SAFE 我
  • 按小时拆分日期/时间数据并将日期/时间范围展开为行

    我正在尝试使用 SQL Server 将一系列日期 时间数据扩展为多行 例如 我的数据看起来像 Date StartTime EndTime EmployeeID ShiftType 10 1 2019 8 30 00AM 4 57 00P
  • 清除表中的所有行将身份规范重置为零并且不影响外键?

    我们已经创建了数据库框架以及所有关系和依赖关系 但表内部只是虚拟数据 我们需要删除这些虚拟数据 并开始添加正确的数据 我们怎样才能清除所有内容并将主键 IsIdentity 是 保留为零 并且不影响外部表关系结构 多谢 您可以采取以下步骤
  • 在单个更新语句上使用事务

    我在工作中为一些 SP 配音 我发现编写代码的人在单个更新语句上使用了事务 如下所示 begin transaction single update statment update table whatever with whatever
  • ASP.NET 网站上的 XSS 攻击 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我遇到了很大的麻烦 请帮忙 我的网站
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • SQL Server Express 到 .mdf 文件的连接

    两部分问题 我使用 VS 2015 Update 3 创建了一个 ASP NET MVC 5 应用程序 我在本地计算机上完成了该项目 突然 我无法再通过 SQL Server 对象资源管理器连接到 mdf数据库文件并出现以下错误 无法打开数
  • SQL Server 2000 中是否提供公用表表达式 (CTE)

    我最近发现了以下文章 http www tsqltutorials com with common table expressions php http www tsqltutorials com with common table exp
  • 案例陈述以确定我是否应该结合

    我目前想做某种条件联合 给出以下示例 SELECT age name FROM users UNION SELECT 25 AS age Betty AS name 假设我只想在 用户 计数 gt 2 时合并第二个语句 否则不合并两者 总之

随机推荐

  • Vue3 toRef

    toRef 可以用来为一个 reactive 对象的属性创建一个 ref 这个 ref 可以被传递并且能够保持响应性 作用 创建一个 ref 对象 其value值指向另一个对象中的某个属性 说明 在模板使用的时候 如果一个对象嵌套的太深 那
  • 利用OpenCV对视频进行拆帧处理

    文章目录 简介 输入输出 源代码 Python 简介 提供一种利用OpenCV对视频进行拆帧 并制作成图片集的方式 输入输出 输入 视频文件所在文件夹 输出 按视频文件命名的文件夹下保存图片 源代码 Python import cv2 im
  • C++中虚函数和非虚函数重载在继承时的区别

    这里唯一想说明的一点就是 使用虚函数继承时 当继承类被强转成基类后调用虚函数 调用的还是继承类的虚函数 而重载方式的继承类被强转成基类再调用重载函数 则调用的是基类的函数 废话不多说 上代码 cpp view plain copy incl
  • xss-labs/level11

    首先输入 丝毫不差 没有出现回弹现象 根本就不出人意料好吧 接着来看一下源代码好吧 能够看得出来第一个输出点由于htmlspecialchars转义操作 所以上述代码根本行不通 这一关比上一关又多了一个隐藏表单 一共是有四个隐藏表单 从第四
  • 【ARM】使用模板编写dht11温湿度linux驱动程序

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https gitee com stylle linux code 点赞 收藏 再看 养成习惯 订阅的粉丝可通过PC端文末加我微信 可对文章的内容进
  • #STM32 GPIO编程详解

    硬件环境 stm32f407zet6 软件环境 mdk5 1 GPIO概述 GPIO 翻译为通用输入输出 也就是软件可编程引脚 也就是MCU通过控制GPIO来完成一系列的功能 GPIO属于引脚 但引脚还包含电源 晶振 下载 boot 复位等
  • robotframework安装包_Robot Framework零基础入门教程

    1 介绍 1 1 介绍Robot Robot Framework是一个基于关键字驱动的自动化测试框架 通过该框架 测试人员可使用python封装关键字 并在非代码环境下使用关键字构建可被执行的测试用例 Robot Framework官方网站
  • 右下角对勾图形html,ZOJ 3203 Light Bulb(数学对勾函数)

    Light BulbTime Limit 1 Second Memory Limit 32768 KB Compared to wildleopard s wealthiness his brother mildleopard is rat
  • Windows部署证书颁发服务器

    证书颁发服务器的部署 1 Windows Server 证书是什么 Windows Server 证书是用于保护网络服务器的安全认证的重要工具 它是一种电子文件 由一个受信任的第三方机构 称为证书颁发机构 签发 用于确认网络服务器的身份 2
  • 贺TDSQL喜提286万QPS!本文回顾了它的十年锻造之路

    导读 2017年 在英特尔 腾讯金融分布式数据库TDSQL团队的共同见证下 TDSQL采用英特尔提供的高端平台 跑出了创造历史的最快性能数据 峰值286万QPS 相比于上一代处理器 性能提升了近4倍 是32核 220GB实例的38倍 TDS
  • fileinput组件将文件上传到服务器的路径编写方法以及Tomcat的配置

    1 先配置文件上传时Tomcat的虚拟路径 system file read location http localhost 8080 fileserversavepath 这是访问图片的地址 system file write locat
  • 数据库 数据丢失问题 及解决方案

    什么是数据丢失 两个线程基于同一个查询结果进行修改 后修改的人会将先修改人的修改覆盖掉 让我们先来看这么个小案例 我们给游戏充值100 支付成功后 银行会向游戏服务器发送支付成功信息 有一个订单支付信息表 order 和一个账户信息表 ac
  • RestTemplate的简单使用

    什么是RestTemplate Spring RestTemplate 是 Spring 提供的一种简单便捷的模板类 提供了多种便捷访问远程Http服务的方法 用于访问 Rest 服务的客户端 能够大大提高客户端的编写效率 RestTemp
  • 深度学习之图片转成pkl格式的训练集

    怎么使用python将文件夹下的图片转换pkl格式的训练集 首先需要读取图片和图片所属的类别 主要思路是 1 生成train Thumbs db 2 生成label Thumbs db 3 将train Thumbs db 和label T
  • Python3 爬虫教程 - 新兴网页解析利器 parsel

    1 介绍 parsel 这个库可以对 HTML 和 XML 进行解析 并支持使用 XPath 和 CSS Selector 对内容进行提取和修改 同时它还融合了正则表达式提取的功能 功能灵活而又强大 同时它也是 Python 最流行爬虫框架
  • 基于卷积神经网络CNN的多输入多输出预测,卷积神经网络CNN的回归预测,多变量输入模型。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • php如何无水印解析快手,快手短视频无水印解析过程及代码

    重要 本文最后更新于2020 08 22 08 26 13 某些文章具有时效性 若有错误或已失效 请在下方留言或联系代码狗 抖音快手作为目前最大的两大视频平台 使用量是非常大的 看到某些好看的视频想要保存下来但是又有水印改怎么办呢 狗哥已经
  • Python3_MySQL数据库连接 - PyMySQL 驱动

    数据库连接 连接数据库前 请先确认以下事项 您已经创建了数据库 TESTDB 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST NAME LAST NAME AGE SEX 和 INCOME 连接
  • 解决 github clone慢

    转载来源 方法1 代理 通常发现在github clone 代码的时候 开了小飞机也很慢 记得输入下面的命令 git config global https proxy sock5 localhost 1080 这样在操作 git 命令时才
  • Sql Server期末复习

    基础概念 数据库管理系统 是位于用户与操作系统之间的一层数据管理软件 数据库系统 由数据库 数据库管理系统 应用程序和数据库管理员组成 即 DBS DB DBMS 应用程序 DBA 数据库系统的三层模式结构 外模式 模式 内模式 模式 也成