1.数据库简介
1.1 什么是数据库?
简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。
更简单的理解形象,数据库和我们生活追踪存放杂物的储物间仓库性质一样,区别只是存放的东西不同,杂物间存放实体的物件,而数据库里存储的是数据,这样我们就对数据库有一个初步了解了。
数据库诞生于1950年,随着信息技术的发展和人类社会的不断进步,特别是2000年后,数据库不在仅仅是存储和管理数据了,而转变成用户所需要的各种数据管理的方式,数据库有很多种类和功能,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
1.2 数据库的种类
按照早先的数据库理论,比较流行的数据库模型有三种,分别为层次式数据库,网络式数据库和关系型数据库,而在当今的互联网中,最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库
1)关系型数据库
虽然网状数据库和层次数据库已经很好的解决了数据的集中和共享问题,但是在数据独立性和抽象级别上仍有很大欠缺,用户在对这两种数据库进行存取时,仍然需要明确数据库的存储结构,支出存取路径,而关系型数据库就可以很好的解决这些问题。
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(既二维格式表)。例如宏福教育某一期的学生关系就是一个二元关系,在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表上,通过对这些关联表格分类,合并,连接或选取等运算来实现数据的管理。
关系型数据库的表与表之间是可以有联系的。
关系型数据库诞生距今已经有40多年了,从理论产生发展到现实产品,例如:大家最常见的mysql和oracle(甲骨文)数据库,oracle在数据库领域里上升到了霸主的地位,形成每年高达数百亿美元的庞大产业市场,而mysql也是不容忽视的数据库,以至于被oracle中心收购了。
2)非关系型数据库
非关系型数据库也称之为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系统来说的优势在于简单,易部署,高并发。
面试:关系型数据库和非关系型数据库
数据库类型 | 特征 | 优点 | 缺点 |
关系型数据库 SQLIte、Oracle、MySQL | 1.采用了关系模型来组织数据的数据库; 2.最大的特点是事务的一致性; 3.其就是一个二维数据表格模型,一个关系型数据库就是有二维表及其之间的联系所组成的一个数据组织。 | 1.容易理解:二维表是非常贴近逻辑世界的一个概念,关系型相对于网状、层次等其他模型来说更容易理解; 2.使用方便:通用的SQL语言使得操作关心型数据库非常方便; 3.易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大降低了数据冗余和数据不一致的概率; 4.支持SQL,可用于复杂大大查询。 | 1. 为了维护一致性所付出的巨大代价就是其读写性能比较差; 2.固定的表结构; 3.高并发读写需求; 4.海量数据的高效率读写。 |
非关系型数据库MongoDB、Redis、Hbase | 1.使用键值对存储数据; 2.不提供关系型数据库对事务的处理; 3.是一种严格上下的数据库,一种数据结构化存储方法的集合。 | 1.无需经过SQL层的解析,读写性能很高; 2. 基于键值对,数据没有耦合性,容易扩展; 3.存储数据的格式:nosql的存储格式为key/value形式、文档形式、图片形式等等,而关系型数据库只支持基础类型。 | 1. 不提供SQL支持,学习和使用成本高; 2.无事务处理,附加功能和报表等支持也不好、 |
1.3 表与字段
表:表是结构化的文件,用来存储特定类型的数据,表可能存储客户清单,产品目录,或者其他信息列表。存储在表中的数据是一种类型的数据或一个列表,绝对不应该将顾客的列表信息和订单的列表信息存储到同一个数据库表中,这样做会使随后的数据检索和访问变得困难,代替的解决方案是创建两个表,在每个表中存储其相应的列表信息。数据库中每个表都有一个名字来标识它,并且在一个数据库中表名是唯一的。
列(column): 表中的一个字段,表由一列或多列构成,列中存储表的一部分信息,每一列存储一条特定信息。例如在客户表中,一列存储客户编号,另一列存储客户姓名,而地址,城 市,州,邮政编码存储在各自的列中。数据库中每一列都有相应的数据类型,数据类型定义了该列可以存储哪种类型的数据。例如,如果某列要存储数字,就应该使用numeric数据类型。如果某列存储日期,文本,提示,金额等 就需要用恰当的数据类型来指定。
行(row):表中的一条记录,表中的数据存储在行里,一行一条数据,把表当做类似电子表格的网格,在网格中垂直的列就是表的列 ,水平的行就是表的行。例如,客户表可能在每一行存储一个客户,表中行的数量也就是表中记录的条数。
注: NULL 在SQL中NULL用来指代空值( no value),如果一列被定义为允许为NULL,当插入或者更新行时,可以忽略该列的数据。
2. 常见的数据库
非关系型数据库(nosql0) | MongoDB、redias |
关系型数据库 | Oracle、DB2、SQLserver、MySQL、MariaDB |
3.MariaDB数据库
3.1 MariaDB发源
MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。
MariaDB跟MySQL在绝大多数方面是兼容的,对于开发者来说,几乎感觉不到任何不同。目前MariaDB是发展最快的MySQL分支版本,新版本发布速度已经超过了Oracle官方的MySQL版本。
在Oracle控制下的MySQL开发,有两个主要问题:
1)MySQL核心开发团队是封闭的,完全没有Oracle之外的成员参加。很多高手即使有心做贡献,也没办法做到;
2) MySQL新版本的发布速度,在Oracle收购Sun之后大为减缓。Widenius有一个ppt,用数据比较了收购之前和之后新版本的发布速度。有很多bugfix和新的feature,都没有及时加入到发布版本之中。
3.2 RDBMS(Relational Database Management System)
3.3 SQL语句
1)SQL语句主要分为:
DQL:数据查询语言,用于对数据进行查询,如select
DML:数据库操作语言,对数据库进行增删改查,如:insert,update,delete
TPL:事物处理语言,对事物进行处理,包括begin,transaction,commit,rollback
DCL:数据控制语言,如grant,revoke
DDL:数据定义语言:进行数据库,表的管理等,如create,drop
CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor
2)sql是一门特殊的语言,专门用来操作关系型数据库;
3)SQL语句不区分大小写。
SQL语句中导入文件用,命令source 文件名
4.MariaDB的操作
4.1 下载安装
MariaDB高版本的安装需要用到特定的云源
添加MariaDB云源:
[root@localhost ~]# vim /etc/yum.repos.d/MariaDB.repo[mariadb]name=MariaDBgpgcheck=1gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDBbaseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/
安装10.3版本的MariaDB,大小写必须区分,全小写会安装为低版本。
[root@localhost~]#mount /dev/cdrom /mnt[root@localhost~]#yum install MariaDB -yInstalled: MariaDB-compat.x86_64 0:10.3.14-1.el7.centos MariaDB-server.x86_64 0:10.3.14-1.el7.centosReplaced: mariadb-libs.x86_64 1:5.5.52-1.el7
4.2 数据库初始化
[root@localhost~]#systemctl restart mariadb #启动数据库[root@localhost ~]# mysql_secure_installation……..Enter current password for root (enter for none): #安装完还没有设置密码,直接回车即可……Change the root password? [Y/n] yNew password: #修改192.168.16.4MariaDB数据库密码为123New password:Re-enter new password: #密码为123Password updated successfully!Remove anonymous users? [Y/n]y #移除匿名用户Disallow root login remotely? [Y/n] #使用root远程登录(此root非linux的root,是数据库的root)Remove test database and access to it? [Y/n] y……..Thanks for using MariaDB!
4.3 进入数据库
[root@localhost ~]# mysql -uroot -p123; #-u指定root用户,-p指定密码,推荐分号结尾MariaDB [(none)]>0MariaDB [(none)]> show databases; #显示数据库的详细信息+--------------------+| Database |+--------------------+| information_schema | #默认三个数据库,不要轻易的修改| mysql || performance_schema |+--------------------+3 rows in set (0.002 sec)MariaDB [(none)]> use mysql; #进入mysql数据库Database changedMariaDB [mysql]>MariaDB [mysql]> show tables; #查看数据库下的默认表+---------------------------+| Tables_in_mysql |+---------------------------+| column_stats || columns_priv || db || event |……….| user | #除了user表其他表尽量不要动+---------------------------+31 rows in set (0.001 sec)MariaDB [mysql]> select * from user; #查看user表的所有数据#一堆乱码文件4 rows in set (0.001 sec)MariaDB [mysql]> select host,user,password from user; #自定义查询+-----------------------+------+-------------------------------------------+| host | user | password |+-----------------------+------+-------------------------------------------+| localhost | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || localhost.localdomain | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || 127.0.0.1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || ::1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |+-----------------------+------+-------------------------------------------+4 rows in set (0.000 sec)
4.4 授权和回收权限
MariaDB [mysql]> grant all privileges on *.* to root@'%' identified by '123'; #授予所有数据库(第一个*)的所有表(第二个*)所有权限;%表示允许第三方登录,加单引号转义;权限授予者可以是某个数据库的某个表;to给某个用户;以密码123(单引号)标识;分号结尾;允许第三方登录且设置密码为123;privilege可以省略MariaDB [mysql]> select host,user,password from user;+-----------------------+------+-------------------------------------------+| host | user | password |+-----------------------+------+-------------------------------------------+| localhost | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || localhost.localdomain | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || 127.0.0.1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || ::1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || % | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |+-----------------------+------+-------------------------------------------+5 rows in set (0.001 sec)MariaDB [mysql]> show grants; #查看权限+----------------------------------------------------------------------------------------------------------------------------------------+| Grants for root@localhost |+----------------------------------------------------------------------------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' WITH GRANT OPTION || GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION |+----------------------------------------------------------------------------------------------------------------------------------------+2 rows in set (0.000 sec)#创建用户zxj,密码为123,并赋予创建和删除权限MariaDB [mysql]> grant create,delete on *.* to zxj@'%' identified by '123';MariaDB [mysql]> select host,user,password from user;+-----------------------+------+-------------------------------------------+| host | user | password |+-----------------------+------+-------------------------------------------+| localhost | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || localhost.localdomain | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || 127.0.0.1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || ::1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || % | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 || % | zxj | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |+-----------------------+------+-------------------------------------------+6 rows in set (0.001 sec)MariaDB [mysql]> select user(); #查看当前用户+----------------+| user() |+----------------+| root@localhost |+----------------+1 row in set (0.000 sec)#root的权限无法回收,因此退出root,用创建的用户zxj登录MariaDB [mysql]> exitBye[root@localhost ~]# mysql -uroot -p123MariaDB [(none)]> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema |+--------------------+3 rows in set (0.001 sec)MariaDB [(none)]> use mysqlMariaDB [mysql]> show tables;………| time_zone_transition || time_zone_transition_type || transaction_registry || user |+---------------------------+31 rows in set (0.000 sec)MariaDB [mysql]> select host,user,password from user; #创建用户是仅给zxj创建和删除的权限,并没有给查看的权限,因此查看被拒绝。ERROR 1142 (42000): SELECT command denied to user 'zxj'@'localhost' for table 'user'MariaDB [mysql]> create database testdb; #可以创建数据库Query OK, 1 row affected (0.001 sec) #可以查看数据库,但不能查看数据库的表MariaDB [mysql]> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || testdb |+--------------------+4 rows in set (0.000 sec)MariaDB [mysql]> show grants; #查看给予的权限+-------------------------------------------------------------------------------------------------------------+| Grants for zxj@% |+-------------------------------------------------------------------------------------------------------------+| GRANT DELETE, CREATE ON *.* TO 'zxj'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |+-------------------------------------------------------------------------------------------------------------+1 row in set (0.000 sec)#回收权限只有root可以执行,因此退出登录用root登录,再用root回收zxj的权限MariaDB [mysql]> quitByeMariaDB [(none)]> revoke delete on *.* from zxj; #回收zxj的delete权限Query OK, 0 rows affected (0.000 sec)MariaDB [(none)]> show grants for zxj; #再查看zxj的权限+-----------------------------------------------------------------------------------------------------+| Grants for zxj@% |+-----------------------------------------------------------------------------------------------------+| GRANT CREATE ON *.* TO 'zxj'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' | #无delete权限+-----------------------------------------------------------------------------------------------------+1 row in set (0.000 sec)
4.5 创建数据库
MariaDB [(none)]> drop database testdb; #删除数据库Query OK, 0 rows affected (0.002 sec)#创建的数据库默认支持拉丁文,不支持中文,因此创建数据库时要设定字符集使其支持中文。MariaDB [(none)]> create database testbase character set utf8; #utf8字符集MariaDB [(none)]> show create database testbase; #查看设置的字符集+----------+-------------------------------------------------------------------+| Database | Create Database |+----------+-------------------------------------------------------------------+| testbase | CREATE DATABASE `testbase` /*!40100 DEFAULT CHARACTER SET utf8 */ |+----------+-------------------------------------------------------------------+MariaDB [(none)]> show create database mysql; #查看默认的字符集+----------+------------------------------------------------------------------+| Database | Create Database |+----------+------------------------------------------------------------------+| mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */ |+----------+------------------------------------------------------------------+#更改表结构等用命令alterMariaDB [(none)]> alter database mysql character set utf8; #更改默认字符集使其支持中文MariaDB [(none)]> show create database mysql;+----------+----------------------------------------------------------------+| Database | Create Database |+----------+----------------------------------------------------------------+| mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */ |+----------+----------------------------------------------------------------+
4.6 查看数据库版本
[root@localhost ~]# mysql -uroot -p123 Welcome to the MariaDB monitor. Commands end with ; or \g.Your MariaDB connection id is 24Server version: 10.3.14-MariaDB MariaDB Server #要记住数据库版本号,面试的时候可能用到
5. 数据库忘记密码的修改方法
#1.进入配置文件[root@localhost ~]# vim /etc/my.cnf.d/server.cnf# this is read by the standalone daemon and embedded servers[server]skip-grant-tables #跳过密码检查 #2.进入数据库修改密码[root@localhost ~]# mysql -uroot -pEnter password: #回车即可MariaDB [(none)]> use mysql;MariaDB [mysql]> update user set password=password('123') where user='root'; #修改密码为123,分号结尾#密码修改后再进入配置文件删掉skip以免被被人登录修改