第一章:
数据模型:
1、层次模型
这种模型提供一种相对简单的结构、单个记录以父子关系组织在一起。
2、网状模型
网状模型通过允许记录有多个父子关系,来增强层次模型。
3、关系模型
关系型数据模型与层次模型和网状模型的呆板结构完全不同;关系型数据库是独立于应用程序的。
4、对象模型
它规定了对象的方法、属性和事件。
关系型数据库的三种基本关系类型:
1、一对一关系
在第一个表中的一行只能与第二个表中的一行相关。
2、一对多关系
第一个表中的行可以与第二个表中的一到多个行相关联。
3、多对多关系
第一个表的一行可以与第二个表中的一到多个行相关联,同时,第二个表中的一行可以与第一个表中的一到多个相关联。
SQL语句分类:
1、数据定义语言(DDL)
用于创建、修改和删除数据库内的数据结构
2、数据查询语言(DQL)注释:这个在MySQL用的最多,最重要。
用于从数据库中的一个或者多个表中查询指定的数据
3、数据操作语言(DML)
用于修改数据库中的数据,包括插入、更新和删除数据
4、数据控制语言(DCL)
用于控制对数据库的访问的
第二章:
创建数据库:create database 数据库名称
连接数据库:use 数据库名称
删除数据库:drop database 数据库名称
数据类型:
1、整数数据类型
2、浮点数据类型
3、字符串类型
4、二进制数据类型
5、逻辑数据类型
6、图形数据类型
7、日期和时间数据类型
8、货币数据类型
9、特殊数据类型
管理表 :
创建表、删除表、复制表、修改表
创建索引:create index<索引名>on<表明>(<列名一>,[<列名二>],....
第三章:
数据完整性分为四类:1、实体完整性 2、域完整性 3、引用完整性 4、用户自定义完整性
非空约束:notnull
主键约束:primary key
唯一约束:unique
检查约束:check
第四章:
添加数据:
插入单行记录
insert into <表名> (<列名列表>) values(<值列表>);
插入多行记录
insert into <表名> (<列名列表>) select <select语句>;
将数据从一个表复制到另一个表,但是源表和目标表的列名和列数不一定是相同的
更改数据:
更新单行数据
更新单列数据即对表中某一列的值进行修改,列值可以是常量,也可以是列名,或者计算其它结果。
更新多行数据
更新多列数据只有需要在set子句中,用逗号分隔更新的列名列表即可
删除数据:
使用delete删除行
delete from <表名>where<过滤条件>;
使用truncate语句
truncate table <表名>;
第五章:
投影操作select <列名列表> from <表名>;1.表名前缀和别名<别名>.<列名> <表名> [as] <别名>select <列A> <列B> from <表名> where <条件1> and/or <条件2>;其中 and是两个条件都要满足,or是只满足一个条件即可select studentid,mark from studentexam where ifpassed=1 an mark>80;选择操作单条件选择操作select 列a,列b from表where列c=值;多条件选择操作select 列a,列b from表where 条件1 link 条件2;
连接关键字and 同时满足两个条件or 至少满足两个条件中的一个3.模糊查询使用模糊查询搜索列数据中的文本值select 列A,列B from 表where 列C like <关键字>;关键字由字符和通配符组成% 包含一个或多个字符三 排序升序:select 列A,列B,列C from order by 列A,列B,列C [asc];降序:select 列A,列B,列C from order by 列A,列B,列C [desc];
第六章:
常用的聚合函数:1、count:返回结果集中行的数目2、sum:返回结果集中所有值的总和3、avg:返回结果集中所有值的平均值4、max:返回结果集中所有值的最大值5、min:返回结果集中所有值的最小值
1.执行行和列计数sleect count (<计数规范>) from<表名>; 其中 计数规范:* 计算所有的行,包括Nullall 计数制定的列非空值行 (all可不写)distinct 计数所有的唯一非空值行
2.返回列合计值select sum(<计数规范>) from 表名;①sum函数不能使用*②合计的数据类型只能是数值型③如果合计的是字符串,则返回结果为0
3.获取列平均值select avg(<计数规范>) from 表名;
4.返回最大,最小值select max/min(<最值规范>) from 表名;
①max、min不存在*,all和distinct规范②如果是字符串,返回排序中的最后一个或者第一个
二 数据分组没有聚合的列需要进行分组1.过滤分组数据select 列A,聚合函数(聚合规范) from 表名where 过滤条件order by 列A执行查询后,列A的值被列举出来,被创建的组数目与列A的值的数目匹配
2.使用having子句对分组后的数据再次进行过滤筛选,所以having要放在 group by之后
where和having的区别①where运行在分组之前,不能执行任何聚合函数②having运行在分组之后,执行聚合以后的操作
第七章:
一 子查询子查询也称为内部查询,而包含子查询的语句也称为外部查询。
相关子查询和非相关子查询①非相关子查询是独立于外部查询的子查询,子查询只执行一次,执行完毕后将值传递给外部查询②相关子查询的执行依赖于外部查询的数据,外部查询返回一行,只查询执行一次③非相关子查询效率比相关子查询高
1.子查询作为计算列select 列A,(子查询) from 表名内部查询为外部查询的每行返回一个结果值
2.where子句的子查询select 列A from 表A where 列B =(子查询);3.返回多个结果的子查询使用in 关键字select 列A,列B from 表名where 列C in (select 列D from 表2);4.exists运算符exists运算符允许查找满足特定条件的查询,一般用于where后面,且必须有子查询 判断子查询是否存在数据,如果存在,则表达式为真,就执行子查询,否则不执行子查询。 5.使用all子查询返回结果为多个值时,和子查询的结果逐一比较,全部满足时表达式才为真。 6.使用any子查询返回结果为多个值时,和子查询的结果逐一比较,当有一个值满足时,表达式就为真。 all和any运算符和比较运算符一起使用。
二 组合查询子查询能从多个表中获取数据,但是只能返回一个表中的数据 组合查询能从多个表中获取数据,同时能返回多个表中的数据
1.使用union运算符select 列A ,列B from 表A union select 列C,列D from 表B; 将表A的查询结果与表B的查询结果综合,去掉重复的数据。同时,表B查询结果中的列名被忽略。
1.使用union all运算符select 列A ,列B from 表A union all select 列C,列D from 表B; 保留了查询结果中的重复数据
第八章:
将两个表中的数据联接起来,形成一张中间表,进行数据的查询操作select table1.column1,table2.column2 from table1 join table2ontable1.column1 = table2.column2; 多表联接select table1.column1,table2.column2 from table1 join table2ontable1.column1 = table2.column2 join table3ontable3.column3 = table4.column4; 非相等联接所有的相等链接都在where子句中使用相等运算符(=),当然,我们也可以在联结中使用其它比较运算符内链接内链接是一种典型的联结运算,使用像=或^之类的比较运算符。外连接可以是左右外链接左外联接left join 结果集中包括left join字句中左表的所有的行。 右外联接right join 结果集中包括right join字句中右表的所有的行。 自联接主键外键都在同一张表里,自联的所有数据都在同一张表里
第九章:
数据库设计过程1.规划阶段2.需求分析3.概念设计4.逻辑设计5.物理设计6.数据库的实现7.数据库的运行与维护工作
数据库三大范式:第一范式:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。第二范式:第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。第三范式:满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。范式说明 : 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。 例如,如下的数据库表是符合第一范式的: 字段1 字段2 字段3 字段4 而这样的数据库表是不符合第一范式的: 字段1 字段2 字段3 字段4 字段3.1 字段3.2 很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。 假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系: (学号, 课程名称) → (姓名, 年龄, 成绩, 学分) 这个数据库表不满足第二范式,因为存在如下决定关系: (课程名称) → (学分) (学号) → (姓名, 年龄) 即存在组合关键字中的字段决定非关键字的情况。 由于不符合2NF,这个选课关系表会存在如下问题: (1) 数据冗余: 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。 (2) 更新异常: 若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。 (3) 插入异常: 假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。 (4) 删除异常: 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。 把选课关系表SelectCourse改为如下三个表: 学生:Student(学号, 姓名, 年龄); 课程:Course(课程名称, 学分); 选课关系:SelectCourse(学号, 课程名称, 成绩)。 这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。 另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段x → 非关键字段y 假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系: (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话) 这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系: (学号) → (所在学院) → (学院地点, 学院电话) 即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。 它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。 把学生关系表分为如下两个表: 学生:(学号, 姓名, 年龄, 所在学院); 学院:(学院, 地点, 电话)。 这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。 鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。