据说微信搜索《Java鱼仔》会变动强哦!java
本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试均可以看看哦git
(一)概述
在考研的时候,我有一门专业课是数据库,所以当时我对数据库的基础知识掌握的还算比较扎实,上周我再翻开当时考研时翻了无数遍的数据库书籍的时候,发现好多内容都忘掉了。恰好也决定开始写数据库相关的文章,就有了下面的内容。github
(二)基本概念
DB:数据库DB是长期存储在计算机内、有组织的、统一管理的相关数据的集合。面试
DBMS:数据库管理系统是位于用户与OS之间的一层数据管理软件,它为用户或应用程序提供了访问DB的方法。sql
DBS:数据库系统DBS是实现有组织动态地存储大量关联数据,方便多用户访问的计算机硬件、软件和数据资源组成的系统,即采用数据库技术的计算机系统。数据库
联系的元数:与一个联系有关的实体集的个数称为联系的元数。服务器
概念模型:表达用户需求观点的DB全局逻辑结构的模型。微信
逻辑模型:表达计算机实现观点的DB全局逻辑结构的模型。逻辑模型主要有层次、网状、关系和对象模型4种。ide
外部模型:表达用户使用观点的DB局部逻辑结构的模型。模块化
内部模型:表达DB物理结构的模型。
DDL:定义DB三级结构的语言
DML:对数据库进行查询操做的语言
DD:数据字典,存放三级结构定义的DB,对数据库的操做都要经过DD才能实现
主键:数据库表中对储存数据对象予以惟一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失。
外键:一个表中存在的另一个表的主键称为此表的外键。
触发器:一个经过事件来触发而被执行的特殊的存储过程,好比对一个表数据的操做会触发另外一个表的数据操做。
存储过程:是一个预编译的SQL语句,优势是容许模块化的设计,就是说只需建立一次,之后在该程序中就能够调用屡次。
视图:是一种虚拟的表,能够有选择性地展现部分数据,试图一般是有一个表或者多个表的行或列的子集。对视图的修改会影响基本表
临时表: 只在当前链接可见的表,关闭链接后会自动清除表空间。
create TEMPORARY table test222( id int(40) not null primary KEY );
内链接: 只链接匹配的行
左外链接: 包含左边表的所有行(无论右边的表中是否存在与它们匹配的行),以及右边表中所有匹配的行
右外链接: 包含右边表的所有行(无论左边的表中是否存在与它们匹配的行),以及左边表中所有匹配的行
全外链接: 包含左、右两个表的所有行,无论另一边的表中是否存在与它们匹配的行。
交叉链接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每一个行与另外一个数据源的每一个行都一一匹配。
(三)数据库的范式
设计关系数据库时,听从不一样的规范要求,设计出合理的关系型数据库,这些不一样的规范要求被称为不一样的范式,越高的范式数据冗余度越低。
实际开发中涉及到的范式有三种:第一范式、第二范式、第三范式
3.1 第一范式
若是数据库中的每一列属性都是不可分解的原子值,那么说明这个数据库知足第一范式。
3.2 第二范式
第二范式在第一范式的基础上,消除了非主属性对主属性的部分函数依赖。简单来说,就是表中的每一列都要和主键有关。而不能只与主键的某一部分相关
以这样一个数据为例,同一个订单会有多个商品,因此主键是订单id和商品id,可是商品名称仅依赖于商品id,不知足表中的每一列都要和主键有关,而不能只与主键的某一部分相关,所以只是第一范式。
修改为下表这样就知足了第二范式。
3.3 第三范式
第三范式在第二范式的基础上,消除了非主属性对主属性的传递函数依赖,简单来说,就是每一列数据都和主键直接相关,而不能间接相关。
好比一张学生表:
上面的全部属性均依赖于学号,知足第二范式,简单来说就是经过学号能肯定后面的全部属性,可是班主任性别是经过班主任姓名带出来的,就存在了学号->班主任姓名->班主任性别的传递依赖,所以不知足第三范式。
要想知足第三范式,就要消除传递依赖。
能够改为:
(四)sql的基本操做
4.1 数据库基本操做
#查看数据库 show databases #建立数据库 create database db DEFAULT CHARSET utf8 COLLATE utf8_general_ci; #使用数据库 use db;
4.2 用户
#建立用户 create user '用户名'@'IP地址' identified by '密码'; #删除用户 drop user '用户名'@'IP地址'; #修改用户 rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';; #修改密码 set password for '用户名'@'IP地址' = Password('新密码')
建立用户时:
用户名:建立的用户名称
IP地址:指定用户能够从哪一个服务器登录,本地用户localhost,任意远程机用“%”
密码:该用户登录的密码
4.3 权限
#查看权限: show grants for '用户'@'IP地址' #受权: grant 权限 on 数据库.表 to '用户'@'IP地址' #取消受权: revoke 权限 on 数据库.表 from '用户'@'IP地址'
权限:用户的操做权限,如SELECT,INSERT,UPDATE等,若是要授予所的权限则使用ALL 例如:
GRANT SELECT, INSERT ON student.user TO 'javayz'@'%';
经过下面的命令让指定用户能够给其余用户受权
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
4.4 对表的操做
#查询全部的表 show tables; #建立表 CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, # not null表示不能为空,auto_increment表示自增 `name` varchar(255) DEFAULT 'javayz', # default 表示默认值 PRIMARY KEY (`id`) # 把id列设置成主键 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; #清空表 truncate table 表名 #删除表 drop table 表名 #添加列 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 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); #删除外键 alter table 表名 drop foreign key 外键名称 #修改默认值 ALTER TABLE user ALTER name SET DEFAULT 'javayz2'; #删除默认值 ALTER TABLE user ALTER name DROP DEFAULT;
4.5 对数据的操做
基础增删改查:
#增 insert into 表 (列名,列名...) values (值,值,...) #删 delete from 表 where 条件 #改 update 表 set 字段='值' where 条件 #查 select 值 from 表 where 条件
其余条件:
#通配符like %匹配多个字符,_匹配单个字符 select * from 表 where name like '%java_' #limit 限制输出行数 select * from 表 limit 3 #前3行 select * from 表 limit 3,5; #从第3行开始的5行 #order by 排序 select * from 表 order by 列 asc #asc正序,desc逆序 #group by分组(group by 必须在where以后,order by以前) select name from 表 group by name