day40
详情请看:https://www.cnblogs.com/clschao/articles/9907529.html
数据库
数据库
- 简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作
- 所谓“数据库”是以一定方式存储在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
DBMS 数据库管理系统
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦如其他的分类方法。不论使用哪种分类方式,一些DBMS能够跨类别,例如同时支持多种查询语言
SQL
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
不同数据库系统之间的SQL不能完全相互通用
数据库分类
关系型数据库
RDBMS(关系型数据库管理系统):关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式,不是excel,但是和excel相似)结合下图来看一下
这几个表之间建立了某种关系,共享着双方的数据。这就是关系,关系型数据库里面存数据的时候就类似这个样子。
常用关系型数据库
- oracle数据库
Oracle前身叫SDL、由Larry Ellison和两个变成任意在1977创办,他们开发了主机的拳头产品,在市场上大量销售。Oracle公司是最早开发关系型数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率数一数二 。
Oracle公司是目前全球最大的数据库软件公司,也是近年业务增长极为迅速的软件提供与服务商
主要应用范围:传统大企业、大公司、*、金融、证券等。
版本升级:oracle8i,oracle9i,oracle10g,oracle11g,oracle12c
- MySQL
MySQL被广泛的应用在Internet上的大中小型网站中。由于体积小、速度快、总体拥有成本低,开放源代码
- MariaDB
MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开元社区维护,采用GPL授权许可。开发这个MariaDB的原因之一是:甲骨文公司收购了MySQL后,有MySQL闭源的潜在风险,因此MySQL开元社区采用分支的方式来避开这个风险。
MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM的存储引擎,它使用了Percona的XtraDB(InnoDB的变体)这个版本还包括了PrimeBase XT (PBXT)和Federated X存储引擎。
- SQL Server数据库
Microsoft SQL Server是微软公司开发的大型关系数据库系统。SQL Server的功能比较全面,效率高,可以作为中型企业或单位的数据库平台。SQL Server可以与Winodws操作系统紧密集成,不论是应用程序开发速度还是系统事务处理运行速度,都得到较大的提升,对于在Windows平台上开发的各种企业级信息管理系统来说,不论是C/S(客户机/服务器)架构还是B/S(浏览器/服务器)架构。SQL Server都是一个很好的选择。SQL Server的缺点是只能在Windows系统下运行
- Access数据库
Access是入门级小型桌面数据库,性能安全性都很一般,可供个人管理或小型企业只用
Access不是数据库语言,只是一个数据库程序,目前最新版本为Office 2007,其特点主要如下:
(1)完善地管理各种数据库对象,具有强大的数据组织,用户管理、安全检查等功能
(2)强大的数据处理功能,在一个工作组级别的网络环境中,使用Access开发的多用户管理系统具有传统的XSASE(DBASE、FoxBASE的统称)数据库系统所无法实现的客户服务器(Ckient/Server)结构和响应的数据库安全机制,Access具备了许多先进的大型数据管理管理系统所具备的特征。
(3)可以方便地生成各种数据对象,利用存储的数据建立窗体和报表
(4)作为Office套件的一部分,可以与Office集成,实现无缝连接
(5)能够利用Web检索和发布数据,实现与Internet的连接,Access主要适用于中小企业应用系统,或作为客户机/服务器系统中的客户端数据库。
- 不常见的关系型数据库
DB2,PostgreSQL,Informix,Sybase等。这些关系型数据库逐步的淡化了普通运维的实现,特别是互联网公司几乎见不到
非关系数据库
非关系型数据库也被称为NoSQL数据库,NOSQL的本意是“Not Olnly SQL”
NOSQL非关系型数据库总结:
- NOSQL不是否定关系数据库,而是作为关系数据库的一个重要补充
- NOSQL为了高性能、高并发而生,忽略影响高性能、高并发的功能
- NOSQL典型产品memcached(纯内存),redis(持久化缓存),mongodb(文档的数据库)
4种非关系数据库的存储格式
- 键值(Key—Value)存储数据库
键值数据库就类似传统语言中使用哈希表,可以通过key来添加、查询或删除数据,因为使用key主键访问,所以会获得很高的性能及扩展性
键值(Key-Value)数据库主要是使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署、高并发
k1—>数据
k2—>数据
典型产品:Memcached、Redis、MemcacheDB、BerkeleyDB
- 列存储(Column—oriedted)数据库(了解即可,一般公司用不到)
这部分数据库通常用来分布式存储的海量数据,键仍然存在,但是他们的特点是指向了多个列。
典型产品:Cassandra,HBase
- 面向文档(Document—Oriented)数据库
面向文档数据库会将以文档的形式存储。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关系对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储
典型产品:MorgoDB、CouchDB
- 图形(Graph)数据库
常见的非关系型数据库
- memcached(key-value)
Memcaced是一个开源的、高性能的、具有分布式内存对象的缓存系统。通过它可以减轻数据库负载,加速动态的web应用,最初版本由LiveJoumal 的Brad Fitzpatrick在2003年开发完成。目前全球有非常多的用户都在使用它来架构主机的大负载网站或提升主机的高访问网站的响应速度。注意:Memcache 是这个项目的名称,而Memcached是服务端的主程序文件名。
缓存一般用来保存一些进程被存取的对象或数据,通过缓存来存取对象或数据要比在磁盘上存取块很多,前者是内存,后者是磁盘、Memcached是一种纯内存缓存系统,把经常存取的对象或数据缓存在memcached的内存中,这些被缓存的数据被程序通过API的方式被读取,memcached里面的数据就像一张巨大的hash表,数据以key-value对的方式存在。Memcached通过缓存经常被存取的对象或数据,从而减轻频繁读取数据库的压力,提高网站的响应速度,构建出快速更快的可扩展的Web应用。
官网:http://memcached.org/
由于memcached为纯内存缓存软件,一旦重启所有数据都会丢失,因此,新浪网基于Memcached开发了一个开源项目Memcachedb。通过为Memcached增加Berkeley DB的特久化存储机制和异步主复制机制,使Memcached具备了事务恢复能力、持久化数据能力和分布式复制能力,memcached非常适合需要超高性能读写速度、持久化保存的应用场景,但是最近几年逐渐被其他的持久化产品替代如Redis
Memcached小结:
1、key-value行数据库
2、纯内存数据库
3、持久化memcachedb(sina)
- Redus(key-value)
和Memcached类似,redis也是一个key-value型存储系统。但redis支持的存储value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)等。这些数据类型都支持push/pop、add/remove及取交集、并集和差集及更丰富的操作,而且这些操作都是原子性的。为了保证效率,redis的数据都是缓存在内存中。区别是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在基础上实现了master-slave(主从)同步。
redis是一个高性能的key-value数据库。redis的出现、很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python、Ruby、Erlang、PHP客户端,使用方便。
官方:http://www.redis.io/documentation
redis特点:
1)支持内存缓存,这个功能相当于memcached
2)支持持久化存储,这个功能相当于memcachedb,ttserver
3)数据库类型更丰富。比其他key-value库功能更强
4)支持主从集群、分布式
5)支持队列等特殊功能
应用:缓存从存取memcached更改存取redis
- MongoDB(Document-oriented)
MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。他支持的数据库结构非常松散,类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongodb最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点:
高性能、易部署、易使用、存储数据非常方便
主要功能特性:
1.面向集合存储,易存储对象类型的数据
2.“面向集合”(Collenction-Orented)意思是数据库被分组存储在数据集中,被称为一个集合(Collenction)每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档,集合的概念类似关系型数据库(RDBMS)里的表(table)不同的是它不需要定义任何模式(schema)
3.模式*
模式*(schema-free)意为着存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。
4.支持动态查询
5.支持完全索引,包含内部对象
6.支持查询
7.支持复制和故障恢复
8.使用高效的二进制数据存储,包括大型对象
9.自动处理碎片、以支持云计算层次的扩展性
- Cassandra(Colum-oriented)
Apache Cassndra是一套开源分布式Key-Value存储系统。它最初由Facebook开发,用于存储特别大的数据。Facebook目前在使用此系统。
主要特点:
1.分布式
2.基于column的结构化
3.高伸展性
4.Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成一个分布式网络服务,对Cassandra的一个写操作,会被复制到其他节点上去,对Cassandra的读操作。也会被路由到某个节点上面去读取。
Cassandir是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomie(分布式的key-value存储系统)更丰富,Cassandra最初由Facebook开发,后转变成了开源项目。
- 其他不常用非关系型数据库
HBase、MemcacheDB、BerkeleyDB、Tokyo Cabinet\Tokyo Tyrant(ttserver)
ttserver 持久化输出,缺点存储2千万条 性能下降(由日本人发明)
MySQL和安装教程
网页:https://www.cnblogs.com/clschao/articles/9907529.html
MySQL安装目录介绍
其中,我们重点看一下data文件夹:如果你找不到自己建立的库或者表的文件,可能不在这个data文件夹下面,连接上mysql之后,输入show global variables like ``"%datadir%"``;来查看数据文件存储路径,找到路径之后,到对应路径下如果找不到这个文件夹,那么可能是隐藏的,把隐藏的文件显示一下就行了。
关于数据库中的这4个初始的库的详细介绍,有兴趣的同学可以来看看我的这篇文章(目前作为了解用):https://www.cnblogs.com/clschao/articles/9928223.html
其中mysql这个库我需要提一下:
mysql:这个是mysql整个服务的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
总结:其实这些库就是我们电脑上对应的文件夹,在mysql中显示为对应的库,来方便我们管理数据,而文件或者文件夹这种与硬盘打交道的事情就交给mysql了,我们只需要对mysql库中的数据进程操作就可以了。
root用户密码设置及忘记密码的解决方法
方法一:用SET PASSWORD命令
- 首先登录MySQL,使用mysql自带的那个客户端连上mysql
- 格式:mysql> set password for 用户名@localhost = password('新密码');
- 例子:mysql> set password for root@localhost = password('123');
- 刷新:mysql> flush privileges;
方法二:用mysqladmin
不用登录mysql
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123
方法三:用UPDATE直接编辑那个自动的mysql库中的user表
- 没有忘记密码
首先登录MySQL,连接上mysql服务端。
mysql> use mysql; use mysql的意思是切换到mysql这个库,这个库是所有的用户表和权限相关的表都在这个库里面,我们进入到这个库才能修改这个库里面的表。
mysql> update user set password=password('123') where user='root' and host='localhost'; 其中password=password('123') 前面的password是变量,后面的password是mysql提供的给密码加密用的,我们最好不要明文的存密码,对吧,其中user是一个表,存着所有的mysql用户的信息。
mysql> flush privileges; 刷新权限,让其生效,否则不生效,修改不成功。
- 忘记密码
在忘记root密码的时候,可以这样(注意:root密码最好不要忘记,找地方记录下来,不然如果是工作中你们使用的数据库(不管是测试的还是线上的,都是比较麻烦的事情,数据库轻易不会让你重启的,不过作为一个开发来讲,你应该是无法用root用户的~~~))
简单步骤
1 停掉MySQL服务端(net stop mysql)
2 切换到MySQL安装目录下的bin目录下,然后手动指定启动程序来启动mysql服务端,指令: mysqld.exe --skip-grant-tables
3 重新启动一个窗口,连接mysql服务端,
4 修改mysql库里面的user表里面的root用户记录的密码:
update user set password = password('666') where user='root';
5 关掉mysqld服务端,指令:
tasklist|findstr mysqld
taskkill /F /PID 进程号
6 正常启动服务端(net start mysql)
具体步骤
以windows为例:
1. 关闭正在运行的MySQL服务,net stop mysql(这个mysql是你添加的mysqld到系统服务时的服务名)。
2. 打开DOS窗口,转到mysql\bin目录。
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证,因为之所以mysql启动之后,客户端连接的时候需要登陆认证,输入密码什么的,是因为mysql服务端启动的时候,加载了自己内部的一些权限相关信息的授权表、权限认证表什么的,这样就要求客户端必须有认证,如果启动的时没有加载这些表和设置,那么我们客户端再进行登陆的时候,就不需要认证了,那么就可以登陆上了,登陆之后,我们到mysql这个存有所有用户信息的表中去修改root用户或者别的用户的密码了,还是比较6的,但是这样搞需要关闭服务端,在实际工作中想关闭mysql服务??你觉得可能吗??记住这个问题,我后面给大家解决。
注意一个问题,如果我们直接使用的上面这个指令,也即是mysqld --skip-grant-tables,也就是直接通过mysqld启动的mysql服务的话,我们就不能通过net stop mysql的方式来关闭mysql服务了。但是可以通过别的方式来关闭,我在安装mysql的那篇博客里面写到了,杀进程的方式,知道你肯定忘记了,再给你写一下(win10):tasklist |findstr mysqld找到这个mysqld服务的端口号,然后taskkill /F /PID 端口号来杀死这个mysql服务的进行,以后就可以使用net start/stop mysql的方式来启动和关闭了。
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
6. 连接权限数据库: use mysql; 。
6. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
7. 刷新权限(必须步骤):flush privileges; 。凡是涉及到密码修改或者后面我们会学到的权限修改,修改完之后全部要再执行一下这一句。
8. 退出 quit。
9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
修改字符集编码
永久修改字符集编码的方法
在mysql安装目录下创建一个my.ini(my.cnf)文件,写入下面的配置,然后重启服务端
[client]
#设置mysql客户端默认字符集
default-character-set=utf8
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
user = 'root'
password = '123'
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=E:\mysql-5.6.45-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:\mysql-5.6.45-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
查看字符集编码的指令
show variables like "%char%";
MySQL客户端连接服务端时的完整指令
mysql -h 127.0.0.1 -P 3306 -u root -p
详情看:https://www.cnblogs.com/clschao/articles/9907529.html
存储引擎
详情:https://www.cnblogs.com/clschao/articles/9953550.html
innoDB
默认存储引擎 InnoDB
查看存储引擎
show engines;
SQL语句简单介绍
sql语句的分类——DDL、DQL、DML、DCL
详情:https://www.cnblogs.com/clschao/articles/9930802.html
数据库
数据库命名规则
可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
最长128位
# 基本上跟python或者js的命名规则一样
数据库相关操作
-
查看数据库
show databases;
-
查看其中一个库
show create database db1;
-
创建数据库
create database db1;
-
创建数据库并指定编码
create database db1 charset utf8;
-
使用数据库
use db1;
-
修改数据库
alter database db1 charset utf8;
-
删除数据库
drop database db1;
表(增删改查)
-
创建表
create table stu(id int,name char(16));
-
查看当前库下所有的表
show tables;
-
查看刚刚创建的表
show create table stu;
-
查看一张表的基本信息
desc stu;
-
修改表的数据类型
alter table class modify class_name char(16);
-
修改表的字段名和数据类型
alter table class change class_name(旧) name(新) char(18);
-
删除表
drop table class;
记录(增删改查)
-
新增一条记录
insert into stu values(1,'海狗'),(2,'李业'),(3,'钢环');
insert into stu(id,name) values(1,'王洋');
-
查记录
select * from stu;
-
条件查询
select * from stu where id = 1;
-
修改记录
update stu set name = 'alisa' where id = 3;
-
删除记录
delete from stu where name = '海狗';
清空表:
delete from t1; 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncate t1; 数据量大,删除速度比上一条快,且直接从零开始,