MySQL相关

本文深入讲解了数据库规范化理论,包括第一、二、三范式及BCNF,探讨了如何消除函数依赖,提升数据一致性。同时,详细介绍了SQL操作,如创建、修改、查询、更新和删除数据,以及触发器和存储过程的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础

候选码:可唯一标示一个元组的某一属性组(也就是多列),可能有多个候选码,选择其中一个为主码。

除了候选码的属性完全函数依赖于候选码。设K是某表中的一个属性或属性组,若除K以外的所有属性都完全函数依赖于K,那么就称K为候选码。
可以理解为:加入当K确定的情况下,该表除K以外的所有属性的值越久随之确定,那么K就是码。

主属性:候选码的属性成为主属性,候选码可能只有一个属性,也可能包含关系的所有属性(全码)
非主属性:不含候选码中的任何属性

范式

第一范式

如果一个关系模式R中的所有属性都是不可分割的基本数据项,则R属于1NF。
简单来说也就是不能表中有表。

第二范式

若R属于1NF,且每一个非主属性完全依赖于码(任何一个候选码),则R属于2NF。
第二范式在第一范式的基础上消除了非主属性对码的部分函数依赖。
判断条件:是否存在非主属性对码的部分函数依赖。

第三范式

若R属于2NF,若每一个非主属性不传递依赖于码,则R属于3NF。
第三范式在第二范式的基础上消除了非主属性对码的传递函数依赖。

BCNF

若每一个决定因素都包含码,则R属于3NF。
在第三范式的基础上消除了主属性对码的部分函数依赖和传递函数依赖。

增删查改

create database EXP; #创建数据库
use EXP; #使用当前数据库

#创建Student表
create table Student(
SNO char(9) primary key,
SNAME char(20) unique,
SEX char(2),
BDATE 
Sage smallint,
Sdept char(20)
);

#创建Course表,参照表和被参照表可以是同一个表
create table Course(
Cno char(4) primary key,
Cname char(40) not null,
Cpno char(4),
Ccredit smallint,
foreign key (Cpno) references Course(Cno)
);

#创建SC表,并定义外键
create table SC(
Sno char(9),
Cno char(4),
Grade smallint,
primary key(Sno, Cno),
foreign key (Sno) references Student(Sno),
foreign key (Cno) references Course(Cno)
);

alter table Student add S_entrance date; #Student表增加一列
describe Student;
alter table Course add unique(Cname); #增加课程名取唯一值的约束性条件
alter table Student modify column Sage int; #改变年龄的数据类型,这里和sql标准不一样,使用modify
describe Student;
#drop table Student; #删除基本表
insert into Student values('1', 'Jiang', 'b', 20, 'CS', '2016-09-01'); #插入数据
insert into Student(Sno, Sname, Ssex, Sage, Sdept) values('2', 'TK', 'b', 20, 'CS');
select * from Student; #查询全部内容
select * from Student where Sno='1'; #条件查询
update Student set Sage=19 where Sno='2'; #修改属性
update Student set Sage=Sage+1; #安全模式下会报错,取消安全模式,edit-》preference-》SQL-editor-》safe-updates,重新连接数据库
delete from Student where Sno='2';  #删除记录
insert into Student values('3', 'Liu', 'b', 20, 'CS', '2016-09-01');
insert into Student values('4', 'Wang', 'b', 22, 'RJ', '2016-09-01');
insert into Student values('5', 'Zhang', 'b', 23, 'SJ', '2016-09-01');
insert into Student values('12', '林', 'b', 18, 'CS', '2016-09-01');

触发器

delimiter //
create trigger Upd_Credit
after insert on SC 
for each row
begin
declare c int;
declare g int;
set g = 0;
if not exists(select * from Credits where SNO=new.SNO) then
	if new.Grade < 60 then
		set g=1;
	end if; 
	select CREDIT into c from Courses where new.CNO=Courses.CNO;
	insert into Credits values(new.SNO, c, g);
else
	if new.Grade < 60 then
		set g=1;
	end if; 
	select CREDIT into c from Courses where new.CNO=Courses.CNO;
    update Credits set SumCredit=SumCredit+c, NoPass=NoPass+g where SNO=new.SNO;
end if;
end //
delimiter ;
drop trigger Upd_Credit;  #删除触发器

存储过程

delimiter //
create procedure add_student(sno varchar(20), sname varchar(45), ssex varchar(4), sdate date, sheight double, dept varchar(45))
begin
insert into Students values(sno, sname, ssex, sdate, sheight, dept); 
end; //
delimiter ;
call add_student("20190120", "JYP", "男", curdate(), 1.75, "信息安全"); #curdate()返回当前日期
drop procedure add_student;

delimiter //
create procedure upd_grade(in sid varchar(20), in cid varchar(20), in gd int)
begin
update SC set GRADE=gd where SNO=sid and CNO=cid;
select * from SC where SNO=sid and CNO=cid;
end; //
delimiter ;
call upd_grade("201530311042", "C1", 94); #调用存储过程

drop procedure disp_student;#删除存储过程
delimiter //
create procedure disp_student(in sid varchar(20), out sum_credit int, out avg_grade double)
begin
select SC.SNO, SNAME, SSEX, 2019-date_format(BDATE,"%Y"), HEIGHT, DEPARTMENT, CNAME, GRADE from SC, Courses, Students
where SC.SNO=Students.SNO and SC.CNO=Courses.CNO and SC.SNO=sid;
select sum(CREDIT) into sum_credit from SC, Courses where SC.CNO=Courses.CNO and SC.SNO=sid group by SNO;
select avg(GRADE) into avg_grade from SC, Courses where SC.SNO=sid and SC.CNO=Courses.CNO and CREDIT > 3 group by SNO;
end; //
delimiter ;
call disp_student("201592450586", @sum_credit, @avg_grade);
select @sum_credit, @avg_grade;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值