持续学习&持续更新中…
学习态度:守破离
【数据库系统概论】考试复习
一、选择题
数据库的4个基本概念
- 数据(Data)
- 数据的定义:描述事物的符号记录。
- 数据的种类:数字、文字、图形、图像、音频、视频、学生的档案记录等。
- 数据的含义称为数据的语义,数据与其语义是不可分的。
- 数据库(Database)
- 数据库的定义:数据库是存放数据的仓库,存放的这些数据是按照一定格式存放的。
- 数据库的严格定义:数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。
- 数据库的基本特征:
- 数据按一定的数据模型组织、描述和储存
- 较小的冗余度
- 较高的数据独立性
- 易扩展性
- 数据库的三个基本特点:
- 永久存储
- 有组织
- 可共享
- 数据库管理系统(DBMS)
- 数据库管理系统的定义:一个大型的、复杂的、位于用户与操作系统之间的一层数据管理软件系统(例如:MySQL)。
- 数据库管理系统的用途:科学地组织和存储数据、高效地获取和维护数据。
- 数据库管理系统的主要功能:
- 数据定义功能
- 数据组织、存储和管理
- 数据操纵功能
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
- 数据库系统(DBS):
- 一般在不引起混淆的情况下,人们常常把数据库系统简称为数据库。
- 数据库系统的定义:由数据库、数据库管理系统、数据库管理员、应用程序组成的存储、管理、处理、维护数据的系统。
- 数据库系统的构成:
- 数据库
- 数据库管理系统
- 数据库管理员(DBA)
- 应用程序
关系模型
- 关系数据库系统采用关系模型作为数据的组织方式 。
- 关系模型中数据的逻辑结构是一张二维表,它由行和列组成。
- 关系模型的数据结构:
- 关系(Relation):一个关系对应通常说的一张表
- 元组(Tuple):表中的一行即为一个元组
- 属性(Attribute):表中的一列即为一个属性,给每一个属性起一个名称即属性名
- 主码(Key):也称码键。表中的某个属性组,它可以唯一确定一个元组
- 域(Domain):是一组具有相同数据类型的值的集合。属性的取值范围来自某个域。
- 分量:元组中的一个属性值。
- 关系模式:对关系的描述:关系名(属性1,属性2,…,属性n)
例:学生(学号,姓名,年龄,性别,系名,年级)
- 关系必须是规范化的,满足一定的规范条件。
最基本的规范条件:关系的每一个分量必须是一个不可分的数据项, 不允许表中还有表 。 - 关系模型的操纵
- 存取路径对用户隐蔽,用户只要指出“干什么”,不必详细说明“怎么干”。
- 数据操作是集合操作,操作对象和操作结果都是关系。
- 关系模型的优缺点
- 优点
- 建立在严格的数学概念的基础上
- 概念单一
- 实体和各类联系都用关系来表示
- 对数据的检索结果也是关系
- 关系模型的存取路径对用户透明
- 具有更高的数据独立性,更好的安全保密性
- 简化了程序员的工作和数据库开发建立的工作
- 缺点
- 查询效率往往不如格式化数据模型
- 为提高性能,必须对用户的查询请求进行优化,增加了开发数据库管理系统的难度
- 优点
关系模式
- 什么是关系模式
- 关系模式(Relation Schema)是型
- 关系是值
- 关系模式是对关系的描述
- 元组集合的结构
- 属性构成
- 属性来自的域
- 属性与域之间的映象关系
- 完整性约束条件
- 元组集合的结构
- 定义关系模式
- 关系模式可以形式化地表示为:R(U,D,DOM,F)
- R 关系名
- U 组成该关系的属性名集合
- D U中属性所来自的域
- DOM 属性向域的映象集合
- F 属性间数据的依赖关系的集合
- 关系模式通常可以简记为:R (U) 或 R (A1,A2,…,An)
- R: 关系名
- A1,A2,…,An : 属性名
- 域名及属性向域的映象常常直接说明为属性的类型、长度
- 关系模式可以形式化地表示为:R(U,D,DOM,F)
- 关系模式与关系
- 关系模式
- 对关系的描述
- 静态的、稳定的
- 关系
- 关系模式在某一时刻的状态或内容
- 动态的、随时间不断变化的
- 关系模式和关系往往笼统称为关系(通过上下文加以区别)
- 关系模式
三级模式
三级模式是对数据的三个抽象级别
- 模式(Schema)
- 一个数据库只有一个模式
- 模式(也称逻辑模式)
- 数据库中全体数据的逻辑结构和特征的描述
- 所有用户的公共数据视图
- 模式的地位:是数据库系统模式结构的中间层
- 与数据的物理存储细节和硬件环境无关
- 与具体的应用程序、开发工具及高级程序设计语言无关
- 模式的定义
- 数据的逻辑结构(数据项的名字、类型、取值范围等)
- 数据之间的联系
- 数据有关的安全性、完整性要求
- 外模式(External Schema)
- 外模式(也称子模式或用户模式)
- 数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
- 数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
- 外模式的地位:介于模式与应用之间
- 模式与外模式的关系:一对多
- 外模式通常是模式的子集
- 一个数据库可以有多个外模式。反映了不同的用户的应用需求、看待数据的方式、对数据保密的要求
- 对模式中同一数据,在外模式中的结构、类型、长度、保密级别等都可以不同
- 外模式与应用的关系:一对多
- 同一外模式也可以为某一用户的多个应用系统所使用
- 但一个应用程序只能使用一个外模式
- 模式与外模式的关系:一对多
- 外模式的用途
- 保证数据库安全性的一个有力措施
- 每个用户只能看见和访问所对应的外模式中的数据
- 外模式(也称子模式或用户模式)
- 内模式(Internal Schema)
- 一个数据库只有一个内模式
- 内模式(也称存储模式)
- 是数据物理结构和存储方式的描述
- 是数据在数据库内部的表示方式
- 记录的存储方式(例如,顺序存储,按照B树结构存储,按hash方法存储等)
- 索引的组织方式
- 数据是否压缩存储
- 数据是否加密
- 数据存储记录结构的规定
二级映像
三级模式是对数据的三个抽象级别
二级映象在数据库管理系统内部实现这三个抽象层次的联系和转换
- 外模式/模式映像
- 描述
- 模式:描述的是数据的全局逻辑结构
- 外模式:描述的是数据的局部逻辑结构
- 同一个模式可以有任意多个外模式
- 每一个外模式,数据库系统都有一个外模式/模式映象,定义外模式与模式之间的对应关系
- 映象定义通常包含在各自外模式的描述中
- 作用
- 保证数据的逻辑独立性
- 当模式改变时,数据库管理员对外模式/模式映象作相应改变,使外模式保持不变
- 应用程序是依据数据的外模式编写的,应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
- 描述
- 模式/内模式映像
- 描述
- 模式/内模式映象定义了数据全局逻辑结构与存储结构之间的对应关系。
- 例如,说明逻辑记录和字段在内部是如何表示的
- 数据库中模式/内模式映象是唯一的
- 该映象定义通常包含在模式描述中
- 作用
- 保证数据的物理独立性
- 保证了数据库外模式的稳定性
- 当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映象,使模式保持不变。
- 从底层保证了应用程序的稳定性,除非应用需求本身发生变化,否则应用程序一般不需要修改
- 描述
建表语句(见操作题)
并发操作
- 什么是X锁:排它锁(Exclusive Locks,简记为X锁),排它锁又称为写锁。
- 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
- 保证其他事务在T释放A上的锁之前不能再读取和修改A
- 什么是S锁:共享锁(Share Locks,简记为S锁),共享锁又称为读锁。
- 若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁
- 保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
- 三级封锁协议
- 一级封锁协议
- 事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
- 正常结束(COMMIT)
- 非正常结束(ROLLBACK)
- 一级封锁协议可防止丢失修改,并保证事务T是可恢复的。
- 在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
- 事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
- 二级封锁协议
- 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
- 二级封锁协议可以防止丢失修改和读“脏”数据。
- 在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
- 三级封锁协议
- 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
- 三级封锁协议可防止丢失修改、读脏数据和不可重复读。
- 总结
- 一级封锁协议:解决丢失修改问题
- 二级封锁协议:解决读“脏”数据问题
- 三级封锁协议:解决不可重复读问题
- 三级协议的主要区别:什么操作需要申请封锁以及何时释放锁(即持锁时间)
- 不同的封锁协议使事务达到的一致性级别不同:封锁协议级别越高,一致性程度越高
- 一级封锁协议
数据库的完整性
-
实体完整性
- 实体完整性规则(Entity Integrity)
- 若属性A是基本关系R的主属性,则属性A不能取空值
- 空值就是“不知道”或“不存在”或“无意义”的值
- 例:
选修(学号,课程号,成绩)
“学号、课程号”为主码
“学号”和“课程号”两个属性都不能取空值
- 实体完整性规则的说明
- 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。
- 现实世界中的实体是可区分的,即它们具有某种唯一性标识。
- 关系模型中以主码作为唯一性标识。
- 主码中的属性即主属性不能取空值。主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性
- 实体完整性规则(Entity Integrity)
-
参照完整性
- 关系间的引用
- 在关系模型中实体及实体间的联系都是用关系来描述的,自然存在着关系与关系间的引用。
- 例: 学生实体、专业实体
- 学生(学号,姓名,性别,专业号,年龄)
- 专业(专业号,专业名)
- 学生关系引用了专业关系的主码“专业号”。
- 学生关系中的“专业号”值必须是确实存在的专业的专业号
- 外码
- 设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是R的外码
- 基本关系R称为参照关系(Referencing Relation)
- 基本关系S称为被参照关系(Referenced Relation)或目标关系(Target Relation)
- 关系R和S不一定是不同的关系
- 目标关系S的主码Ks 和参照关系的外码F必须定义在同一个(或一组)域上外码并不一定要与相应的主码同名
- 当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别
- 参照完整性规则
- 若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
- 或者取空值(F的每个属性值均为空值)
- 或者等于S中某个元组的主码值
- 若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
- 关系间的引用
-
用户自定义完整性
- 针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
- 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能
二、简答题
数据库事务
- 什么是数据库事务
- 事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
- 事务和程序是两个概念
- 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序
- 一个程序通常包含多个事务
- 事务是恢复和并发控制的基本单位
- 数据库事务的ACID特性
- 原子性(Atomicity):事务中包括的诸多操作要么都做,要么都不做
- 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
- 一致性状态:数据库中只包含成功事务提交的结果
- 一致性状态的含义是数据库中的数据应满足完整性约束
- 不一致状态:数据库系统运行中发生故障,有些事务尚未完成就被迫中断;这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰
- 一个事务内部的操作及使用的数据对其他并发事务是隔离的
- 并发执行的各个事务之间不能互相干扰
- 持续性(Durability ):持续性也称永久性(Permanence)
- 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
- 接下来的其他操作或故障不应该对其执行结果有任何影响。
数据库的安全性由哪些措施保障
-
数据库如何保证安全性
- 对用户安全管理
- 定义视图
- 数据加密
- 事务管理和故障恢复
- 数据库备份与恢复
- 审计追踪机制
-
数据库安全性的措施有哪些
- 用户标识和鉴别:该方法由系统提供一定的方式让用户标识自己咱勺名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供系统的使用权。
- 存取控制:通过用户权限定义和合法权检查确保只有合法权限的用户访问数据库,所有未被授权的人员无法存取数据。例如C2级中的自主存取控制(I)AC),Bl级中的强制存取控制(M.AC)。
- 视图机制:为不同的用户定义视图,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。
- 审计:建立审计日志,把用户对数据库的所有操作自动记录下来放人审计日志中,DBA可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。
- 数据加密:对存储和传输的数据进行加密处理,从而使得不知道解密算法的人无法获知数据的内容。
数据库范式
范式英文:Normal Form,缩写 NF,翻译为 规范化形式,简称 范式。
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
- 什么是数据库的一二三级范式
- 第一范式:数据表中的每一列(字段),必须是不可拆分的最小单元,确保每一列的原子性。
- 第二范式:表中的所有列,都必需依赖于主键,而不能有任何一列与主键没有关系。
- 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
- 第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
- 为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键。
- 第三范式:表中的每一列都要与主键直接相关,而不是间接相关
- 如何满足数据库的一二三级范式:满足第一范式才能满足第二范式,满足第二范式(此时同时满足了第一第二范式)才能满足第三范式。
授权
- 授予
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
# 把对student表和course表的全部权限授予用户U2和U3
GRANT ALL PRIVILIGES
ON TABLE student,course
TO U2,U3;
# 把对表student的查询权限授予所有用户
GRANT SELECT
ON TABLE student
TO PUBLIC;
GRANT SELECT
ON TABLE student
TO U1;
GRANT UPDATE(id), INSERT
ON TABLE student, teacher
TO U1, U2;
- 收回
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型><对象名>]…
FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
REVOKE UPDATE(id)
ON TABLE student
FROM U4;
# 收回所有用户对表SC的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
REVOKE INSERT
ON TABLE student
FROM U5 CASCADE ;
视图
-
视图是什么
- 虚表,是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,不存放视图对应的数据
- 基表中的数据发生变化,从视图中查询出的数据也随之改变
-
视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当的利用视图可以更清晰的表达查询
-
视图的优缺点
- 优点
- 使用方便:操作简单
- 简化查询:能够分解复杂的查询逻辑
- 访问控制:数据安全
- 减少数据冗余
- 缺点
- 难以维护
- 视图的查询会转化成对基本表的查询,如果视图是由复杂的多表查询所定义的话,查询时性能较差
- 修改视图不方便很受限制
- 优点
-
视图如何创建
- 格式:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW 视图名称 [(字段列表)] AS 查询语句 [WITH [CASCADED|LOCAL] CHECK OPTION]
CREATE VIEW 视图名称 AS 查询语句
- 举例:
CREATE OR REPLACE VIEW v_emps AS SELECT first_name, last_name FROM employees;
CREATE VIEW v_emp1 AS SELECT employee_id,last_name,salary FROM employees;
CREATE VIEW v_emp2 AS SELECT * FROM employees;
CREATE VIEW v_emp3(emp_id,name,monthly_sal) AS SELECT employee_id,last_name,salary FROM employees WHERE salary > 8000;
CREATE VIEW v_emp4 AS SELECT employee_id emp_id,last_name name,salary monthly_sal FROM employees WHERE salary > 8000;
-
视图如何被Java调用
- 创建视图
connection.execute("CREATE VIEW v_emp AS SELECT * FROM employees;");
- 查询视图
ResultSet resultSet = Dbs.connection().createStatement().executeQuery("SELECT * FROM v_emp"); while (resultSet.next()) { String lastName = resultSet.getString("last_name"); String firstName = resultSet.getString("first_name"); System.out.println(firstName + "_" + lastName); }
存储过程
-
存储过程是什么
- 存储过程是一些 SQL 语句的集合
- 由SQL语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可。
-
存储过程的优缺点
- 优点
- 运行效率高:存储过程可以一次编译多次使用。存储过程只在创建时进行编译,之后的使用都不需要重新编译,这就提升了 SQL 的执行效率
- 可以减少开发工作量:将代码封装成模块,实际上是编程的核心思想之一,这样可以把复杂的问题拆解成不同的模块,然后模块之间可以重复使用,在减少开发工作量的同时,还能保证代码的结构清晰。
- 存储过程的安全性强:我们在设定存储过程的时候可以设置对用户的使用权限,这样就和视图一样具有较强的安全性。
- 降低了客户机和服务器之间的通信量(可以减少网络传输量):因为代码封装到存储过程中,每次使用只需要调用存储过程即可,这样就减少了网络传输量。
- 缺点
- 可移植性不高
- 难以调试和扩展
- 不适合高并发场景
- 优点
-
存储过程如何创建
DELIMITER // CREATE PROCEDURE pro1(INOUT count INT) BEGIN SELECT COUNT(*) INTO count FROM employees; END // DELIMITER ;
-
存储过程如何被Java调用
- 创建存储过程
connection.createStatement().execute("CREATE PROCEDURE pro(INOUT count INT) SELECT COUNT(*) INTO count FROM employees;");
- 调用存储过程
CallableStatement callableStatement = connection.prepareCall("CALL pro(?)"); callableStatement.setInt("count", 0); callableStatement.execute(); int count = callableStatement.getInt("count"); System.out.println(count);
触发器
- 触发器是什么
- 触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程
- 触发器保存在数据库服务器中
- 任何用户对表的增、删、改操作均由服务器自动激活相应的触发器
- 触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力
- 触发器的优缺点
- 优点
- 触发器可以确保数据的完整性
- 触发器还可以用在操作数据前,对数据进行合法性检查
- 缺点
- 可读性差
- 不易维护
- 优点
- 触发器如何创建
格式:
CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
触发器执行的语句块;
例子:
DELIMITER //
CREATE TRIGGER tri1
BEFORE INSERT ON student
FOR EACH ROW
BEGIN
INSERT INTO table_log (t_log)
VALUES('insert');
END //
DELIMITER ;
JDBC操作的基本步骤
/* 最基本的JDBC访问MySQL程序 */
public static void test1() throws Exception {
final String DRIVER_MYSQL = "com.mysql.jdbc.Driver";
/* 步骤一: 将Driver注册到DriverManager 加载驱动 */
// 方式一 推荐使用 装载MySQL驱动类
Class.forName(DRIVER_MYSQL);
// 方式二 不推荐使用
// DriverManager.registerDriver(new Driver());
/* 步骤二:利用DriverManager创建数据库连接 获取数据库连接对象 */
// url:数据库服务器地址
final String mysqlURL = "jdbc:mysql://localhost:3306/xmg";
final String user = "root";
final String password = "root";
Connection connection = DriverManager.getConnection(mysqlURL, user, password);
/* 步骤三:利用Connection创建SQL语句对象 */
Statement statement = connection.createStatement();
/* 步骤四:执行SQL语句 SQL语句不用加;*/
final String sql = "INSERT INTO customer (id, name, phone, company_id) VALUES (101, 'lphahaha', '11122223333', 1)";
statement.execute(sql);
/* 步骤五:关闭释放资源 */
statement.close();
connection.close();
}
DAO
三、操作题
增
- 数据库
CREATE DATABASE 数据库名;
- 表
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);
CREATE TABLE IF NOT EXISTS student(
id INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(20) NOT NULL
);
CREATE TABLE emp1 AS SELECT * FROM employees;
- 记录
INSERT INTO 表名(字段名1, 字段名2, ...) VALUES(值1, 值2, ...);
删
- 数据库
DROP DATABASE [IF EXISTS] 数据库名;
- 表
DROP TABLE [IF EXISTS] 表名;
- 记录
DELETE FROM 表名 WHERE 条件;
改
- 数据库
ALTER DATABASE 数据库名 CHARACTER SET 字符集;
- 表
ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
ALTER TABLE 表名 DROP 【COLUMN】字段名;
- 记录
UPDATE 表名 SET 列名1=值1, 列名2=值2, ... WHERE 条件;
查询
- 联合查询
SELECT 字段列表
FROM A表 [INNER | LEFT | RIGHT] JOIN B表
ON 关联条件
WHERE 等其他子句;
- 嵌套查询(子查询)
SELECT
*
FROM
customer
# 查询出来的结果只有一个可以使用 =
WHERE customer.company_id = (SELECT id FROM company WHERE name = '中国石油');
SELECT
*
FROM
customer
# 查询出来的结果有多个可以使用 IN
WHERE customer.company_id IN (SELECT id FROM company WHERE name LIKE '%移动%');
- 分组查询
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;
- 筛选
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件;
-
排序
- ORDER BY子句在SELECT语句的结尾
- ASC:升序
- DESC:降序
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
ORDER BY 某个字段 ASC;
存储过程的创建(见简答题)
触发器的创建(见简答题)
四、设计题
ER图
- 实体、实体属性
- ER图对应的关系模式
建表语句(约束)
- 建表语句格式
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
[表约束条件]
);
-
主键约束(Primay Key)
-
唯一约束 (Unique)
-
默认约束(Default)
-
外键约束(Foreign Key)
-
非空约束(Not Null)
-
例:
CREATE TABLE IF NOT EXISTS student(
id INT NOT NULL UNIQUE,
user_name VARCHAR(20) DEFAULT '',
PRIMARY KEY (id)
);
CREATE TABLE dog(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) UNIQUE,
age INT NOT NULL,
color VARCHAR(15) DEFAULT 'black',
love_dog_id INT,
FOREIGN KEY (love_dog_id) REFERENCES student(id)
);
参考
王珊: 数据库系统概论.
李明杰: Java从0到架构师②JavaEE技术基石.
安全狗: 数据库如何保证安全性.
本文完,感谢您的关注支持!