数据库有三大范式。
范式的简介
范式的英文名称是Normal Form,它是英国人E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。
数据往往种类繁多,而且每种数据之间又互相关联,因此,在设计数据库时,所需要满足的范式越多,那表的层次及结构也就越复杂,最终造成数据的处理困难。这样,还不如不满足这些范式呢。所以在使用范式的时候也要细细斟酌,是否一定要使用该范式,必须根据实际情况做出选择。一般情况下,我们使用前三个范式已经够用了,不再使用更多范式,就能完成对数据的优化,达到最优效果。
第一范式就是属性不可分割,每个字段都应该是不可再拆分的。比如一个字段是姓名(NAME),在国内的话通常理解都是姓名是一个不可再拆分的单位,这时候就符合第一范式;但是在国外的话还要分为FIRST NAME和LAST NAME,这时候姓名这个字段就是还可以拆分为更小的单位的字段,就不符合第一范式了。
第二范式就是要求表中要有主键,表中其他其他字段都依赖于主键,因此第二范式只要记住主键约束就好了。比如说有一个表是学生表,学生表中有一个值唯一的字段学号,那么学生表中的其他所有字段都可以根据这个学号字段去获取,依赖主键的意思也就是相关的意思,因为学号的值是唯一的,因此就不会造成存储的信息对不上的问题,即学生001的姓名不会存到学生002那里去。
第三范式就是要求表中不能有其他表中存在的、存储相同信息的字段,通常实现是在通过外键去建立关联,因此第三范式只要记住外键约束就好了。比如说有一个表是学生表,学生表中有学号,姓名等字段,那如果要把他的系编号,系主任,系主任也存到这个学生表中,那就会造成数据大量的冗余,一是这些信息在系信息表中已存在,二是系中有1000个学生的话这些信息就要存1000遍。因此第三范式的做法是在学生表中增加一个系编号的字段(外键),与系信息表做关联。
基本命令操作
1、断开数据库: exit;
2、查看存在的数据库:show databases;
3、创建数据库:create database 数据库名;
4、选择数据库:use 数据库名;
5、查看数据库下的表:show tables;
6、删除数据库:drop database 数据库名;
7、创建表
create table table_name(
属性名 类型 [完整性约束],
属性名 类型 [完整性约束],
…
属性名 类型[完整性约束]
);
示例:
学生表
Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 年龄,Ssex 学生性别
create table Student(
SID INT primary key unique,
Sname varchar(25) not null,
Sage INT,
Ssex char(4) default ‘nan’
);
8、查看表:
desc table_name; 通过desc关键字查看表的字段名称、类型、是否为null、约束条件,默认值、备注信息
show create table table_name; 展示创建表的SQL语句,并且打印了存储引擎以及字符集编码
9、删除表:drop table table_name;
插入数据:insert into table_name(属性1、属性2…属性n) values (v1,v2…vn);
eg:insert into Student(SID,Sname,Sage,Ssex) values (1,‘zhan san’,12,‘nan’);
删除数据:drop from table_name where 属性名=value;
10、修改表:
在使用过程中不满足使用情况下修改,用alter命令修改
1)、修改表名:alter table old_table_name RENAME new_table_name;
eg:alter table Student rename gdz;
2)、修改属性类型:alter table table_name MODIFY 属性名 属性类型;
eg:alter table Student modify Ssex varchar(4);
3)、修改属性名:alter table table_name CHANGE 旧属性名 新属性名 数据类型;
eg:alter table Student change Ssex Stest varchar(4);
4)、增加字段:alter table table_name ADD 属性名 属性类型 [完整性约束];
eg:alter table Student add Stest varchar(10) default ‘hello’;
5)、删除字段:alter table table_name DROP 属性名;
eg:alter table Student drop Stest;
6)、修改属性排列位置
alter table table_name MODIFY 属性名 属性类型 FIRST; //将当前属性放到第一个位置
alter table table_name MODIFY 属性名1 属性类型 AFTER 属性名2; // 属性1排列在属性2后面
eg:alter table Student modify Ssex varchar(4) after Sname;
7)、修改表的存储引擎:alter table table_name ENGINE = INNODB|MYISAM;
11、查询表:
select 属性列表 from 表名 [where 条件表达式1]
[group by 属性名1[having 条件表达式]]
[order by 属性名2 [asc | desc]]
1)、带in子查询:[not] in (元素1 ,元素2… 元素3); eg:select * from Student where SID in(2,3,4);
2)、带between and 的范围查询:[not]between 取值1 and 取值2; eg:select * from Student where Sage between 20 and 21;
3)、带like的通配符匹配字符串:[not] like ‘字符串’;
通配符:
%:表示0个或者任意长度的字符串
_:只能表示1个字符
eg:select * from Student where Sname like ‘%l%’;
4**)、空值查询**:is [not] null; eg:select * from Student where Sname is not null;
5)、带and的多条件查询:条件表达式1 and 条件表达式2 [ … and 条件表达式2]
eg:select * from Student where SID >2 and Ssex=‘nv’;
6)、带or的多条件查询:条件表达式1 or 条件表达式2 [ … or 条件表达式2] eg:select * from Student where SID > 2 or Ssex=‘nv’;
7)、去重复查询 :select distinct 属性名 eg:select distinct Ssex from Student;
8)、用group by 属性名[having 表达式]; select * from Student group by Ssex;
9)、对结果排序:order by 属性名[asc | desc]; asc:升序排列,数据越来越大,默认是升序 desc:降序排列,数据越来越小
eg:select * from Student order by Sage asc;
10)、union 联合查询
select 属性列表 from table_name1 [where 条件表达式] union
select 属性列表 from table_name2 [where 条件表达式]
联合查询默认的结果数据进行了去重,distinct
使用All 可以展示不去重的结果
eg:select SID from Student union all select SID from SC;
11)、limit 分页查询
select * from Student limit 90 ;一个参数指从起始0号位置开始读取指定长度的数据
select * from Student limit200,9 ; 第一个位置值得是起始位置,第二个参数指的是读取数据的长度(个数)
12)、联合查询
左连接(left join)
右连接(right join)
内连接(inner join)
左连接:select * from Student a left join SC b on a.SID = b.SID;
内连接:select * from Student a inner join SC b on a.SID = b.SID;
右连接:select * from Student a right join SC b on a.SID = b.SID;