### 目录
-[√][E-R]()关系简单介绍
-[√] 表是怎么被设计出来的
-[√] 主键和外键
-[√] 表和视图
-[√] 单表查询
-[√] 连接查询
-[√] 嵌套查询
-[√] 集合查询
-[√] 数据更新
-[√] 修改表&删除表([慎用]())
####[E-R]()关系简单介绍
*概念
*E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
*示例图
#### 表是怎么被设计出来的
*范式
*概念
*范式(数据库设计范式,数据库的设计范式)
是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。
*第1范式(1NF)
*数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
*第2范式(2NF)
*数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
*假定选课关系表为SelectCourse(学号,姓名,年龄,课程名称,成绩,学分),关键字为组合关键字(学号,课程名称),因为存在如下决定关系:
-[√](学号,课程名称) → (姓名,年龄,成绩,学分)
*这个数据库表不满足第二范式,因为存在如下决定关系:
-[√](课程名称) → (学分)
-[√](学号) → (姓名,年龄)
*由于不符合2NF,这个选课关系表会存在如下问题:
-[√] 数据冗余
-[√] 插入异常
-[√] 删除异常
*把选课关系表SelectCourse改为如下三个表:
*学生:Student(学号,姓名,年龄)
*课程:Course(课程名称,学分)
*选课关系:SelectCourse(学号,课程名称,成绩)
#### 主键和外键
*主键
*主关键字(主键,primary key)是被挑选出来,作表的行的唯一标识的候选关键字。一个表只有一个主关键字。主关键字又可以称为主键。 主键可以由一个字段,也可以由多个字段组成,分别称为单字段主键或多字段主键。又称主码。并且它可以唯一确定表中的一行数据,或者可以唯一确定一个实体。
*外键
*如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
*建表示例
#### 表和视图
*视图概念
*指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
*视图作用
-[√] 简单性
-[√] 安全性
-[√] 逻辑数据独立性
*创建视图示例
#### 单表查询
*单表查询是指仅涉及一个数据库表的查询,比如选择一个表中的某些列值、选择一个表中的某些特定行等。单表查询是一种最简单的查询操作。
*示例
*查询全体学生的学号与姓名
*select 学号,姓名 from student;
*查询全体学生的出生年份
*select 姓名,2017-年龄 from student;
*多个查询条件查询
*select * from student where 姓名='张三' and 年龄='16';
*根据年龄倒序排序
*select * from student where 姓名='张三' and 年龄='16';
*统计表中的记录数
*select count(*) from student;
*统计学生的平均年龄
*select avg(年龄) from student;
*统计不同名字的学生数(根据名字去重)
*select count(distinct 姓名) from student;
*对查询结果分组
*select 学号,count(*) from selectcourse GROUP BY 学号;
*使用having对分组结果进行筛选
*select 学号,count(*) from selectcourse GROUP BY 学号 having 学号>2
*常用查询条件
#### 连接查询
*卡氏积连接
*不带连接谓词的连接。两个表的卡氏积即是两表中元组的交叉乘积,也即其中一表中的每一元组都要与另一表中的每一元组做拼接,因此结果表往往很大。
*如:select * from student,course;
*自然连接
*如果是按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列,则称之为自然连接。
*如:select * from student,selectcourse where student.学号= selectcourse.学号;
*自身连接
*自连接(self join)是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
*如员工表里有“员工号,管理者工号”,要查询即是员工又是管理者的员工
*如:select a.姓名,a.员工号 from emp a,emp b where a.员工号=b.上司员工号;
*复合条件连接
*where子句中有多个条件的连接操作,称为复合条件查询
*如:select * from student,selectcourse where student.学号= selectcourse.学号 and selectcourse.成绩>=60;
#### 嵌套查询
*带有in谓词的子查询
*如单层嵌套:select * from student where 学号 in(select 学号 from selectcourse);
*如多层嵌套:select * from student where 学号 in(select distinct 学号 from selectcourse
where 课程名称 in(select 课程名称 from course));
*如多层嵌套+复合条件查询:select * from student where 学号 in(select distinct 学号 from selectcourse
where 课程名称 in(select 课程名称 from course)) and 年龄>=17;
*带有exists谓词的子查询
*exists代表存在量词∃。带有exists谓词的子查询不返回任何实际数据,它只产生逻辑真值“true”或逻辑假值“false”。
*如:select * from student WHERE
exists (
select * from selectcourse
where
学号=student.学号 and 年龄=20)
#### 集合查询
*每一个select语句都能获得一个或一组元组。若要把多个select语句的结果合并为一个结果,可用集合操作来完成。(注意:参加union操作的各数据项数目必须向他,对应项的数据类型也必须相同)
*如:select 姓名,年龄 from student UNION select * from course;
#### 数据更新
*插入数据
*如:insert into student VALUES(1,'张三',16);
*修改数据
*如:update student set 年龄=14 where 学号=1;
*删除数据
*delete from student where 学号=1;
*delete from selectcourse where 学号=1;
#### 修改表&删除表([慎用]())
*给表添加一列
*如:alter table student add 性别 varchar(5);
*删除表中某一列
*如:alter TABLE student drop column 性别;
*删除表
*drop table emp;
*drop table selectcourse;
*drop table course;
*drop table student;
*drop view sc;
网友评论