一、数据库介绍
1.1 什么是数据库?
存储数据的仓库
1.2 什么是数据库管理系统
可以管理数据库的,可以对数据进行增删改查等操纵
Mysql就是一个数据库管理系统(DBMS)DataBase Management System,是由瑞典的Mysql AB公司研发,属于Oracle旗下的产品。
常见的数据库管理系统:Mysql Oracle SQL Server,DB2,Access,MongeDB(非关系型数据库),redis.
1.3 关系型数据库
关系型模式是数据的 结构方式。以表的形式进行数据存储,由行和列组成。
早期:层次模型
产品-类型-型号----
网状模型
······
1.4 数用数据库的好处
减少了数据的冗余,保证数据的一致性,确保数据的完整性,提高数据的安全性,实现数据的共享。
1.5 数据的服务器
本地服务器
客户端服务器
1.6 MySQL 中的SQL
数据库结构化查询语言,是操作数据库的语言,是一种和数据库通信的语言
里面包含一下三种:
DDL:数据定义语言(对数据库的操作,对表的操作,对结构的操作)
DML:数据操作语言(对数据的CRUD操作)
DCL:数据管理语言(对数据库中用户和权限管理)
不同的数据空的SQL语句大多数相通或相同,但也存在差异
二、数据库知识
2.1 SQL语言的动词
SQL功能 | 动词 |
---|---|
数据查询 | SELECT |
数据定义 | GREATE,DROP,ALTER |
数据操纵 | INSERT,UPDATE,DELETE |
数据控制 | GRANT,REVOKE |
2.2 SQL的基本概念
2.2.1 三级模式结构
SQL支持关系数据库三级模式结构
2.2.3 基本表
- 本身独立存在的表
- SQL中一个关系就对应一个基本表
- 一个(或多个)基本表对应一个存储文件
- 一个表可以带若干索引
2.2.4 存储文件
逻辑结构组成了关系数据库的内模式
物理结构是任意的,对用户透明
2.3 数值类型
2.3.1 准确型
3.2.2 近似型
3.2.3 字符串型
2.4 数据库三大范式
第一范式:每一列应具备原子性(列不可再分)
第二范式:一个表只存放和主键相关的数据(只做一件事情)
第三范式:其他列要和主键直接相关(不能间接相关),解除传递依赖
三、 定义基本表
3.1 Create Table的一般格式为 :
CREATE TABLE <表名>(
<列名> <数据类型> [列级完整性约束定义]
{, <列名> <数据类型> [列级完整性约束定义] … }
[, 表级完整性约束定义 ] )
<表名>:所要定义的基本表的名字。
<列名>:表中所包含的属性列的名字,
<数据类型>:指明列的数据类型。
在定义表的同时可以定义与表有关的完整性约束条件。如果完整性约束只涉及到表中的一个列,则可以在列级完整性约束定义处定义,也可以在表级完整性约束定义处定义;如果完整性约束条件涉及表中多个属性列,则必须在表级完整性约束定义处定义。
在定义基本表时可以同时定义列的取值约束。在列定义同时定义的约束我们称为列级完整性约束定义,在表定义的最后定义的完整性约束我们称为表级完整性约束。
3.2 在列级完整性约束定义处可以定义如下约束
NOT NULL:限制列取值非空
DEFAULT:给定列的默认值,使用形式为:DEFAULT 常量
UNIQUE:限制列取值不重
CHECK:限制列的取值范围,使用形式为:CHECK(约束表达式)
PRIMARY KEY:指定本列为主码
FOREIGN KEY:定义本列为引用其他表的外码。使用形式为:
[FOREIGN KEY][<列名>] REFERENCES <外表名>(<外表列名>)
NOT NULL和DEFAULT不能在表级完整性约束处定义之外,其他约束均可在表级完整性约束处定义。但有些约束必须在表级约束处定义:
第一,如果CHECK约束是定义多列之间的取值约束;
第二,如果表的主码由多个列(超过1列)组成;
第三,如果在表级完整性约束处定义外码,则FOREIGN KEY和<列名>均不能省,且<列名>必须用括号括起来。
3.3 删除表
DROP TABLE <表名> { [, <表名> ] … }
3.4 修改表
在定义完表之后,如果需求有变化,比如添加列、删除列或修改列定义,可以使用ALTER TABLE语句实现。
ALTER TABLE <表名>
[ ALTER COLUMN <列名> <新数据类型>] – 修改列定义
| [ ADD [COLUMN] <列名> <数据类型> [属性] – 添加新列
| [ DROP COLUMN <列名> ] – 删除列
| [ADD PRIMARY KEY(列名 [,… n ] )] – 添加主码约束
| [ADD FOREIGN KEY(列名)REFERNECES 表名(列名)] – 添加外码约束
四、数据库完整性
数据库完整性是指数据的正确学和相容性
- 防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
- 防范对象:不合语义的、不正确的数据
数据安全性:
- 保护数据库防止恶意的破坏和非法的存取
- §防范对象:非法用户和非法操作
五、实体完整性
5.1 完整性约束条件的作用对象
完整性约束条件的作用对象可以是表、元组和列。
5.1.1 级联约束
- 对数据类型的约束:包括数据类型、长度、精度等。
- 对数据格式的约束:如规定学号的前两位表示学生的入学年份,第三位表示系的编号,第四位表示专业编号,第五位代表班的编号等等。
- 对取值范围或取值集合的约束:如学生的成绩取值范围为0~100。
- 对空值的约束:列是否允许为空。
5.1.2 元组约束
元组的约束是元组中各个字段之间的联系的约束,如:开始日期小于结束日期,职工的最低工资不能低于规定的最低保障金等
5.1.3 关系约束
关系约束是指若干元组之间、关系之间的联系的约束。比如学号的取值不能重复也不能取空值,学生修课表中的学号的取值受学生表中的学号取值的约束等。
5.2 关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
5.2.1 单属性构成的码:
- 定义为列级约束条件
例:
Sno CHAR(9) PRIMARY KEY,
- 定义为表级约束条件
例:
PRIMARY KEY(Sno)
5.2.2 多个属性构成的码:
- 定义为表级约束条件
PRIMARY KEY (Sno,Cno)
**注意:**主码在一个表中是唯一的,但是一个主码可以由多个字段组成。
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。它会检查主码值是否唯一,如果不唯一则拒绝插入或修改;检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
六、参照完整性
6.1 关系模型的参照完整性的定义
- 在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
- 用REFERENCES短语指明这些外码参照哪些表的主码
例:
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno),
/*在表级定义实体完整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*在表级定义参照完整性*/
);
6.2 参照完整性检查和违约处理
被参照表(例如Student) | 参照表(例如SC) | 违约处理 |
---|---|---|
可能破坏参照完整性 | 插入元组 | 拒绝 |
可能破坏参照完整性 | 修改外码值 | 拒绝 |
删除元组 | 可能破坏参照完整性 | 拒绝/级连删除/设置为空值 |
修改主码值 | 可能破坏参照完整性 | 拒绝/级连修改/设置为空值 |
七、用户定义的完整性
用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求
7.1 属性上的约束条件定义
7.1.1 CREATE TABLE 时定义
- 列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个布尔表达式(CHECK)
**注意:**MySQL现不支持check语句,所以为了实现约束,需要使用其他方法:
-
枚举
最简单粗暴的方式,在定义表结构时就将需要定义的限制条件写进去,比如:
create table test(sno int,sname varchar(50),sgrade enum(1,2,3,4,5));
-
触发器
每一个表中,触发器有且只能有一个,比如:
create trigger age before insert on ploy for each row begin if (new.age > 60) then delete from ploy where age=new.age; end if; end;
这里要说明的是,一般我们可以在插入数据之前做判断,不需要写在数据库中。
7.2 完整性约束命名子句CONSTRAINT
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
八、DCL:数据的管理语言(数据控制语言)
DCL:DATE CONTROL LANGUAGE
作用:主要是控制权限和,以及对用户的管理
都要在root账户下去进行登录操作
8.1 添加用户
create user rachel @IP 地址 IDENTIFIED BY 密码
8.2 添加权限
grant select,delete,update,insert on *.* to user -- *.*代表所有数据库下的所有表
--或者
grant all
例:
grant select on selectprictis.* to rachel@localhost -- 给某个用户设置某个数据库的所有表的权限
8.3 移除权限
revoke 权限名 on 数据库名.* from 用户名 @IP
例:
revoke delete on *.* from user
8.4 删除用户
drop user 用户名 @Ip
8.5 本地连接问题:
use mysql; 切换到mysql自带的数据库中
select host,user from user;查看你的root用户的host地址,如果是locahost,则表示为只能被本机连接,%表示可以被所有IP地址连接,也可以指定Ip地址
update user set host = ‘%’ where user = ‘root’;
flush privileges 刷新一下修改,使其生效