初始数据库
初识数据库
一. 什么是数据库?
数据库是指按照数据结构 来组织.存储和管理数据的仓库. 是一个长期存储在计算机内的,有组织的,可共享的,统一管理的大量数据的集合.
二. 为什么要有数据库呢?
2.1 数据库的由来
基于我们之前所学的,数据要想永久保存的话,只能保存到文件中.那么问题来了,一个文件仅仅只能存在于某一台计算机上.
那么如果需要实现数据通信的前提是得所以的文件都必须存储在一台计算机上!! 多大的计算机也放不下啊!
1、程序所有的组件就不可能运行在一台机器上
#因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器机器的性能总归是有限的,受限于目前的硬件水平,就一台机器的性能垂直进行扩展是有极限的。#于是我们只能通过水平扩展来增强我们系统的整体性能,这就需要我们将程序的各个组件分布于多台机器去执行。
2、数据安全问题
#根据1的描述,我们将程序的各个组件分布到各台机器,但需知各组件仍然是一个整体,言外之意,所有组件的数据还是要共享的。但每台机器上的组件都只能操作本机的文件,这就导致了数据必然不一致。
#于是我们想到了将数据与应用程序分离:把文件存放于一台机器,然后将多台机器通过网络去访问这台机器上的文件(用socket实现),即共享这台机器上的文件,共享则意味着竞争,会发生数据不安全,需要加锁处理。。。。
3、并发
根据2的描述,我们必须写一个socket服务端来管理这台机器(数据库服务器)上的文件,然后写一个socket客户端,完成如下功能:
#1.远程连接(支持并发)
#2.打开文件
#3.读写(加锁)
#4.关闭文件
总结:
#我们在编写任何程序之前,都需要事先写好基于网络操作一台主机上文件的程序(socket服务端与客户端程序),于是有人将此类程序写成一个专门的处理软件,这就是mysql等数据库管理软件的由来,但mysql解决的不仅仅是数据共享的问题,还有查询效率,安全性等一系列问题,总之,把程序员从数据管理中解脱出来,专注于自己的程序逻辑的编写。
2.2 数据库的概念
1) 数据库可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。
数据库可以对数据进行分类保存,并且能够提供快速的查询。例如,我们平时使用百度搜索内容时,百度也是基于数据库和数据分类技术来达到快速搜索的目的。
2) 数据库可以有效地保持数据信息的一致性、完整性、降低数据冗余。
可以很好地保证数据有效、不被破坏,而且数据库自身有避免重复数据的功能,以此来降低数据的冗余。
3) 数据库可以满足应用的共享和安全方面的要求,把数据放在数据库中在很多情况下也是出于安全的考虑。
例如,如果把所有员工信息和工资数据都放在磁盘文件上,则工资的保密性就无从谈起。如果把员工信息和工资数据放在数据库中,就可以只允许查询和修改员工信息,而工资信息只允许指定人(如财务人员)查看,从而保证数据的安全性。
4) 数据库技术能够方便智能化地分析,产生新的有用信息。
例如,超市中把物品销售信息保存在数据库中,每个月销售情况的排名决定了下半月的进货数量。数据库查询的结果实际上产生了新的数据信息。
数据挖掘、联机分析等技术近年来发展非常快,其核心意义在于从一堆数据中分析出有用的信息。
三 数据库的发展史(了解)
# 1960s
计算机上的数据库系统始于20世纪60年代。
在60年代至70年代这十年中,有两种流行的数据模型:称为CODASYL的网络模型和称为IMS的分层模型。
其中最成功的数据库系统是SABRE系统,他是IBM用来帮助美国航空公司管理其预订数据的。
# 1970 to 1972
在这期间,E.F. Codd发表了一篇重要论文,其中他提到建议使用关系型数据库模型,他的这一观点改变了人们对数据库的看法。
在这种模型中,数据库的模式或逻辑组织与物理信息的存储不再直接连接,这也成为了以后数据库系统的标准原则。
自此关系型数据库系统开始成为主流。
# 1970s
1974年至1977年间出现了两个主要的关系型数据库系统原型,它们分别是UBC开发的Ingres和IBM创建的System R.
Ingres使用了一种名为QUEL的查询语言, 在Ingres 基础上产生了很多数据库软件,如Ingres Corp., Microsoft SQL Server,Sybase,Wang's PACE和Britton-Lee等系统。
System R使用的是SEQUEL查询语言,它促成了SQL/DS,DB2,Allbase,Oracle和Non-Stop SQL的开发。
在这十年中,关系型数据库管理系统(RDBMS)也成为公认的术语。
# 1976s
在这一年P. Chen提出了一种名为Entity-Relationship(ER)的新数据库模型。
该模型使人们可以专注于数据应用,而不是数据库的逻辑结构设计。
# 1980s
结构化查询语言(SQL)成为标准查询语言。
计算机市场的快速增长也推动了数据库市场,随着关系型数据库取得商业上的成功,导致了网络和分层数据库的使用率大幅下降。DB2成为IBM的旗舰数据库产品,同时,IBM PC的推出导致了许多新数据库公司的建立以及PARADOX,RBASE 5000,RIM,Dbase III和IV,OS/2数据库管理器等产品的开发。
# 1990s 早期
在数据库行业震荡之后,大多数幸存的公司以高价销售复杂的数据库产品。大约在这个时候,出现了用于应用程序开发的新客户端工具,其中包括Oracle Developer,PowerBuilder,VB等。还出现了许多供个人使用的工具,例如ODBC和Excel/Access。对象数据库管理系统(ODBMS)的原型是在20世纪90年代初创建的。
# 1990s 中期
互联网的出现导致了数据库行业的指数级增长。普通桌面用户开始使用client-server数据库系统来访问包含旧有数据的计算机系统。
# 1990s 后期
互联网业务的不断扩大,导致了对远程数据库连接器的需求增加,例如Front Page,Active Server Pages,Java Servelets,Dream Weaver,ColdFusion,Enterprise Java Beans和Oracle Developer 2000。使用cgi,gcc,MySQL,Apache和其他系统为Internet带来了开源解决方案。随着POS机使用的增加,OLTP和在OLAP开始逐渐成熟。
# 2000s
虽然在21世纪初互联网行业泡沫的破灭导致了大量公司破产,但数据库应用仍在继续增长。目前,三大数据库公司分别是微软,IBM和Oracle。
# 当前
今天,数据库已广泛应用于我们的日常生活中。得益于数据库的发展,使得我们今天能够使用到很多服务,例如云存储、预测天气等。当前的关系型数据库包括Oracle,MySQL和SQL server等巨头,此外,也有许多公司为非关系数据库提供特定的解决方案,如Redis、mongoDB等。
注意: 数据库的本质其实就是一个基于socket编写的C/S架构的应用软件
四. mysql介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
五.关系型数据库和非关系型数据库
# 关系型数据库: mysql,oracle,matiadb,db2,access,sql server
特点:
数据之间彼此有关系或者约束
存储数据的表型形式通常是以表格的形式存储
每个字段还有会存储类型的限制.
作用: 主要帮我们存储数据,倾向于硬盘方面.
# 非关系型数据库: redis,mongodb,mencache
特点: 存储数据通常都是以k,v键值对的形式
作用: 主要帮我们做缓存,减轻我们服务器的压力,倾向于内存方面.
了解
""" 了解
mysql是一个开源的软件,至少现在还是,但是已经被oracle收购了但是oracle是一个闭源的.
matiadb(和mysql一模一样,一个开发者)
mongodb(爬虫使用的比较多)
"""
"""
开源即开放源代bai码(Open source code)也称du为源代码公开,指的zhi是一种dao软件发布模式,讲源zhuan代码公开。闭shu源(Closed source)是作为开源的反义词而出现的一个术语,指被用于任何没有资格作为开源许可术语的程序。
1、开放源代码(英语:Open Source)描述了一种在产品的出品和开发中提供最终源材料的做法。一些人将开放源代码认为是一种哲学思想,另一些人则把它当成一种实用主义。在这个词广泛使用前,开发者和生产者使用很多词去描述这个概念;开放源代码在互联网上获得广泛使用,参加者需要大量更新电脑源代码。开放源代码使得生产模块、通信管道、交互社区获得改善。随后,一个新著作权、软件授权条款、域名和消费者提供创建的,一个新词开源软件诞生。
2、闭源。一般意味着将仅能获得它们许可的计算机程序的一个二进制版本,而没有这个程序的源代码。软件的翻译修改从技术方面来说几乎是不可能的。这个发展模型的源代码被看作这个公司的商业秘密,因此可能获得源代码接入的团体例如学校,商业机构等必须提前签订不泄漏协议,以保证源代码不会大众所知而影响其盈利。
一句话:
开源就是公布程序源代码。
闭源就是只提供最终执行程序或安装包,而不公布源代码。
"""
六. 数据库的几种重要的概念
# 从大的概念往小分
数据库服务器 ---> 一台安装了数据库服务端软件的一台的计算机(对内存要求比较高)
数据库管理系统 ---> 一款带有数据库客户端和服务端的数据库软件 如:mysql
数据库 ---> 文件夹
表 ---> 文件
记录 ---> 文件中一行行的内容,数据(就相当于文件中的一行内容(抽取事物一系列典型的特征拼接到一起))
表头 ---> 表格的开头部分,用于对一些问题的性质的归类
字段 ---> 描述文献的某一特征,即数据项
数据 ---> 事实或观察的结果,是对客观事物的逻辑归纳(用于记录现实世界中的某种状态)
七. mysql的安装
在windows中的安装: https://www.cnblogs.com/jkeykey/p/14457280.html
在linux中的安装: https://www.cnblogs.com/jkeykey/p/14457346.html
八. 基本sql语句
8.1 基本命令补充
use 库名; # use 库名 切换库 和 cd命令类似
select databases(); # 查看当前所在的库的名字
8.2 针对库(文件夹)的增删改查
-- 增
create database db1;
create database db1 charset='utf8mb4';
create database db1 charset=utf8;
-- 查
show databases; -- 查看所有数据库下的数据库名字
show create database db1; # 查看单个库的信息,一般为库名和库的字符编码内容
-- 改: 数据库没有改名这么一说,即数据库改的只有字符编码
alter database db1 charset utf8;
alter database db1 charset utf8mb4;
-- 删
drop database db1;
补充: use information_schem
查看内存相关的一些信息
8.3 针对表(文件)的增删改查
前提:在操作表(文件)的时候 需要指定所在的库(文件夹)
-- 增: 每个字段都需要规定数据类型
'''
创建表以后生成两个表: t1.frm 和 t1.ibd
t1.frm: 存放的是表的表结构. 代指什么样的字段, 每个字段是什么类型的, 有什么相关的约束条件
t1.ibd: 存放的是表的数据
'''
create table db1.t1(id int, name char(4));
create table t1(id int, name char(4)); # 建表的时候最好要有一个id, 这个id是标识你的表都插了多少条记录, 是一个记录编号
-- 查
show tables; # 查看当前库下的都有哪个表
show create table t1; # 查看刚刚创建的表t1结构
describe t1; # 查看表结构
desc t1; # 查看表结构(简写)
-- 改: 以后几乎用不上, 除非涉及到你的表结构不合理
alter table t1 add age int; # 为当前库下t1的表添加age字段名, 并指定int类型
alter table t1 modify name char(5); # 为当前库下t1的表修改name字段最大传字符数为char(5)
alter table t1 change name NAME char(6); # 为当前库下t1的表修改name字段名为NAME, 并指定最大传字符数为chr(15)
-- 删
drop table db1.t1;
drop table t1;
8.4 针对数据的增删改查(一行行数据
前提: 一定要先有库 有表 最后才能操作记录
# 增
'''
加into不加into都可以, 不过为了语义完整还是加into.
value和values都可以
'''
insert t1 values(1, 'jason'); # 为表t1中的第一个字段, 第二个字段插值, 一个小括号就是一条记录.
insert into t1 value(1, 'jason');
insert into t1 values(1, 'jsaon');
insert into t1 values(1, 'jsaon'), (1, 'tank');
# 查
'''
查出结果以后本身就是一张表, 这张表存在硬盘中, 查出来是在内存当中, 表查出来的那一刻开始就已经没了, 当前状态的查询没有任何的保存手段.
'''
select * from t1; # 在当前路径查看t1表中属于所有字段的记录(注意: 该命令当数据量特别大的时候不建议使用)
select name from t1; # 在当前路径查看t1表中属于字段name的记录
select * from t1 where id=2; # 拿到表当前库下的t1表中属于id字段等于2的一条记录. id后面可以指定多种判断条件: =, >, >=. <=, !=
select * from t1 where id>=2;
select * from t2 where id!=2;
select * from t2 where name='jason';
# 改
update t1 set name='JSAON'; # 在当前路径将t1表中的name字段改成JSAON.
update t1 set name='DSB' where id=2; # 当前路径将t1表中id字段等于2对于的name字段的值修改为DSB.
# 删
'''
delete只是配合where条件来删除符合条件字段中的某几条记录的, 不要用delete清空表, 使用它清空表不能使AUTO_INCREMENT自动自增功能被还原,单纯的只能清楚表中的记录
'''
delete from t1; # 将表所有的数据清空
delete from t1 where id=4;
truncate t2; # 将表所有的数据清空(推荐)
8.5 补充: 斜杠\命令
\h # 显示帮助信息. 或者输入`help;`
\c # 清除当前输入语句
\s # 从服务器获取状态信息。
\G # 发送命令到mysql服务器,垂直显示结果。
九. 三种类型的SQL语言
-- 1、DDL语句(data definition language) 数据定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
# 补充: definition /ˌdefɪˈnɪʃn/ 定义
-- 2、DML语句(Data Manipulation Language) 数据操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
# 补充: Manipulation /məˌnɪpjuˈleɪʃn/ 操纵
-- 3、DCL语句(Data Control Language) 数据控制语言: 例如控制用户的访问权限GRANT、REVOKE
# 补充:
GRANT /ɡrɑːnt/ 授予 允许
REVOKE /rɪˈvəʊk/ 撤销 吊销 废除