1.什么是数据库?
关系型数据库
(1)关系型数据库的由来
虽然网状数据库和层次数据库已经很好的解决了数据的集中和共享问题,但是在数据独立性和抽象级别上仍有很大欠缺,用户在对这两种数据库进行存取时,仍然需要明确数据库的存储结构,支出存取路径,而关系型数据库就可以很好的解决这些问题
(2)关系型数据库介绍
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(既二维格式表)。
关系型数据库诞生距今已经有40多年了,从理论产生发展到现实产品,例如:大家最常见的mysql和oracle数据库,oracle在数据库领域里上升到了霸主的地位,形成每年高达数百亿美 元的庞大产业市场,而mysql也是不容忽视的数据库,以至于被oracle中心收购了。
非关系型数据库(nosql)
非关系型数据库也称之为nosql数据库,请注意,nosql的本意是“not only SQL”,指的是非关系型数据库,而不是“no SQL”的意思,因此nosql的产生并不是要彻底否定关系型数据库,而是作为传统关系型数据库的一个有效补充,NoSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
随着互联网的兴起,超大规模和高并发量的微博,微信,SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:传统的关系型数据库IO瓶颈,性能瓶颈都难以有效突破,于是开始出现了大批针对特定场景,以高性能和使用便利为目的的功能特异化的数据库产品,NoSQL类的数据库就是在这样的情景中诞生并得到了非常迅速的发展
NoSQL是非关系型数据库的广义定义。它打破了长久以来关系型数据库与ACID理论大一统的局面,NoSQL数据存储不需要固定的表结构,通常也不存在连接操作,在大数据存取上具备关系型数据库无法比拟的性能优势,该术语(NoSQL)在2009年初得到了广泛的认同
google的BigTable与Amazon的Dynamo是非常成功的商业NoSQL,一些开源的NoSQL体系,如
Redis, mongodb也逐渐的越来越受到各大中小型企业的欢迎和追捧
非关系型数据库的种类
键值(key-value)存储数据
键值数据库就类似传统语言中使用的哈希表,可以通过key来添加,查询或者删除数据,因为使用key主键访问,所以会获得很高的性能及扩展性
键值(key-value)数据库主要是使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据,key/value模型对于IT系统来说的优势在于简单,易部署,高并发
Mariadb发源
MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。
RDBMS
Relational Database Management System
- sql语句主要分为:
- DQL:数据查询语言,用于对数据进行查询,如select
- DML:数据库操作语言,对数据库进行增删改查,如:insert,update,delete
- TPL:事物处理语言,对事物进行处理,包括begin,transaction,commit,rollback
- DCL:数据控制语言,如grant,revoke
- DDL:数据定义语言:进行数据库,表的管理等,如create,drop
- CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor
- sql是一门特殊的语言,专门用来操作关系型数据库
- 不区分大小写
表(Table) 特定类型数据的结构化列表
表是结构化的文件,用来存储特定类型的数据,表可能存储客户清单,产品目录,或者其他信息列表。
存储在表中的数据是一种类型的数据或一个列表,绝对不应该将顾客的列表信息和订单的列表信息存储到同一个数据库表中,
这样做会使随后的数据检索和访问变得困难,代替的解决方案是创建两个表,在每个表中存储其相应的列表信息。
数据库中每个表都有一个名字来标识它,
并且在一个数据库中表名是唯一的
列( Column): 表中的一个字段,表由一列或多列构成,列中存储表的一部分信息
每一列存储一条特定信息。例如在客户表中,一列存储客户编号,另一列存储客户姓名,
而地址,城 市,州,邮政编码存储在各自的列中。数据库中每一列都有相应的数据类型,
数据类型定义了该列可以存储哪种类型的数据。例如,如果某列要存储数字,就应该使用numeric数据类型。
如果某列存储日期,文本,提示,金额等 就需要用恰当的数据类型来指定。
行( Row):表中的一条记录
表中的数据存储在行里,把表当做类似电子表格的网格,在网格中垂直的列就是表的列 ,水平的行就是表的行。
例如,客户表可能在每一行存储一个客户,表中行的数量也就是表中记录的条数。
注: NULL 在SQL中NULL用来指代空值( no value),如果一列被定义为允许为NULL,
当插入或者更新行时,可以忽略该列的数据。
mariadb安装
vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/
gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
启动服务:
service mariadb start
初始化:
mysql_secure_installation
如果报错启动不了:
查看是否mariadb-server没有下载! yum isntall mariadb-server
1:首先检查防火墙是否开启,发现防火墙没有开
2:删除原先mysql相关的服务 进程 配置文件
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql/*
rpm -qa |grep mysql
准备工作
chown -R mysql:mysql /var/lib/mysql
//先初始化数据库
sudo mysql_install_db --datadir=/home/mysql --user=root --defaults-file=/etc/my.cnf.d/openstack.cnf
//启动服务
systemctl start mariadb
//查看状态
systemctl status mariadb.service
给keystone文件777 权限
chmod 777 /etc/keystone/keystone.conf
忘记mysql的root密码
vim /etc/my.conf.d/server.conf
添加skip-grant-tables
mysql -uroot | mysql -u root -p
查看数据库
show databases;
#查看数据库
mysqladmin --version
#查看数据库版本
show create database mysql;
#查看创建数据库状态
use db_name
#使用哪个库
修改数据库
create database test03
#创建数据库
drop database test03
#删除数据库
alter database 库名 default character set=utf8;
#修改数据库默认字符集
用户管理
select user();
#查看当前用户
grant select,create,update,delete on test03.grade to 'aaa'@'%';
#给aaa添加查询,创建,更新,删除的权限(在任意主机上)
grant all privileges on test03.grade to 'aaa'@'%';
#给aaa赋予test03数据库的grade表最高权限(在任意主机上)
show grants for 'aaa';
#查看aaa用户的权限(root用户)
revoke all on *.* from 'aaa'@'%';
#收回aaa在任意数据库的任意表的最高权限
show grants
#查看权限
MariaDB 数据类型
MariaDB数据类型可以分为数字,日期和时间以及字符串值。
使用数据类型的原则:够用就行, 尽量使用范围小的,而不用大的
- 常用的数据类型
- 整数:int, bit
- 小数:decimal #decimal(5,2)
- 字符串:varchar, char
- 日期时间:date, time, datetime
- 枚举类型(enum)
- 约束
- 主键primary key:物理上存储的顺序
- 非空not null:此字段不能为空
- 唯一unique:此字段不允许重复
- 默认default:当不填写此值时会使用默认值,如果填写则已填写为准
- 外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常
sql语句-增、删、改
--显示当前时间 select now(); --创建classes表(id, name) create table zzzz( id int primary key not null auto_increment, name varchar(20), age int ); --查看表结构 --创建students表(id, name, age, high, gender, cls_id) create table students ( id int unsigned not null auto_increment primary key, name varchar(20), age tinyint unsigned default 0, high decimal(5,2), gender enum('男', '女', '中性', '保密') default '保密', cls_id int unsigned ); --创建classes表(id, name) create table classes( id int unsigned not null auto_increment primary key, name varchar(20) ); --查看表的创建 --MyISAM与InnoDB区别 --两种类型最主要的区别就是InnDB支持事物处理与外键和行级锁 --修改表-添加字段 --alter table 表名 add 列名 类型; alter table students add birthday datetime; -- 修改表-修改字段:不重命名版 -- alter table 表名 modify 列名 类型及约束; alter table students modify birthday date; -- 修改表-修改字段:重命名版 -- alter table 表名 change 原名 新名 类型及约束; alter table students change birthday birth date; -- 修改表-删除字段 -- alter table 表名 drop 列名; alter table students drop birthday; -- 删除表 -- drop table 表名; drop table students; --增删改查 --增加 --全列插入 --insert into 表名 values(..) --主键字段 可以用0 null default 来站位 -- 向students表里插入 一个学生信息 insert into students values (0,'小明',19,188.999,'男', 1); --部分插入 insert into students(id, name, age) values (0,'绿帽子',19); --部分插入(多条记录) insert into students(id, name, age) values (0,'绿帽子',19),(0,'小跳蚤',21); --修改 --update 表名 set 列1=值1, 列2=值2... where 条件; update students set age=100 where id=1; update students set age=100,cls_id=77 where id=1; --删除 -- 物理删除 -- delete from 表名 where 条件 delete from students where cls_id=88; -- 逻辑删除 -- 用一条字段来表示 这条信息是否已经不能在使用了 -- 给students表添加一个is_delete字段 bit 类型 alter table students add is_delete bit default 0; update students set is_delete=1 where id=6;