数据库小问题

关系型数据库中,关于数据表设计的基本原则,规则就称为范式,范式是我们在设计数据库结构过程中需要遵循的规则和指导方法。

介绍一下数据库的几种范式。

第一范式

每个列都是原子的不可再分,也就是数据表中的每个字段的值是不可再拆分的最小数据单元。

第二范式

第二范式要求在满足第一范式的基础上,还要满足数据表里的每一条数据记录,都是可唯一标识的,而且所有的非主键字段,都必须完全依赖主键,不能只依赖主键的一部分。

比赛表里面包含球员编号,姓名,年龄,比赛编号,比赛实际和比赛场地等属性,候选键和主键都是(球员编号,比赛编号),我们可以通过候选键(主键)来决定下面的关系。
(球员编号,比赛编号)——>(姓名,年龄,比赛时间,比赛场地,得分)
但是这个数据表不满足第二范式,因为数据表中的字段之间还存在下面的对应关系:

(球员编号)——>(姓名,年龄)
(比赛编号)——>(比赛时间,比赛场地)
非主属性并非完全依赖候选键,这样会产生下面的问题。

1.数据冗余:如果一个球员参加m场比赛,那么球员的姓名和年龄就重复了m-1次,一个比赛可能有n个球员参加,比赛时间和地点就重复了n-1次
2.插入异常:如果我们要添加一场新的比赛,但是这时还没有确定参加的球员都有谁2,那么就没发插入
3.删除异常:我们想删除某个球员编号,但是如果没有单独保存比赛表的话,就会同时把比赛信息删除掉
4.更新异常:如果我们调整了某个比赛时间,那么数据表所有的这个比赛的时间都得进行调整,不然就会出现同一场比赛但是时间不同的情况。

第三范式

第三范式建立在已经满足第二范式的基础上

数据表中的每一个非主键字段都和主键字段直接相关

也就是说数据表中的所有非主键字段不能依赖于其他非主键字段

这个规则的意思是所有非主属性之间不能有依赖关系,它们是互相独立的

函数和存储过程的区别是什么?

函数function中不能有sql语句,存储过程procedure可以有函数function和sql语句,函数function有返回值,存储过程procedure没有但没有使用OUT|INOUT参数来返回数据。

什么是事务?事务的关键字是什么?

事务transaction是一组sql语句,作为一个单元,要么全部执行,要么全不执行。

事务有哪几种特性?展开说说

ACID

原子性:事务是一个原子操作单元,要么全部执行,要么全不执行。一个错误全部回滚。

一致性:事务在开始和完成时数据库的完整性约束没有被破坏,事务开始之前和结束之后数据库状态必须保持一致。

隔离性:多个事务并发执行时,每个事务都应该与其他事务隔离

持久性:一旦事务提交,他所做的修改将会永久的保存在数据库中,及时系统崩溃也不会丢失。

聚合函数有哪几个?

count统计个数,sum求和,max最大值,min最小值,avg平均值。

例题:

        学校考试系统中有三个表,学生基本信息表student(学号id,学生姓名name,年龄age,性别 sex),选课信息表course(学号id,课程编号courseld,成绩score),课程信息表class(课程编号courseld,课程名称 courseName任课老师 teacherName),其中学号是主键并且是自增的,学生姓名要求唯一并且不能为空,年龄默认 18岁,性别是枚举值'男’和'女’。写出下面的SQL语句:

1.创建 student 表

create table student(

        id int auto_increment primary key,

        name varchar(50) not null unique,        

        age int default 18,

        sex enum('男','女')

);

2.从选课信息表 course 表中删除选择 Lily 老师的女学生的选课记录

delete course

where course.id in(

        select course.id

        from student

        inner join course on student.id = course.id

        where student.sex = '女' and course.teacherName = 'Lily';

);

3.创建一个触发器,在删除 student表的时候,同时删除course 表中相同学号的信息

delimiter //

create trigger mytrigger

before delete

on student

for each row

begin

        delete from course where couse.id = old.id; 

end //

delimiter ; 

4.创建一个分页的存储过程,对 student表进行分页,输入参数页数(page int)和每页显示的行数(nCount int)。

delimiter //

create procedure mypro(page int,nCount int)

begin

declare nOffset int default 0;

declare nSumcount int default 0;

declare Maxpage int default 0;

select count(*) into nSumcount from student;

if(nSumcount%page=0) then set Maxpage = nSumcount/page;

else set Maxpage = floor(nSumcount/page)+1;

end if;

if(page<0) then set page = 1;

end if;

if(page>Maxpage) then set page = Maxpage;

end if;

set nOffset = (page-1)*nCount;

select * from student limit nOffset,nCount;

end //

delimiter ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值