一、基础概念
关系型数据库:由二维表及其之间的联系所组成的一个数据组织。
非关系型数据库:以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。
实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。
属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。
元组:表中的一行就是一个元组。
分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。
码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。
全码:如果一个码包含了所有的属性,这个码就是全码。
主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。
非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。
二、3范式
第一范式:列不可分
第二范式:完全依赖,对于由属性(A,B)联合构成的主键,存在属性C由A或B一个属性就能确定,这就是部分依赖,C必须由联合主键确定,才是完全依赖
第三范式:无传递依赖,属性C依赖属性B,属性B依赖与主键A,这种传递依赖不能存在。
这三个范式都是为了减少数据库数据冗余,使表结构更加合理。
三、SQL
1、显示数据库、创建数据库、打开数据库
SHOW DATABASES;
CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
USE db_name;
2、用户管理、权限设置
创建用户
create user '用户名'@'IP地址' identified by '密码';
删除用户
drop user '用户名'@'IP地址';
修改用户
rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';;
修改密码
set password for '用户名'@'IP地址' = Password('新密码')
PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
show grants for '用户'@'IP地址' -- 查看权限
grant 权限 on 数据库.表 to '用户'@'IP地址' -- 授权
revoke 权限 on 数据库.表 from '用户'@'IP地址' -- 取消权限
对于目标数据库以及内部其他:
数据库名.* 数据库中的所有
数据库名.表 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
*.* 所有数据库
'用户名'@'IP地址' 用户只能在改IP下才能访问
'用户名'@'192.168.1.%' 用户只能在改IP段下才能访问(通配符%表示任意)
'用户名'@'%' 用户可以再任意IP下访问(默认IP地址为%)
3、显示表、创建表、修改表
show tables;
create table tb_name(
id int not null auto_increment,
value int(2) not null default 0,
name char(10) default 'aa',
area char(20) default null,
primary key(id,value),
unique key(area),
constraint fk_name foreign key (name) references tb_other(name)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ps:
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
唯一键作用:一是约束作用(constraint),规范数据的唯一性,但同时也在这个key上建立了一个唯一索引;
unique key 与 primary key 区别:unique key 可为null;
添加列:
alter table 表名 add 列名 类型
删除列:
alter table 表名 drop column 列名
修改列:
alter table 表名 modify column 列名 类型; -- 类型
alter table 表名 change 原列名 新列名 类型; -- 列名,类型
添加主键:
alter table 表名 add primary key(列名);
删除主键:
alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
添加外键:
alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
删除外键:
alter table 表名 drop foreign key 外键名称
修改默认值:
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
删除默认值:
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
清空表:
delete from tb_name;
删除表:
drop table tb_name;
4、索引
create index index_birthday on user_info(birthday);
create index index_birthday_and_user_name on user_info(birthday, user_name);
首先,通过非聚集索引index_birthday查找birthday等于1991-11-1的所有记录的主键ID值。
然后,通过得到的主键ID值执行聚集索引查找,找到主键ID值对就的真实数据(数据行)存储的位置
5、增、删、改、查
增:
insert into test(name, age) values('name', 18);
insert into test(name, age) values('name1', 18),('name2', 18); #一次性插入多个值
insert into test(name, age) select name,age from test1; #把某张表中的数据插入
删:
delete from test;
delete from test where id>2 and name='name1';
改:
updata test set name='name2',age=19 where id>12 and name='name1';
查:
select * from test;
select id,name from test where id>2;
select name,age,123 from test;
select name as rname from test;
select * from test where id in (1,3,5,7);
select * from test where id in (select id from test1);
select * from test where id between 5 and 9; #闭区间,左右都可以取到
通配符
select * from test where name like 'name%'; %匹配无数字符;_匹配一个字符
分页
select * from test limit 10; 取前十条
select * from test limit 0,10; 表示从0开始,取0后面的10条
select * from test limit 10 offset 20; 表示从20开始,取20后的前10条
排序
select * from test order by id desc; id从大到小排列
select * from test order by id asc; id从小到大排列
select * from test order by age desc, id asc; 多个不同排序
select * from test order by desc limit 10; 取后十条
分组(聚合函数:count,max,min,sum,avg求平均值)
select max(id),id from test group by sex; 如果遇到相同的sex,只会取最大id的
select count(id),id from test group by sex; 计数
select count(id) as count,id form test group by sex;
select count(id),id from test group by sex having count(id)>2; 对于聚合函数结果进行二次筛选时,必须使用having
select
from
where
group by
order by
6、三大数据类型
数值型
int
float(m,d)
double(m,d)
m表示总长,d表示小数点后的位数
时间型
datetime
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)
字符型
char varchar text
7、InnoDB与MyISAM区别
MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。
InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。
8、视图、游标、连接、函数、事务、存储过程
有空再写。。。