数据库知识点:
数据库的创建,删除,表的创建,删除,以及约束
1.为什么学习数据库:
数据的保存,读取,完整性,安全性。
数据库结构化,共享性,独立性,安全性
2。什么是数据库(Database 简称DB):长期存在计算机内,有组织,可共享的大量数据的集合数据“仓库”。
作用:存放,管理数据
分类:关系型数据库,NoSQL数据库
3.MYSQL数据库的特点:
开源免费,小巧,功能齐全,可在Windows和Linux系统上运行,操作方便
4.数据库的结构:
数据库(Database):以文件形式存放在磁盘,
数据表:一组数据记录组成
字段:也称域,表中的每一列称为一个字段
记录:表中的每一行称为一个记录,它由若干个字段组成,实体
索引:索引实际上是一种特殊类型的表,其中含有关键字段的值和指向实际记录位置的指针,可提高访问数据库的效率
SQL语句:结构化查询语句命令。
*(必备)5.SQL语句分类:结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序涉及语言,用于存取数据以及查询,更新和管理关系数据库系统
名词 | 解释 | 命令 |
---|---|---|
DDL(数据定义语言) | 定义和管理数据对象,如数据库,数据表等 | create,drop,alter |
DML(数据操作语言) | 用于操作数据库对象中所包含的数据 | insert,update,delete |
DQL(数据查询语言) | 用于查询数据库数据 | select |
DCL(数据控制语言) | 用来管理数据库的语言,包括管理权限及数据更改 | grant,commit,roolback |
DDL语句操作数据库:
#注释
-- 注释
/*
多行注释
*/
-- 1.sql不区分大小写
-- 2._(下划线)进行名字的分割,不适用我们的驼峰命名法
-- 3. ;语句sql结尾处写一个; 表示结束
-- 4.一般关键词建议用大写
-- 5.所有名称不允许用中文
#库
-- 查看所有的库
show DATABASES;
-- 创建数据库
-- create DATABASE 库名
create DATABASE xiaozhao2;
-- 删除库(危险操作)
DROP DATABASE xiaozhao2
-- 使用库/切换库
-- use 库名;
use xiaozhao2;
#表
-- 查看该库中所有的表
show tables;
DDL语句创建数据库表:
#表
-- 查看该库中所有的表
show tables;
-- 创建表
-- create TABLE 表名(
-- 字段名 类型 属性,
-- 字段名 类型 属性,
-- ...
-- 字段名 类型 属性
-- );
create table student(stu_name VARCHAR(10),stu_age TINYINT,stu_birthday datetime,stu_id char(18), stu_score DECIMAL(4,1)
);
-- 查看表中的字段
-- 方式一
-- desc 表名
desc student;
-- 方式二:
show create table student;
-- `反引号: 作用是取消关键性
-- DEFAULT NULL ;表示该字段的值可以为空
--
-- ENGINE=INNODB:非常重要 存储(把数据存储到磁盘) 引擎(存储的规则)
-- 查看当前数据库支持的存储引擎
show ENGINES;
此处注意:反引号 ` :用于区别MYSQL保留字与普通字符而引入的
数据库表的字段类型:(以下为常用)
字符串类型:
类型 | 说明 | 取值范围 | 存储需求 |
---|---|---|---|
char(M) | 固定长字符串,检索快但费空间,0<=M<=255 | M字符 | char[(M)] |
varchar[(M)] | 可变字符串 0<=M<=65535 | 变长度 | varchar[(M)] |
tinytext | 微型文本串 | 16777215长度+3个字节 | tinytext |
text | 文本串(4个G左右大小) | 4294967295长度+4个字节 | text |
char和varchar比较:
类型 | 特点 | 空间上 | 时间上 | 适用场景 |
---|---|---|---|---|
char(M) | 固定长度 | 浪费存储空间 | 效率高 | 存储不大,速度要求高 |
varchar(M) | 可变长度 | 节省存储空间 | 效率低 | 非char的情况 |
数值类型:
类型 | 说明 | 取值范围 | 存储需求 |
---|---|---|---|
tinyint | 非常小的数据 | 有符值: -2^7~2^7-1,无符号值:0-128-1 | 1字节 |
int | 标准整数 | 有符值: -2^31~2^31-1,无符号值:0~2^31-1 | 4字节 |
bigint | 较大的整数 | 有符值: -2^63~2^63-1,无符号值:0~2^64-1 | 8字节 |
Decimal(钱)【desiml】 | 字符串形式的浮点数 | decimal(m,d) | m个字节 |
日期和时间类型:
类型 | 说明 | 取值范围 | 存储需求 |
---|---|---|---|
dateTime | YY-MM-DD hh:mm:ss | 1000-01-01 00:00:00至9999-12-31 23:59:59 | datetime |
注意:NULL在数据库中是一种类型:理解为没有值或未知值,不要用null进行算术运算,结果仍未null,MySQL中,0或NULL都意味着为假,1为真
数据库的存储引擎:show engines
对比项 | MyISAM | InnoDB |
---|---|---|
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发操作 | 行锁,操作时治所铸某一行,不对其它行有影响,适合高并发操作 |
缓存 | 只缓存索引,不缓存真是数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有据欸党性的影响 |
默认安装 | Y | Y |
默认使用 | N | Y |
关注点 | 性能:节省资源,消耗少,简单业务 | 事务:并发写,事务,更大资源 |
修改和删除数据库表:
-- 表结构修改
-- alter table 表名 关键词 数据
-- 关键词 rename as add drop modify change-- 1.修改表名
-- alter table 旧表名 rename as 新表名;
alter table student rename as xuesheng;-- 2.添加字段 ****四颗星
-- 字符串 'xxx' "xxx"
-- alter table 表名 add 新字段名 类型 属性
-- comment 属性:表示备注或说明
alter TABLE xuesheng add stu_qq VARCHAR(20) COMMENT "这是学生的qq号";-- 删除字段(慎用)
-- ALTER table 表名 drop 删除字段名
alter TABLE xuesheng drop stu_age;-- 修改字段
-- 覆盖式修改
-- 1.一定的默认值
-- 2.如果已经存在具体数据 --数据是可以做隐式转换
-- 方式一 MODIFY 只能修改 数据类型 和 属性
-- alter TABLE 表名 MODIFY 字段名 要修改的类型 要修改的属性
alter TABLE xuesheng MODIFY stu_name VARCHAR(100);-- 方式二:change :可以修改数据类型 属性 字段名
-- alter table 表名 CHANGE 旧字段名 新字段名 要修改类型 要修改属性;
alter table xuesheng change stu_qq qq VARCHAR(20) comment "这是qq号";-- 删除表
-- drop table 表名;
drop TABLE xuesheng;
数据库设计的三大范式:
第一范式:确保每列保持原子性
1.每一列属性都是不可再分的属性值,确保每一列的原子性
2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
第二范式:确保表中的每列都和主键相关
1.第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式
2.第二范式要求数据库表中的每个实例或行必须可以被唯一的区分,未实现区分通常需要为表加上一个列,以存储各个实例的唯一标识,这个唯一属性列被称为主键
第三范式:确保每列都和主键列直接相关,而不是间接相关
数据不能存在传递,即每个属性都跟主键有直接关系而不是间接关系
总结:三大范式只是一般设计数据库的基本理念,可以建立冗余较小,结构合理的数据库,如果有特殊情况,当然要特殊对待,数据设计最重要的是看需求跟性能,
需求>性能>表结构,所以不能一味的去追求范式建立数据库
表约束:
#约束
-- 非空约束
create table tb1(username VARCHAR(10),userage int
);
create table tb2(username VARCHAR(10) not NULL ,-- 非空约束userage int
);
create table tb3(username VARCHAR(10) not NULL default '巴嘎',-- 非空约束userage int
);
-- 唯一约束
-- 是可以为null,并且可以有多个null,
-- 因为null是一个类型,没有值
-- 行级约束
create table tb4(username VARCHAR(10) UNIQUE, -- 唯一约束,行级唯一约束userage int UNIQUE -- 每个字段都是各自的唯一约束
);
-- 表级约束,
create table tb5(username VARCHAR(10),userage int,UNIQUE(username,userage) -- 表级约束,联合唯一约束,可约束多个
); -- 字段是有关联的,只有当约束的条件完全一样,才会起约束作用
-- CONSTRAINT :给约束起名字
create table tb6(username VARCHAR(10),userage int,CONSTRAINT name_age_unique UNIQUE(username,userage)
);
-- 主键约束
-- 每张表必须有且只有一个表
-- 主键的值是唯一的
-- 主键是不能为null的,
create table tb7(username VARCHAR(10) PRIMARY KEY,userage int -- PRIMARY KEY:错误,因为一张表主键是唯一的。
);
create table tb8(username VARCHAR(10),userage int,PRIMARY key(username,userage) -- 联合主键,联合约束
); -- 多个字段的值,只有完全相同时,才会触发约束
-- 一般主键的建立方式
-- int bitint 自增:auto_increment,从主键最大的值开始自增
create table tb9(tid int PRIMARY key auto_increment,username VARCHAR(10),userage int
);
-- 外键约束
-- 外键的值是可以重复的
-- 外键的值可以为null
-- 外键必须要写 父表中有的数据
-- 父表中的关联字段必须是一个具有唯一性的数据
-- 父表的字段名和从表的字段名不一定要相同,但是数据量类型必须一致
-- 一个表中可以有多个外键,也可以有多个外键约束,但只能有一个主键
-- 使用外键关系,而不建立外键约束
create table a(aid int PRIMARY KEY auto_increment,aname VARCHAR(10)
);
create table b(bid int PRIMARY key auto_increment,bname VARCHAR(10),aid int,FOREIGN key(aid) REFERENCES a(aid)
);