MySQL数据库自学笔记

  • 数据库的概括

1.1数据库的基本概念

1.数据与信息

数据:描述事物的符号记录,是数据库中存储 用户操纵的基本对象

特征:

  1. 数据有“型和值”之分
  2. 数据有“定向表示与定量表示”之分
  3. 数据受数据类型与取值范围的约束
  4. 数据具有载体与多种表现形式

数据类型:文字 数值 布尔 ..

2.数据库

    定义:数据库是按照一定结构组织并长期存储在计算机内的,可共享的大量相关数据的集合

3.数据库管理系统(DBMS)

 定义:安装在操作系统之上,是一个管理,控制数据库中各种数据库对象的软件系统。

功能:

数据库的定义功能数据库的操纵功能

数据库的运行管理 数据库的建立和维护

4.数据库系统

   定义:是实现有组织,动态储存大量的相关结构化数据,方便各类用户访问数据库的计算机软硬件资源的集合。

构成:由数据库,数据库管理系统,软件平台,硬件平台和用户构成。

1.2 数据管理技术的发展

1.人工管理阶段

2.文件系统阶段

3.数据库系统管理

1.3 数据库系统的特点

数据库的特点

1.数据结构化

2.实现数据共享

3.特定的数据模型(数据由DBMS 统一管理和控制)

4.数据独立性高

1.4 数据库系统体系结构

三级模式

1.模式

模式==概念模式:数据库中全体数据的逻辑结构和特征描述,是所有用户的公用数据视图。

外模式(用户模式 子模式):局部模式的逻辑结构和特征,从用户角度看待数据库的。

内模式:也称为存储模式,他是对数据物理结构和储存方式的描述,是数据在数据库内部的表达方式。

两级映射

逻辑独立性(概念模式与外模式)

物理独立性(概念模式与内模式)

  • 数据模型

2.1信息的三种世界描述

2.2数据模型

1.定义:是对现实世界中客观事物及事物之间联系的抽象,并用数学描述进行模拟展示。

要求:比较真实的模拟现实世界;容易被用户理解;便于在计算机中实现。

2.概念层 逻辑层 物理层

3.数据模型的三要素

数据结构 数据操作 完整性约束

2.3 概念模型

1.信息世界的基本概念

(1)实体:客观存在并可相互区别的事物。

(2)属性:实体所具有的某一特征。

    (3)实体型:实体类型名和所有属性来共同表达同一类实体 例 :学生(学号,姓名 …)

(4)实体集:同类实体集合

(5)码:可以唯一标识一个实体的属性集

(6)域:实体属性的取值范围

(7)联系:实体内部的联系和实体之间的联系

2. E-R模型

注意:

1.命名冲突

2.结构冲突

3.属性冲突

2.4逻辑模型

1逻辑模型的定义

指数据库的逻辑模型,是对应现实世界的第二层抽象

分类:层次模型 网状模型 关系模型 面向对象模型

2.5概念模型与逻辑模型的转换

E-R模型转换成逻辑模型

1.实体准换原则

(1)一个实体转换为一个关系模式

(2)实体的名称即是关系模型的名称

(3)实体的属性就是关系的属性

(4)实体的码就是关系模型的码

2.6关系模式

2.6.1

1.元组:关系表中的每行对应一个元组,组成元组的元素称为分量

 2.属性:关系中的每一列对应一个域。由于域可以相同,为了加以区分,必须给每列一个命名,这个命名就是属性。

3.候选码:关系中的某一属性或属性组的值能唯一的标识这个元组,称该属性或属性组为候选码。

4.主码:若一个关系中有多个候选码,则选定其中一个为主码。唯一不可为空

主码作用如下:

1.唯一标识关系的每行;

2.作为关联表的外键,链接两个表;

3.使用主码值来组织关系的存储;

4.使用主码索引快速检索数据。

5全码:所有属性的组合,全码可作为候选码

 6.主属性和非主属性:包括候选码的属性是主属性,不包括候选码的属性叫做非主属性

7.代理键

2.6.2数据库中关系的模型

类型:基本表 查询表 视图表

基本表

基本表指的是数据库中最基本的数据存储单元,它包含了实际存储的数据。通常情况下,基本表用于持久性存储数据。在关系型数据库中,基本表通常使用一种行列的结构,每行代表一个实体或记录,每列代表记录中的一个属性或字段。在基本表中,存储着不同实体之间的关联关系,通过这些关联关系可以实现不同表之间的数据查询和管理。基本表是数据库中最常见和基本的数据存储形式。

查询表

查询表是一个虚拟的表,它并不真正存储数据,而是通过查询和计算等方式得到的临时性数据结果。通常来说,查询表是在用户需要的时候通过执行特定的 SQL 查询语句而动态生成的,它不会保存任何数据,只是数据的一个临时表示。查询表可以用于展示、筛选、分析数据,但本身并不对数据进行物理存储。

视图表

视图表是一种虚拟表,它是基于一个或多个基本表或查询表的查询结果动态生成的一种数据对象。视图本身不存储实际数据,它只是一个基于特定查询条件得到的动态结果集。通过视图,用户可以以类似于基本表的方式查询和操作数据,同时它也可以对数据进行筛选、转换和重新组织。利用视图,可以隐藏复杂的数据结构、简化复杂的查询,并对外提供一种简化的数据展现方式。视图可以看作是基于现有表或查询结果的一种虚拟表。

关系的性质:

1)关系中的元组存储了某个实体或实体某个部分的数据。

2) 关系中元组的位置具有顺序无关性,即元组的顺序可以任意交换。

3)同一属性的数据具有同质性,即每一列中的分量是同一类型的数据,他们来自同一个域。

4)同一关系的字段名具有不可重复性,即同一关系中不同属性的数据可出自同一个域,但不同属性给予不同的字段名

5)关系具有元组无冗余性,即关系中的任意两个元组不能完全相同。

6)关系中列的位置具有顺序无关性,即列的次序可以任意交换、重新组织。

7)关系中每个分量必须取原子值,即每个分量都必须是不可分的数据项。

2.6.4关系模式 R (U,D,Dom,F)

R:关系名

U:属性集合

D: 域

Dom:属性到域的映射

F:属性间数据依赖关系的集合

2.6.5关系操作

1.数据查询

2.数据维护

3.数据控制

1)数据查询指数据检索、统计、排序、分组以及用户对信息的需求等功能。

2) 数据维护指数据添加、删除、修改等数据自身更新的功能。

3)数据控制是为了保证数据的安全性和完整性而采用的数据存取控制及并发控合功能。

2.6.6关系完整性:

实体完整性

参照完整性

用户自定义完整性

  • 关系运算

3.1关系运算概述

关系代数:是一种抽象的查询语言,是用对关系的运算来表达查询。作为调查关系数据语言的数学工具

关系运算三要素

关系代数是一种抽象的查询语言是用对关系的运算来表达查询,作为研究关系数据语言的数学工具。

运算对象、运算符、运算结果

关系代数的运算对象是关系

运算结果亦为关系

2.基本运算符

集合运算 特殊的关系运算 逻辑运算 算数运算

3.2传统集合运算

并运算

设R和S

两个关系具有相同的目(都有n个属性)

相同的属性取自一个域

域:一种相同数据值的集合

R U S

运算后为具有n个属性的新关系,有属于R或者属于S的元组组成记作:

R U S={t|t∈RVt∈S}

交运算

差运算

笛卡尔积运算

选择运算(Select *)

投影运算

连接运算

除创建数据库

create database if not exists studentinfo

default character set utf8 collate utf8_bin;

展示数据库

show databases;

修改数据库

Alter database studentinfo character set gbk;

删除数据库

Drop database studentinfo ;

创建数据表

CREATE TABLE sdept(deptno CHAR(2), dname VARCHAR(30) NOT NULL , address VARCHAR(50) ,telephone CHAR(13) UNIQUE , CONSTRAINT pk_sdept PRIMARY KEY (deptno) )

ENGINE=INNODB DsdeptEFAULT CHARSET=UTF8 COLLATE =UTF8_BIN;

学生表

CREATE TABLE student( sno CHAR(15) , sname CHAR(8) NOT NULL , ssex ENUM('男','女'),sage TINYINT DEFAULT 18, deptno CHAR(2) ,spwd CHAR (10) , CONSTRAINT pk_stu PRIMARY KEY (sno),

CONSTRAINT fk_stu foreign KEY (deptno) REFERENCES sdept (deptno) ,  CONSTRAINT ck_sage CHECK(sage>15 AND sage <35))ENGINE=INNODB DEFAULT CHARSET=UTF8 COLLATE=UTF8_BIN;

课程表

CREATE TABLE course ( cno CHAR(10), cname CHAR(30) NOT NULL UNIQUE , ccredit FLOAT (3,1) , institute CHAR (2),

CONSTRAINT pk_cour PRIMARY KEY (cno) , CONSTRAINT fk_coudeptno FOREIGN KEY (institute) REFERENCES sdept (deptno) ) ENGINE = INNODB DEFAULT CHARSET =UTF8 COLLATE =UTF8_BIN;

选课表‘

’CREATE TABLE score (

sno CHAR (15),

cno CHAR(8),

grade FLOAT (6,2) ,

PRIMARY KEY (sno,cno ),

CONSTRAINT fk_sc1 FOREIGN KEY (sno) REFERENCES student (sno),

CONSTRAINT fk_sc2 FOREIGN KEY (cno) REFERENCES course (cno),

CONSTRAINT ck_grade CHECK (grade<=100 AND grade >=0)

) ENGINE =INNODB DEFAULT CHARSET=UTF8 COLLATE =UTF8_BIN;

教师表

CREATE TABLE teacher(

tno char(15),

tname char(8) NOT NULL,

tsex enum('男','女'),

grad char(30),

title char(20),

deptno char(2),

tpwd char(10),

CONSTRAINT pk_tea PRIMARY KEY(tno),

CONSTRAINT fk_tea FOREIGN KEY(deptno) REFERENCES sdept(deptno)

)ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

数据表

CREATE TABLE failsc(

id INT AUTO_INCREMENT,

sno CHAR(15),

cno CHAR(8),

grade FLOAT(6,2),

constraint pk_id PRIMARY KEY (id)

)

录入数据

1.院系表

insert into sdept values

('01','计算机学院','南京路2号','045188010102'),

('02','自动化工程学院','北京路5号','045188010613'),

('03','通信管理学院','南京路7号','045188012121'),

('04','经济管理学院','天津路1号','045188016133'),

('05','人文学院','大连路10号','04518805516')

2.学生表

insert into student values

('0803010126','高天','男',20,'01' ,'1234'),('0601020212','张新','女',21,'02' ,'1234'),

('0802020230','黎明','男',18,'03' ,'1234'),('0803020101','张铁','男',19,'04' ,'1234'),

('0702010205','刘芳','女',22,'02' ,'1234'),('0603010114','李振刚','男',23,'04' ,'1234'),

('0803020109','杨云','女',17,'04' ,'1234'),('0801010215','张扬','男',18,'04' ,'1234'),

('0703020216','张书贺','男',21,'01' ,'1234'),('0601010127','张庚源','男',23,'02' ,'1234'),

('0602010223','余杰','女',22,'02' ,'1234'),('0701010132','刘一','女',19,'05' ,'1234'),

('0802020133','安然','女',20,'01' ,'1234'),('0802010206','于多','男',19,'03' ,'1234'),

('0703010111','王艳','女',21,'05' ,'1234'),('0803020107','刘明浩','男',18,'01' ,'1234')

3.课程表

insert into course values

('A001','计算机导论',2,'01'),('A002','C语言 ',3,'01'),

('A003','电子技术',4,'02'),('A004','金融理论',3,'04'),

('A005','会计学',2,'04'),('B001','接口原理',3,'02'),

('B002','无线技术 ',4,'03'),('C001','哲学',2,'05'),

('C002','思想道德修养',4,'05'),('B003','通讯测量',3,'03')

4.成绩表

insert into score values

('0601020212','B001',89),('0803010126','A002',45),

('0601020212','B002',91),('0702010205','A003',95),

('0702010205','A002',76),('0803020101','C001',68),

('0803020101','A005',81),('0802020230','C002',58),

('0703020216','A001',75),('0703020216','A004',88),

('0702010205','B002',71),('0803020107','A004',86),

('0802020133','B002',94),('0802020133','A001',51),

('0701010132','A005',74),('0701010132','C001',39)

5.教师表

insert into teacher values

('2007053','刘贺','女','师范大学','院长','01','1234'),

('2005126','李俊','男','工业大学','教师','01','1234'),

('2004161','刘书通','男','东北师大','院长','02','1234'),

('2003012','王翠茂','男','林业大学','教师','02','1234'),

('2001102','王丽','女','农业大学','院长','03','1234'),

('2004217','赵文艳','女','工程大学','教师','03','1234'),

('2001161','洪哲','男','工业大学','院长','04','1234'),

('2004078','王翠茂','男','商业大学','教师','04','1234')

一、修改数据表

1.修改

ALTER TABLE sdept MODIFY telephone CHAR(20);

2.添加

ALTER TABLE student ADD (address CHAR(30) , CONSTRAINT un_stusname UNIQUE (sname));

3.删除

ALTER TABLE student DROP COLUMN address;

4.查看所有约束

SELECT * FROM information_schema.KEY_column_usage;

5.删除数据库

DROP TABLE teacher;

6.显示表结构

DESC sdept;

Describe sdept;

复制数据表

复制表结构

Create table sc like score;

Select * from sc;

复制表结构和数据

Create table stu as select sno,sname from student ;

二、常用可执行命令

1. MySQL服务启动与关闭命令

(1)启动服务

命令:net start mysql  

(2)停止服务

命令:net stop mysql  

2. 连接MySQL

(1)采用主机形式

命令:mysql  –hlocalhost  –u用户名  –p密码

(2)不采用主机形式

命令:mysql  –u用户名  –p密码

(3)采用IP地址形式

命令:mysql  -h127.0.0.1 –u用户名  –p密码

3. 查看数据库所有表

命令:mysqlshow -u用户名 -p密码 数据库

4. 修改密码mysqladmin

(1)用户没有密码

命令:mysqladmin -u用户名 -password 新密码

(2)用户有密码

命令:mysqladmin -u用户名 -p旧密码 password 新密码

二、MySQL 常用命令

1. 退出MYSQL命令

命令:exit; 或 quit;

2. 显示、打开数据库

(1)显示所有数据库

命令:show databases;

(2)查看数据库文件的存储位置

命令:show global variables like “%datadir” ;

(3)打开数据库

命令:use 数据库名;

3. 显示表结构命令

(1)显示当前数据库中的所有表

命令:show tables;

(2)查看表的详细描述

命令:describe 数据表名;

4. 查看命令使用形式

命令:help 命令名称;

5. 查询数据库所有数据表

在information_schema.tables表中存储了MySQL中所有数据表,数据量很大,且字段较多,显示时需要设置格式,可以采用“\G”。

(1)打开数据库

命令:use information_schema;

(2)查询系统表

命令:select * from information_schema.tables;

显示时,发现数据字段显示比较混乱,在查询语句后可采用“\G”,能够格式化显示数据表。

“\G”:在MySQL的sql语句后加上\G, 表示将查询结果进行按列打印,可以使每个字段打印到单独的行。

“\g”:在MySQL的sql语句后加上\g,效果等同于加上定界符,一般默认的定界符是分号。

select * from information_schema.tables \G;

select * from information_schema.tables \g;

二 录入数据

SELECT * FROM student ;

1.主键问题

INSERT INTO student VALUES('0601010127','张三','男','20','02','1');

2.外键问题

INSERT INTO student VALUES('0601010111','张三','男','20','09','1');

3.枚举问题

INSERT INTO student VALUES('0601010127','张三','male','20','02','1');

唯一约束问题

INSERT INTO sdept(deptno,dname,telephone) VALUES('06',计算机学院','045188010102');

数据长度超出字段设计最大值问题

INSERT INTO sdept(deptno,dname,telephone) VALUES('06',计算机学院','045188010123355656463456402');

检查约束

INSERT INTO score VALUES ('0703020216','A005',105)

属性字段和值的个数不匹配问题

INSERT INTO failsc VALUES ('0703020216','A005',45)

字段和值的类型不匹配问题

INSERT INTO failsc VALUES ('0703020216','A005',A45)

更新语句

UPDATE sdept SET telephone='888855555' WHERE dname='计算机学院'

模糊匹配

UPDATE sdept SET telephone='888855545' WHERE dname LIKE '%计算机%'

修改分数

UPDATE score SET  grade=grade+5 WHERE cno='A001'

删除数据

DELETE FROM teacher WHERE tsex='男'

清空数据

TRUNCATE TABLE teacher

Truncate 和 Delete 的区别:

Truncate:

操作类型:Truncate 是 DDL(数据定义语言)命令。

影响范围: 它会将表中的所有行都删除,并可以重置自增的 ID(如果存在)。

事务日志:不会记录在事务日志中,因此不能回滚。

效率:通常情况下更快,因为它不记录每一行的删除操作。

Delete:

操作类型:Delete 是 DML(数据操作语言)命令。

影响范围: 它可以根据指定的条件删除表中的特定行。

事务日志: 每一条被删除的行都会被记录在事务日志中,因此可以回滚到之前的状态。

效率:相对较慢,因为它记录每一行的删除操作,而且还要触发相关的触发器和约束检查。

因此,两者的最大区别在于操作类型(DDL 和 DML)、影响范围以及对事务日志的记录和效率。

单表查询

Where 行 选择

‘*’表示列 投影

选择列

Select * from student

Select sno,sname,sage from student

Select * from student,course(笛卡尔积运算)

选择元组

Select * from sdept where address like ‘%南京路%’;

Select * from student where deptno=’02’ and ssex=’男’

Select sno ,sname,sage  from student where deptno=’02’ and ssex=’男’

Select * from student where (deptno=’02’or deptno=’04’)and sexx =’男’

3.谓词

(1)between… and…

select * from student where sage <=22 and sage>=20;

select * from student where sage between 20 and 22;

(2)in

select * from student where deptno=’02’ or deptno=’04’;

select * from student where deptno in (‘02’,’04’);

(3)not null 或null

Select * from score where grade is null;

Select * from score where grade is not null;

(4)like

Select *from student where sname like’张%’;

Select * from student where sname like’%书%’;

Select * from student where sname like’_书%’;(第二个是书)

Select * from student where sname like ‘张_’;

(5)distinct

Select distinct sno from score;

Select distinct cno from score ;

4 别名

Select sno 学号,sname 姓名,sage 年龄 from student;

Select sno as 学号

5.limit

Select *  from student limit 1,4;后面接的第一个是下标 第二个是查询几个数据。

6.聚合函数

(1)Count()

Select count(*) from student;

Select count(distinct sno) from score;

(2)Sum()

Select sum(grade) from score where sno=’0601020212’;

(3)Avg()

Select avg(grade) from score where sno=’0601020212’;

(4)Max()

Select max(grade) from score where cno=’A001’;

(5)Min()

Select max(grade),min(gradea) from score where cno=’A001’;

7.order by

select * from score where cno=’A001’order by grade;(默认升序) asc升序

select * from score where cno=’A001’order by grade desc;

select * from student order by sno asc,sage desc;

8.group by(必考)

select deptno,count(*) from student group by deptno;

SELECT deptno,ssex,count(*) FROM student GROUP BY deptno,ssex ORDER BY deptno;

Having 作用于group by 后

SELECT cno,COUNT(sno) FROM score GROUP BY cno HAVING COUNT(sno)>=2;

多表查询

1.笛卡尔积查询

SELECT *  FROM sdept , student ;

2.条件查询

查询所有学生的基本信息及所属院系信息

SELECT student.* ,sdept.dname,sdept.address,sdept.telephone FROM student,sdept WHERE sdept.deptno=student.deptno;

查询所有学生的基本信息及所属院系信息,用别名

SELECT st.* ,sd.dname,sd.address,sd.telephone FROM student st,sdept sd WHERE sd.deptno=st.deptno;

查询所有女学生的基本信息所属院系,用别名

SELECT st.* ,sd.dname,sd.address,sd.telephone FROM student st,sdept sd WHERE sd.deptno=st.deptno AND st.ssex='女';

3.Inner join

查询每个学生的基本信息和成绩信息

SELECT *  FROM student INNER JOIN score ON student.sno=score.sno;

4.natural join

查询每个学生的基本信息和成绩信息

SELECT * FROM student NATURAL JOIN score ;

(2)查询女学生的基本信息和成绩信息

SELECT * FROM student INNER JOIN score ON student.sno=score.sno WHERE student.ssex='女';

SELECT * FROM student INNER JOIN score ON student.sno=score.sno AND student.ssex='女';

练习:

查询计算机每位老师的编号 姓名 毕业学校 职称 电话等内容

SELECT teacher.* FROM teacher ,sdept WHERE teacher.deptno=sdept.deptno AND sdept.dname LIKE '%计算机%'

查询选修了课程的所有学生的学号 姓名 课程名称以及成绩

SELECT student.sno,sname,cname,grade FROM student , course , score WHERE student.sno=score.sno AND course.cno=score.cno;

查询非计算机学院所有学生的信息

SELECT student.* FROM student , sdept WHERE student.deptno=sdept.deptno AND sdept.dname NOT LIKE '%计算机%'

查询通信学院所有学生的基本信息

SELECT student.* FROM student, sdept WHERE student.deptno=sdept.deptno AND sdept.dname LIKE '%通信%'

查询计算机专业课设的所有课程

SELECT course.* FROM  sdept , course WHERE sdept.deptno=course.institute AND sdept.dname LIKE '%计算机%'

查询选修了c语言的所有学生的学号 姓名院系名称和成绩

SELECT student.sno,sname,dname,grade FROM student , course , score,sdept WHERE student.sno=score.sno AND course.cno=score.cno AND sdept.deptno=course.institute AND course.cname='C语言';

外连接查询

查询所有学生的选课情况(包括选课和没选课两种情况)

(左外)

Select * from student left outer join score on student.sno=score.sno;

(右外)

Select * from student right outer join score on student.sno=score.sno;

自身查询

查询与高天在同一院系的其他学生

SELECT s2.* FROM student s1,student s2 WHERE s1.deptno=s2.deptno AND s1.sname='高天' AND s2.sname !='高天'

查询教师中与李俊老师毕业于同一学校的所有老师

SELECT t2.* FROM teacher t1,teacher t2 WHERE t1.grad=t2.grad AND t1.tname='李俊' AND t2.tname!='李俊'

嵌套查询

关系规范化理论

处理数据时会出现的操作:

数据冗余

插入异常

更新异常

删除异常

关系模式的描述

1.函数依赖

定义:在关系数据库理论中,函数依赖(Functional Dependency)是一种重要的概念,用于描述数据库表中的数据之间的约束关系。函数依赖定义如下:

给定一个关系模式 R,假设 X 和 Y 是 R 中的属性集合,称为函数依赖 X → Y,如果对于关系 R 中任意两个元组 t1 和 t2,如果它们的属性 X 相同,则它们的属性 Y 也相同。

换句话说,函数依赖 X → Y 意味着当两个元组在属性 X 上的取值相同时,它们在属性 Y 上的取值也相同。

这可以用如下形式的符号表示:

\[ X \rightarrow Y \]

其中,X 和 Y 是属性(或属性集合)的集合,X 称为函数依赖的左部(Left-hand Side,LHS),Y 称为函数依赖的右部(Right-hand Side,RHS)。

函数依赖的基本性质:

叠加性(合并性)

若X->Y X->Z x->YZ

分配性   

自反性(Reflexivity): 如果 Y 包含于 X,则 X → Y。这表示如果一个属性集合 Y 的属性都可以由属性集合 X 的属性唯一确定,则称 X → Y 成立。

扩展性(Augmentation): 如果 X → Y 成立,则对于任何属性集合 Z,XZ → YZ 也成立。这表示如果 X 能够唯一确定 Y,那么在保持 X 不变的情况下,可以添加其他属性 Z 来唯一确定 Y。

传递性(Transitivity): 如果 X → Y 且 Y → Z 成立,则 X → Z 也成立。这表示如果 X 能够唯一确定 Y,Y 能够唯一确定 Z,那么 X 也能够唯一确定 Z。

分解性(Decomposition): 如果 X → Y1Y2 成立,则 X → Y1 和 X → Y2 也成立。这表示如果 X 能够唯一确定 Y1 和 Y2 的组合,那么 X 也能够唯一确定单独的 Y1 和 Y2

自然连接(Natural Join): 如果 R 中存在 X → Y 和 R 中存在 W → Z,且 Y 与 W 的属性集合相同,则 XW → YZ 成立。这表示如果 X 能够唯一确定 Y,而 W 能够唯一确定 Z,且 Y 与 W 共享相同的属性集合,则 XW 能够唯一确定 YZ。

平凡函数以来与非平凡函数依赖

定义:在关系数据库理论中,函数依赖可以分为两种类型:平凡函数依赖(Trivial Functional Dependency)和非平凡函数依赖(Non-trivial Functional Dependency)。

1. 平凡函数依赖:当一个属性集合 Y 完全包含在另一个属性集合 X 中时,我们称函数依赖 X → Y 是平凡的。换句话说,如果 Y 中的属性在 X 中都存在,那么 X → Y 就是一个平凡函数依赖。

例如,如果有一个函数依赖 {A, B} → {B},其中 {B} 完全包含在 {A, B} 中,那么这是一个平凡函数依赖。

2. 非平凡函数依赖:如果一个函数依赖不是平凡的,即 Y 中的属性至少有一个不包含在 X 中,那么这个函数依赖就是非平凡的。

例如,如果有一个函数依赖 {A, B} → {C},其中 {C} 中的属性不全部包含在 {A, B} 中,那么这就是一个非平凡函数依赖。

在实践中,非平凡函数依赖更具有意义,因为它们描述了属性之间的实际约束关系,而平凡函数依赖则通常是显而易见的,因为它们只是描述了属性集合自身的关系。

完全函数依赖和部分函数依赖

定义:在关系数据库理论中,函数依赖可以进一步分为完全函数依赖(Full Functional Dependency)和部分函数依赖(Partial Functional Dependency)。

1. 完全函数依赖:如果 X 中的任何一个属性都不能单独决定 Y 中的任何一个属性,但 X 的所有属性组合在一起能够唯一确定 Y 中的属性,则称函数依赖 X → Y 是完全函数依赖。

例如,如果有一个函数依赖 {A, B} → {C},并且删除 A 或 B 中的任何一个属性都不能唯一确定 C,但是 A 和 B 的组合能够唯一确定 C,那么这是一个完全函数依赖。

2. 部分函数依赖:如果 X 中的某些属性能够单独决定 Y 中的某些属性,但不是所有的属性都能唯一确定 Y 中的属性,则称函数依赖 X → Y 是部分函数依赖。

例如,如果有一个函数依赖 {A, B} → {C},但是 A 或 B 中的某一个属性能够单独决定 C,那么这是一个部分函数依赖。

完全函数依赖和部分函数依赖的区别在于,完全函数依赖要求 X 的所有属性组合在一起才能唯一确定 Y,而部分函数依赖则允许 X 中的某些属性单独或部分地决定 Y。

理解函数依赖的类型对于数据库设计和规范化过程至关重要,因为它们帮助我们识别和消除数据库中的冗余信息,确保数据存储的高效性和一致性。

码的定义:

设K是关系模式RU,F中的属性或属性集合,K'是K的

任一真子集。若K-U,而不存在K’→U,则K为R的候选码

(Candidate Key),简称码。

若关系候选码多于一个,则选定其中一个作为主码。其中

包含在任意一个候选码中的属性称为主属性,不包含在任意一

个候选码中的属性称为非主属性。

规范化过程:

(1)标识关系中的所有候选键

(2)标识关系中的所有函数依赖

(3)检查函数依赖的决定因子

分析:学号→姓名

(学号,课程名称)P姓名

(学号,课程名称)>成绩

函数依赖集:

F=(学号一→姓名,(学号,课程名称→姓名,

(学号,课程名称)→成绩!

候选码:(学号,课程名称)

主属性:学号,课程名称

非主属性:姓名,成绩

1NF定义

如果一个关系模式中R的所有属性是不可再分的基本数据项,则R∈1NF

2NF定义

如果关系模式R∈1NF,并且每个非主属性都完全函数依赖于R的码,则R∈2NF

3NF定义

如果关系模式R∈2NF,并且每个非主属性都不传递依赖于R的任意候选码,则R∈3NF

BCNF定义//必考

BCNF(Boyce-Codd Normal Form)是关系数据库理论中的一个范式,用于规范化数据库表,以减少数据冗余和提高数据的一致性。BCNF 的定义如下:

给定一个关系模式 R,假设 X 是 R 的属性集合,Y 是 R 中的某个属性或属性集合。如果 X → Y 是 R 的一个非平凡函数依赖,并且 X 是 R 的候选键(Candidate Key),则关系模式 R 在 X → Y 的条件下满足 BCNF。

换句话说,一个关系模式 R 在 BCNF 中,如果每一个非平凡的函数依赖 X → Y,X 都是 R 的候选键。

BCNF 的要求是更为严格的,相比于第三范式(3NF),它要求所有的非平凡函数依赖的左部都必须是候选键。这样可以确保在关系模式中不存在非平凡的数据冗余,从而提高数据的一致性和减少存储空间的浪费。

对于不符合 BCNF 的关系模式,通常需要进行分解以达到 BCNF。这种分解会创建新的关系模式,以确保每个新的关系模式都满足 BCNF,并且保持原始数据的语义完整性。

总之,BCNF 是数据库设计中的一个重要概念,它帮助设计师规范化数据库表结构,以确保数据的一致性和减少冗余,从而提高数据库的性能和可维护性。

数据库设计概述

软件生命周期:

软件定义:问题定义->可行性分析->需求分析->

软件开发:系统概要设计->系统详细设计->编码与测试->

使用和维护:系统交付

六个阶段:(6分)

需求分析阶段(数据流图(DFD)是在需求分析阶段完成的)

概要结构设计(E-R模型图(10分))

逻辑结构设计(数据类型并优化 与DBMS有关系)

物理结构设计

数据库实施

运行维护阶段

需求分析阶段:

调查机构情况

熟悉业务活动

明确用户需求

确定系统边界

分析系统功能

分析系统数据

设计局部视图

合并取消冲突

修改冗余数据

***

数据抽象:

分类:将一类具有共同特性和行为的对象定义为一种类型

概括:定义类型之间的子集联系

聚集: 定义某类型的组成成分,对应E-R模型中的实体和属性

R模型合并会出现的问题

属性冲突

命名冲突

结构冲突

同一对象在不同应用下有不同的抽象

同一实体在不同的局部E-R中属性不同

实体之间的联系在不同的E-R图中联系不同

物理结构设计过程定义

确定数据库的物理结构

数据物理存储结构

数据的存取方法

对物理结构进行评价

分析时间效率

数据库的运行与维护主要包括以下内容:

数据库备份与恢复

数据库的安全性和完整性控制

数据库性能的监督、分析和改善

数据库的重组织与重构造

数据库的备份与恢复

数据库备份

数据库备份是指通过导出数据或者拷贝表文件的方式来制作数据库的副本

对于数据库备份,以下是一些基本步骤和注意事项:

1. 选择备份方法:确定您要使用的备份方法。常见的备份方法包括完全备份(Full backup)、差异备份(Differential backup)和增量备份(Incremental backup)。根据您的需求和数据库的大小,选择合适的备份方法。

2. 定期备份:制定一个定期备份计划,确保数据库得到及时和定期的备份。备份频率取决于数据库的变化频率和重要性。常见的备份周期包括每日备份、每周备份和每月备份。关键是确保备份的频率足够频繁,以最小化数据损失程度。

3. 存储备份数据:选择一个可靠的存储位置来存储数据库备份数据。备份数据可以存储在本地服务器上,也可以存储在云存储服务或离线介质(如磁带、硬盘等)上。确保备份数据的安全性和可靠性,同时考虑灾难恢复和数据保护策略。

4. 测试备份恢复:定期测试备份的恢复过程,以确保备份的完整性和可用性。通过从备份中恢复数据库来验证备份的有效性,并确保在需要时能够成功还原数据。

5. 多重备份:采用多重备份策略,确保数据的冗余备份。可以使用异地备份,将备份数据存储在不同的地理位置,以防止单点故障和灾难性情况的发生。

6. 更新备份策略:根据数据库的变化和业务需求,定期评估和更新备份策略。确保备份的频率和方法与数据库变化和重要性保持一致。

总之,数据库备份是保护数据完整性和可恢复性的重要措施。根据您的具体需求和数据库类型,可以采用适当的备份方法和策略来确保数据的安全备份和可靠恢复。

数据库恢复

数据库的恢复也称为数据库的还原,是将数据库从某一种“错误”状态(如硬件故障、操作失误、数据丢失、数据不一致的状态)恢复到某一已知的“正确”状态

离线备份的划分:

热备份:备份的同时不能对数据库进行读写操作

冷备份:关闭MySQL服务,备份的同时及不能对数据库进行读写操作

温备份:MySQL服务在线,备份的同时支持操作不允许写操作

数据集合进行划分:

完全备份:备份全部数据

增量备份:对上次完全备份或者增量备份后发生改变的数据进行备份

差异备份:对上次完全备份发生改变的数据进行备份

数据或文件进行划分:

物理备份:备份全部数据文件

逻辑备份:

备份命令

mysqldump -hlocalhost -uroot -proot studentinfo>c:\buckup\student.sql(全部备份)

mysqldump -hlocalhost -uroot -proot studentinfo score>c:\buckup\score.sql(局部备份)

Source恢复命令

mysql>use studentinfo

mysql>set names utf8

mysql>source c:\backup\studentinfo.sql

导出命令select into ..outfile

Select 属性名 from 数据表 into outfile ‘file_name’

[CHARACTER SET charset_name] [export_options]

视图

一、视图概念

1.视图本身是个虚表,是由基本表或其他视图导出的表,其本身不存储数据,不占据物理储存空间

视图的优势:

增强数据的安全性

提高灵活性,操作变得简单

提高数据的逻辑独立性

特点:

视图是一个虚拟的关系二维表

数据库中只存放视图的定义,其内容由查询语句定义,不会出现数据冗余

在数据库中,视图具有和表一样的使用方法,可被检索或删除,但更新操作有一定的限制

创建视图

Create [algorithm={undefine|merge|temptable}] view <视图名>[(<列名>[,<列名>]...)]as 子查询语句

例:(1)创建计算机学院所有学生的学号、姓名、性别、年龄等基本信息视图

v_comptuerstu,要求为视图定义相应字段

CREATE VIEW v_computerstu

AS SELECT sno,sname,sage,ssex FROM student WHERE deptno=(SELECT deptno FROM sdept WHERE dname LIKE '%计算机%');

(2)创建多有女生的基本信息视图v_femalestu,并检查该视图设置的条件

CREATE or REPLACE VIEW v_femalestu

AS SELECT*FROM student WHERE ssex='女'

WITH CHECK OPTION;

(3)使用sql语句创建每一门课是平均成绩视图

CREATE OR REPLACE VIEW v_avgradde(cno,avgrade)

AS SELECT cno,avg(grade) FROM score GROUP BY cno;

2。查询视图

(1)SELECT * FROM v_computerstu WHERE ssex='女';

(2)SELECT sno,sname,deptno FROM v_femalestu;

(3)SELECT * FROM v_avgradde;

(4)DESC v_femalestu;

3.CURD

(1)违反视图定义规则不能运行

(2)违反基本表的约束不能运行

(3)不能对计算列录入数据

3.删除视图

DROP VIEW v_femalestu;

索引

索引的定义

索引是数据库管理系统中一个排序的数据结构,可以快速排查询表中的记录,优化数据库查询速度,提高数据库性能。

索引通过快速的方法,找到数据,不需要遍历数据库的所有数据

索引的优点

通过创建唯一索引,可以保证数据库表中每一行数据的唯一性

可以大大加快数据的检索

可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义

在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

索引的缺点

1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

2.可以索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引:那么需要的空间就会更大

3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

索引的特征:

唯一索引

复合索引

索引类型:

普通索引 唯一性索引 全文索引 单列索引 多列索引 空间索引

创建方式

(1)直接创建

创建数据表是创建索引

在已存在的数据表时创建索引

使用alter语句添加列

(2)间接创建

主键约束

唯一约束

语句:

(1)创建存储不及格成绩表scgrade,要求在sno列建立普通索引

CREATE TABLE failgrade(

id INT(4) PREPARE KEY auto_increment,

sno char(15),

sname char(8),

cname char (30),

grade FLOAT(6,2),

INDEX failsno_index(sno(6))

)ENGINE=myisam

使用子查询语句导入数据

INSERT INTO failgrade(sno,sname,cname,grade)

SELECT student.sno,sname,cname,grade FROM student,course,score

WHERE student.sno=score.sno AND course.cno=score.cno

AND grade<60

(2)在不及格成绩表,要求在canme建立不同索引

CREATE INDEX index_failname ON failgrade(cname)

(3)在不及格成绩表,要求在sname列添加普通索引

ALTER TABLE failgrade ADD INDEX failsname_index(sname)

2.EXPLAIN命令

EXPLAIN SELECT * FROM failgrade where sno='0808020133';

EXPLAIN SELECT * FROM failgrade where cname='哲学';

3.查看索引

show INDEX FROM failgrade;

计算机软件工程

主要内容:

基本语句

函数

存储空间

异常处理

游标

变量

声明变量

用户变量:@x

全局变量:@@x或globalx

局部变量:declare x

变量赋值

Set x Select....into x from...

查看所有全局变量

Show global variables;

查看某一全局变量

Show global variables like ‘%autocommit%’;

设置全局变量

Set global autocommit=’off’;

函数

系统函数

select sno,substr(sno,3,2),sname from student;

Select sno,replace(substr(sno,3,2),’0’’c’),sname from student

自定义函数

创建函数f_tname,能够根据教师名字获得所属院系的负责人名字。若教师名字不存在,给出‘没有此人’提示

(1)

delimiter //

DROP FUNCTION IF EXISTS f_tname;

CREATE FUNCTION f_tname(x CHAR(15))

RETURNS CHAR(10)

DETERMINISTIC

BEGIN

DECLARE n VARCHAR(10);

DECLARE exit handler FOR SQLEXCEPTION RETURN'返回多个值';

SELECT tname INTO n FROM teacher WHERE deptno = (SELECT deptno FROM teacher WHERE tname = x) AND title = '院长';

IF n IS NULL THEN

RETURN '没有此人';

ELSE

RETURN n;

END IF;

END;

/

SELECT f_tname('王翠茂');

SELECT f_tname('李俊');

(2)

delimiter //

DROP FUNCTION IF EXISTS f_tname;

CREATE FUNCTION f_tname(x CHAR(15))

RETURNS CHAR(10)

DETERMINISTIC

BEGIN

DECLARE n VARCHAR(10);

DECLARE exit handler FOR SQLSTATE'21000' RETURN'返回多个值';

SELECT tname INTO n FROM teacher WHERE deptno = (SELECT deptno FROM teacher WHERE tname = x) AND title = '院长';

IF n IS NULL THEN

RETURN '没有此人';

ELSE

RETURN n;

END IF;

END;

/

SELECT f_tname('王翠茂');

(3)

delimiter //

DROP FUNCTION IF EXISTS f_tname;

CREATE FUNCTION f_tname(x CHAR(15))

RETURNS CHAR(10)

DETERMINISTIC

BEGIN

DECLARE n VARCHAR(10);

DECLARE exit handler FOR 1242 RETURN'返回多个值';

SELECT tname INTO n FROM teacher WHERE deptno = (SELECT deptno FROM teacher WHERE tname = x) AND title = '院长';

IF n IS NULL THEN

RETURN '没有此人';

ELSE

RETURN n;

END IF;

END;

//

SELECT f_tname('王翠茂');

触发器是一种特殊的存储过程,他在存储、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力

***触发器的作用:

安全性

审计

实现复杂的数据完整性规则

实现复杂的非标准的数据库相关完整性规则

创建触发器

Create trigger 触发器名称 触发时间 触发事件 on 数据表 for each row 触发器执行体

三要素:

(1)触发时间:before或after

(2)触发事件:insert、update、delete

(3)触发器功能:触发器执行体

一、触发器

要求:创建实现级联删除触发器:删除course表中数据时,若数据被score表引用,需要先删除score表中数据,再删除course表中数据。

(1)删除course表中数据,查看情况

delete from course where cno=upper('a005');

drop trigger tr_delcou;

(2)创建触发器,实现级联删除

DELIMITER//

drop trigger if exists tr_delcou//

create trigger tr_delcou before delete on course for each row(每删除一行都要激活触发器)

begin

delete from  score where cno=old.cno;

end;

(3)测试:

delete from course where cno=upper('a005');

select * from score;

****MySQL安全检查

(登陆验证):

用户名、密码

(授权):

授予创建、修改、删除等权限

(访问控制):

操作哪些对象、作何种操作

二、用户与权限

1.用户权限表

(1)查询user表的相关用户字段。

select  host,user,authentication_string  from mysql.user;

select  *  from mysql.user;

(2)查看tables_priv表结构

desc tables_priv;

select * from mysql.tables_priv;

2.创建用户

(1)创建新的用户

create user sysman identified by '123';

create user 'system'@'localhost' identified by '123';

(2)使用insert命令添加用户

insert into mysql.user(host,user,authentication_string,ssl_cipher,x509_issuer,x509_subject)

values('localhost','sysuser','123','','','');

刷新权限:flush privileges;

(3)修改用户名

rename user sysman to sam@localhost;

(4)删除用户

drop user 'system'@'localhost';

drop user 'sysuser'@'localhost';  

delete from mysql.user where user='sam';

刷新权限:flush privileges;

3.授权

(1)查看所有权限

show grants;

(2)查看用户所有权限

select * from information_schema.user_privileges;

select * from mysql.user;

(3)给用户system增加对数据库student的查询权限

(******)grant select on student.* to 'system'@'localhost';

(4)测试:(登陆system连接界面,执行下面操作)

select * from teacher;                               //可以看到结果

update teacher set deptno='01' where tname='赵文艳';     //无法更新

(5)给用户system增加对数据库student学生表student的中的sno,sname,sage这三个字段的查询和更新权限

grant select(sno,sname,sage),update(sage) on student.student to

'system'@'localhost';

grant all privileges on student.* to 'system'@'localhost';

(6)权限的转移和限制

create user 'my'@'localhost' identified by '123';

grant all privileges on student.* to 'system'@'localhost' with grant option(将他的权限可以授权给其他用户);

flush privileges;

4.回收权限

(****)revoke select on student.* from 'system'@'localhost';

flush privileges;

授权是to回收是from

事务

***事务的特点:

原子性、一致性、隔离性、持久性

*****事务的隔离性级别:

未提交读(read uncommitted)、提交读(read committed)、可重复读(repeatable read)、序列化(serializable)

Commit 提交

Roback 回滚

(******)@@ 全局变量

***锁:页面锁、表级锁、行级锁

*****事务的并发控制

丢失更新、脏读、不可重复读、幻读

****日志:错误日志、通用查询日志、慢查询日志、二进制日志文件

通用查询日志:记录用户登录和记录查询的信息

慢查询:记录执行时间超过指定时间的操作

错误日志:记录MYSQL服务器的启动、关闭、运行错误等信息

二进制日志:以二进制文件形式记录了所有用户对数据库的变更操作,但不记录查询语句

这是我本学期学习的自学笔记如果有需要的同学可以在评论区留言,或者给我发私信,我会在第一时间给予回复

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值