Day1-MySQL初识
引子
我们之前都写过学生管理系统的大作业吧,里面需要实现的功能有:
创建学生
创建课程
查看学生信息
查看课程信息
学生选择课程信息
这些功能都有涉及到数据的存储,读取,修改,甚至是删除操作
那么在文件中:
存储的操作需要写入
读取的操作需要循环
修改的操作是最为麻烦的,需要新建一张新表,把修改后的数据写入,然后把原来的表删除,把新表的名字改成原来的
删除的操作如果是部分删除,就跟修改的操作差不多,需要新表替换旧表
当然数据量也不是很大,但是操作起来却很麻烦;而且数据与软件是放在一个机器上,那样运行效率会比较低.
我们有没有想过,如果以后开发项目,用文件存储数据真的好么,效率问题,数据安全问题,支持并发问题,数据共享问题等等,该怎么办???
一 数据库介绍
1.为什要用数据库
根据上面的例子,我们已经知道:
1.文件操作比较麻烦,存储格式也需要自定义,读出来之后还有解析,程序员需要做很多事情。
2.文件和程序放在一台机器上也是不合理的
3.文件读写比较慢,因为跟跟文件打交道的都是IO操作,IO操作越多,效率就越低
1.1所以就出现了一个新的概念 — 数据库
你可以理解为 数据库 是一个可以在一台机器上独立工作的,并且可以给我们提供高效、便捷的方式对数据进行增删改查的一种工具。
如此就帮助我们解决了上面出现的问题,如果将所有的数据都存储在一个独立的机器上,而对用户提供服务的机器只是存放你写的代码。
1.2数据库的优势
1.程序稳定性 :这样任意一台服务所在的机器崩溃了都不会影响数据和另外的服务。 2.数据一致性 :所有的数据都存储在一起,所有的程序操作的数据都是统一的,就不会出现数据不一致的现象 3.并发 :数据库可以良好的支持并发,所有的程序操作数据库都是通过网络,而数据库本身支持并发的网络操作,不需要我们自己写socket 4.效率 :使用数据库对数据进行增删改查的效率要高出我们自己处理文件很多,它会以最少的IO操作去获取你想要的数据,也就是后面要讲的索引的功能
5.数据库的备份,容错,高可用机制等,数据库管理系统也自带这些功能(它管理数据的功能很多,比较强大,也比较成熟,所以大家都用)
6.权限的认证(软件的基本功能是登录注册,用户,用户权限)
2.认识数据库
2.1 数据库的相关概念
1 什么是数据(Data)
描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字、图片,图像、声音、语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机
在计算机中描述一个事物,就需要抽取这一事物的典型特征,组成一条记录,就相当于文件里的一行内容,如:
1 alisa,女,23,河南,oldboy
2 什么是表(Table)
我们可以理解为是一个包含多条记录文件
3 什么是数据库(DataBase,简称DB)
数据库即存放数据的仓库,是长期存放在计算机内、有组织、可共享的数据集合。
数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种 用户共享
其实我们也可以理解为文件夹
4 什么是数据库管理系统
(DataBase Management System 简称DBMS)
在了解了Data与DB的概念后,如何科学地组织和存储数据,如何高效获取和维护数据成了关键
这就用到了一个系统软件---数据库管理系统
如MySQL、Oracle、SQLite、Access、MS SQL Server
mysql主要用于大型门户,例如搜狗、新浪等,它主要的优势就是开放源代码,因为开放源代码这个数据库是免费的,他现在是甲骨文公司的产品。
oracle主要用于银行、铁路、飞机场等。该数据库功能强大,软件费用高。也是甲骨文公司的产品。
sql server是微软公司的产品,主要应用于大中型企业,如联想、方正等。
5 数据库管理员 DBA(DataBase Administrator 简称DBA)
负责数据库管理的专业人员
6 数据库服务器
部署了数据库管理软件的机器
附注:
服务器、数据管理系统、数据库、表与记录的关系
记录:1 朱葛 13234567890 22(多个字段的信息组成一条记录,即文件中的一行内容)
表:userinfo,studentinfo,courseinfo(即文件)
数据库:db(即文件夹)
数据库管理系统:如mysql(是一个软件)
数据库服务器:一台计算机(对内存要求比较高)
总结:
数据库服务器-:运行数据库管理软件
数据库管理软件:管理-数据库
数据库:即文件夹,用来组织文件/表
表:即文件,用来存放多行内容/多条记录
实际的工作中,对于这些名词的使用并不是特别严谨,有人称这个数据管理系统为数据库,有人称这个存放数据的机器叫做数据库,有人称里面的一个存放数据的库叫做数据库 例如: 1.有人问你们公司使用的是什么数据库呀?那他问的意思是使用的哪一种数据库管理系统 2.有人问你这个项目的数据库是哪个?那他的意思是这个项目存放在哪个数据库文件目录下
2.2 数据库的分类
1.关系型数据库
表里的每个字段关系紧密,通过其中任何一个字段都可以查到该条记录
就表之间也存在一定关系的数据库,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式,跟Excel很像)
关系型数据库有:MYSQL Oracle MariaDB SQLite Access SQL Server
1 oracle数据库 Oracle公司是最早开发关系型数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率数一数二 。 Oracle公司是目前全球最大的数据库软件公司,也是近年业务增长极为迅速的软件提供与服务商 主要应用范围:传统大企业、大公司、政府、金融、证券等。 Oracle特点:严谨 安全性高,源码封闭,收费 2 MySQL MySQL被广泛的应用在Internet上的大中小型网站中。由于体积小、速度快、总体拥有成本低,开放源代码 特点:开源,免费,应用广泛 3 MariaDB数据库 MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开元社区维护,采用GPL授权许可。开发这个MariaDB的原因之一是:甲骨文公司收购了MySQL后,有MySQL闭源的潜在风险,因此MySQL开元社区采用分支的方式来避开这个风险。 MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM的存储引擎,它使用了Percona的XtraDB(InnoDB的变体)这个版本还包括了PrimeBase XT (PBXT)和Federated X存储引擎。 4 SQLite数据库 SQLite是一个软件库,实现了自给自足的,无服务器的,零配置的,事务性的SQL数据库引擎,SQLite是一个增长最快的数据库引擎,这是在普及方面的增长,与它的尺寸大小无关.SQLite源代码不受版权限制. 我们后面学到的Django框架,自带一个SQLite,可以直接使用. 5 SQL Server数据库 Microsoft SQL Server是微软公司开发的大型关系数据库系统。SQL Server的功能比较全面,效率高,可以作为中型企业或单位的数据库平台。SQL Server可以与Winodws操作系统紧密集成,不论是应用程序开发速度还是系统事务处理运行速度,都得到较大的提升,对于在Windows平台上开发的各种企业级信息管理系统来说,不论是C/S(客户机/服务器)架构还是B/S(浏览器/服务器)架构。SQL Server都是一个很好的选择。SQL Server的缺点是只能在Windows系统下运行 6 Access数据库 Access是入门级小型桌面数据库,性能安全性都很一般,可供个人管理或小型企业只用 Access不是数据库语言,只是一个数据库程序,目前最新版本为Office 2007,其特点主要如下: (1)完善地管理各种数据库对象,具有强大的数据组织,用户管理、安全检查等功能 (2)强大的数据处理功能,在一个工作组级别的网络环境中,使用Access开发的多用户管理系统具有传统的XSASE(DBASE、FoxBASE的统称)数据库系统所无法实现的客户服务器(Ckient/Server)结构和响应的数据库安全机制,Access具备了许多先进的大型数据管理管理系统所具备的特征。 (3)可以方便地生成各种数据对象,利用存储的数据建立窗体和报表 (4)作为Office套件的一部分,可以与Office集成,实现无缝连接 (5)能够利用Web检索和发布数据,实现与Internet的连接,Access主要适用于中小企业应用系统,或作为客户机/服务器系统中的客户端数据库。
2.非关系型数据库
类似于key-values的存储形式,存取速度快
非关系型数据库有:redis mongodb memcached
1 redis 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客户端,使用方便。 redis特点: 1)支持内存缓存,这个功能相当于memcached 2)支持持久化存储,这个功能相当于memcachedb,ttserver 3)数据库类型更丰富。比其他key-value库功能更强 4)支持主从集群、分布式 5)支持队列等特殊功能 应用:缓存从存取memcached更改存取redis 2 mongodb MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。他支持的数据库结构非常松散,类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongodb最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 特点: 高性能、易部署、易使用、存储数据非常方便 主要功能特性: 1.面向集合存储,易存储对象类型的数据 2.“面向集合”(Collenction-Orented)意思是数据库被分组存储在数据集中,被称为一个集合(Collenction)每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档,集合的概念类似关系型数据库(RDBMS)里的表(table)不同的是它不需要定义任何模式(schema) 3.模式自由 模式自由(schema-free)意为着存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。 4.支持动态查询 5.支持完全索引,包含内部对象 6.支持查询 7.支持复制和故障恢复 8.使用高效的二进制数据存储,包括大型对象 9.自动处理碎片、以支持云计算层次的扩展性 3 memcached Memcaced是一个开源的、高性能的、具有分布式内存对象的缓存系统。通过它可以减轻数据库负载,加速动态的web应用,最初版本由LiveJoumal 的Brad Fitzpatrick在2003年开发完成。目前全球有非常多的用户都在使用它来架构主机的大负载网站或提升主机的高访问网站的响应速度。注意:Memcache 是这个项目的名称,而Memcached是服务端的主程序文件名。 缓存一般用来保存一些进程被存取的对象或数据,通过缓存来存取对象或数据要比在磁盘上存取块很多,前者是内存,后者是磁盘、Memcached是一种纯内存缓存系统,把经常存取的对象或数据缓存在memcached的内存中,这些被缓存的数据被程序通过API的方式被读取,memcached里面的数据就像一张巨大的hash表,数据以key-value对的方式存在。Memcached通过缓存经常被存取的对象或数据,从而减轻频繁读取数据库的压力,提高网站的响应速度,构建出快速更快的可扩展的Web应用。 由于memcached为纯内存缓存软件,一旦重启所有数据都会丢失,因此,新浪网基于Memcached开发了一个开源项目Memcachedb。通过为Memcached增加Berkeley DB的特久化存储机制和异步主复制机制,使Memcached具备了事务恢复能力、持久化数据能力和分布式复制能力,memcached非常适合需要超高性能读写速度、持久化保存的应用场景,但是最近几年逐渐被其他的持久化产品替代如Redis Memcached小结: 1、key-value行数据库 2、纯内存数据库 3、持久化memcachedb(sina)
2.3 数据库管理技术的发展历程(了解)
一 人工管理阶段
20世纪50年代中期以前,计算机主要用于科学计算。
当时的硬件水平:外存只有纸带、卡片、磁带,没有磁盘等直接存取的存储设备
当时的软件状况:没有操作系统,没有管理数据的软件,数据的处理方式是批处理。
人工管理数据具有以下特点:
1 数据不保存:计算机主要用于科学计算,数据临时用,临时输入,不保存
2 应用程序管理数据:数据要有应用程序自己管理,应用程序需要处理数据的逻辑+物理结构,开发负担很重
3 数据不共享:一组数据只对应一个程序,多个程序之间涉及相同数据时,必须各自定义,造成数据大量冗余
4 数据不具有独立性:数据的逻辑结构或物理结构发生变化后,必须对应用程序做出相应的修改,开发负担进一步加大
二 文件系统阶段
20世纪50年代后期到60年代中期
硬件水平:有了磁盘、磁鼓等可直接存取的存储设备
软件水平:有了操作系统,并且操作系统中已经有了专门的数据管理软件,即文件系统;处理方式上不仅有了批处理,而且能够联机实时处理
文件系统管理数据具有以下优点:
1 数据可以长期保存:计算机大量用于数据处理,因而数据需要长期保存,进行增删改查操作
2 由文件系统管理数据:文件系统这个软件,把数据组织成相对独立的数据文件,利用按文件名,按记录进行存取。实现了记录内的结构性,但整体无结构。并且程序与数据之间由文件系统提供存取方法进行转换,是应用程序与数据之间有了一定的独立性,程序员可以不必过多考虑物理细节。
文件系统管理数据具有以下缺点:
1 数据共享性差,冗余度大:一个文件对应一个应用程序,不同应用有相同数据时,也必须建立各自的文件,不能共享相同的数据,造成数据冗余,浪费空间,且相同的数据重复存储,各自管理,容易造成数据不一致性
2 数据独立性差:一旦数据的逻辑结构改变,必须修改应用程序,修改文件结构的定义。应用程序的改变,也将引起文件的数据结构的改变。因此数据与程序之间缺乏独立性。可见,文件系统仍然是一个不具有弹性的无结构的数据集合,即文件之间是孤立的,不能反映现实世界事物之间的内存联系。
三 数据系统阶段
20世纪60年代后期以来,计算机用于管理的规模越来越大,应用越来越广泛,数据量急剧增长,同时多种应用,多种语言互相覆盖地共享数据结合要求越来越强烈
硬件水平:有了大容量磁盘,硬件架构下降
软件水平:软件价格上升(开发效率必须提升,必须将程序员从数据管理中解放出来),分布式的概念盛行。
数据库系统的特点:
1 数据结构化(如上图odboy_stu)
2 数据共享,冗余度低,易扩充
3 数据独立性高
4 数据由DBMS统一管理和控制
a:数据的安全性保护
b:数据的完整性检查
c:并发控制
d:数据库恢复
二 MySQL的下载和安装
mysql为我们提供开源的安装在各个操作系统上的安装包,包括ios,linux,windows。
mysql的下载及安装 —— windows版本 (https://www.cnblogs.com/Ailsa-a/articles/11368879.html)
mysql的下载及安装 —— Linux版本 (https://www.cnblogs.com/Ailsa-a/articles/11368947.html)
mysql的下载及安装 —— Mac版本 (https://www.cnblogs.com/Ailsa-a/articles/11368966.html)
三 MySQL的基本操作
1.用户登陆
mysql管理系统安装好之后会自带一个client端,5.6版本首次登陆不需要密码,直接输入 mysql -uroot -p 提示输入密码时,直接按enter键,可以直接进入
但是我们登陆时完整输入模式为:
mysql -h127.0.0.1 -P3306 -uroot -p
mysql自带的客户端
-h 输入IP地址
-P 输入端口(大写的P)
-u 输入用户名
-p 输入密码
若是本机登录:可写成:mysql -uroot -p
-h127.0.0.1 和 -P3306 可以省略不写
2.密码管理
root用户是管理员用户,拥有最高权限,怎么能没有密码呢?那如何设置密码呢?
方法1(推荐使用)--初次设置密码
mysql -uroot -p # 登录客户端 # 查看当前的用户 select user(); 语法: set password = password('密码') set password = password('123') ; # 利用password函数进行密码加密 也可以写成 set password = '123' # 明文存储,不推荐使用 # 设置密码的完整语法 语法: set password for 用户名@IP = password('密码') set password for root@localhost = password('123') ; # 刷新 flush privileges;
方法2
# mysql中自带一个表叫mysql.user(mysql库中的user表,里面存储了账户和密码,可以直接对表进行操作) update mysql.user set password=password('123') where user='root' and host='localhost'; # 刷新 flush privileges;
方法3
# 首次修改,是没有密码的,所以-p后面是空 mysqladmin -uroot -p password '123' # 若有密码,则可以写成 mysqladmin -uroot -p123 password "1234"
补充:
忘记密码了该怎么办?
方法1
1.关闭mysql服务端 net stop mysql 2.输入mysqld --skip-grant-tables # 以跳过授权表的方式在命令行中启动mysqld服务端 3.再打开一个cmd 输入 mysql -uroot -p 不用输入密码,直接登录 4.重置mysql.user表中的密码 update mysql.user set password=password('123') where user='root' and host='localhost' flush privileges # 对于用户和权限的操作,建议每次都使用刷新 5.停止mysql服务(刚刚是以跳过授权方式启动的,需要关闭,此时是通过mysqld启动,服务端是夯住的,Ctrl+C停止服务) 6.net start mysql 重启服务 7.输入:mysql -uroot -p123 即可登录 # 还有一个方法是直接在配置文件中的[musqld]中写跳过权限认证的命令,用户几乎一样
方法2
1. 关闭mysql 2. 在配置文件my.ini指定的 [mysqld] 下中添加 [mysqld] skip-grant-tables # 只要添加这一行即可 3.启动mysqld 4.在cmd里直接输入mysql登录,然后操作 update mysql.user set password=password('123') where user='root' and host='localhost'; flush privileges; 5.注释my.ini中的skip-grant-tables,然后重新启动myqsld,然后就可以以新密码登录了
3.权限设置
# 创建账号 # 语法: create user 用户名@IP identified by '密码' create user alisa@'192.168.10.%' identified by'123';# 指示网段 create user alisa@192.168.10.5 # 指示某机器可以连接 create user alisa@'%' #指示所有机器都可以连接 # 查看权限 语法: show grants for 用户名@IP show grants for alisa@192.168.10.5; # 查看某个用户的权限 # 远程登陆 mysql -uroot -p123 -h 192.168.10.3 # 给账号授权 语法: grant 权限 on 库名.表名 to 用户名@IP 权限: select(查询) insert(插入) update(更新) delete(删除) all(代表所有权限) # 分配所有权限 grant all on *.* to alisa@'%'; # 分配查询权限 grant select on *.* to alisa@'%'; # 分配 查询和插入权限 grant select,insert on *.* to alisa@'%'; # 刷新使授权立即生效,涉及到权限和用户密码的都刷新就对了 flush privileges; # 创建账号并授权 grant all on *.* to alisa@'%' identified by '123' ; # 删除用户权限 语法: revoke 权限 on 库名.表名 from 用户名@IP revoke all on *.* from alisa@'%'; # 删除用户 语法:drop user 用户名@IP drop user 'alisa'@'192.168.0.%';
四 初识SQL语句
数据库管理系统主要用于管理数据,它相当于是一个server端,接收客户端的请求,然后返回,对于我们的程序而言,则是客户端,发送获取数据的请求,那怎么告诉它我想要什么数据呢?
是不是需要发送一条命令,比如:select * from mysql.user,发送过去,它就接收命令,解析命令,执行命令,并返回结果.这个语言就是SQL,是一个数据库查询和程序设计语言,通过它可以获
取到想要的数据.
SQL : 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
1、DDL(Data Definition Language)语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
2、DML语句(Data Manipulation Language) 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
3、DCL语句(Data Control Language) 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
1.操作文件夹(库)
查: # 查看所有的数据库 show databases; # 查看其中一个数据库 show create database 库名 show create database db1; # 查看数据库编码 show variables like '%char%' 增: # 创建数据库并制定编码 create database 库名 charset 字符编码 create database db1 charset utf8; # 不指定字符编码 create database db1; # 使用数据库 use 库名 use db1; # 查看当前库 select database(); 改: # 修改数据库一般只修改编码 alter database 库名 charset 字符编码 alter database db1 charset utf8; 删: drop database 库名 drop database db1;
2.操作文件(表)
# 先切换到文件夹下:use db1 增: create table 表名(字段1 数据类型[,约束条件],字段2 数据类型[,约束条件],...) create table t1(id int,name char(1)); 查: # 查看当前库下所有的表 show tables; # 查看其中一张表 show create table t1; # 查看一张表的基本信息 desc t1 改: # modify只能修改表的数据类型 alter table t1 modify name char(3); # change 既能修改字段名,又可以修改数据类型 alter table t1 change name name1 char(2); 删: drop table t1;
3.操作文件中的内容(记录)
增: # 严格按照表的字段,一一对应写入,需要写入所有字段 语法: insert into 表名 values(值1,值2) # 插入一条记录 insert into 表名 values(1,'alisa'); # 插入多条记录 insert into 表名 values(1,'alisa'),(2,'alisa1'),(3,'alisa2'); # 指定字段写入 语法: insert into 表名(指定字段1,指定字段2) values (值1,值2) # 插入一条记录 insert into 表名(id,name) values(1,'alisa'); # 插入多条记录 insert into 表名(id,name) values(1,'alisa'),(2,'alisa1'),(3,'alisa2'); 查: 语法: select 字段1,字段2 from 表名;(*代表所有字段,也可指定字段) # 查询所有数据 select * from t1; # 条件查询 select name from t1 where id = 1 改: 语法: update 表名 set 字段 = 新值 where 指定条件 update t1 set name='dsb' where id=2; 删: 语法: delete from t1 where 指定条件,若不指定条件则删除整个表的记录 delete from t1 where id=1; 清空表: delete from t1; # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。 truncate table t1;# 数据量大,删除速度比上一条快,且直接从零开始, *auto_increment 表示:自增 *primary key 表示:约束(不能重复且不能为空);加速查找