day036MYSQL数据库,

本节内容:

1、数据库概述
2、MySQL数据库
参考文章1
参考文章2

一、数据库概述

1、什么是数据库?

百度百科:
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,
用户可以对文件中的数据运行新增、截取、更新、删除等操作。
所谓“数据库”系以一定方式储存在一起、能予多个用户共享、
具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

实质上是一套专门管理数据的软件,让项目程序可以不直接和硬盘打交道,
可以快速的存储和读取数据,
这个数据管理系统我们称之为DBMS,DB(database)就是数据库的意义,
M(manage)就是管理的意思,S(system)就是系统的意思,其实就是英文名的首字符缩写。

2、数据库分类

目前的数据可以分为两大类:关系型数据库和非关系型数据库

1、关系型数据库(RDBMS)

解释:
关系型数据库模型是把复杂的数据结构归结为简单的二元关系
(即二维表格形式,不是excel,但是和excel的形式很像),结合下图来看一下,

2、操作关系型数据库的命令,我们称之为SQL,看解释

结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,
是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。
它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,
所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。
结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

1986年10月,美国国家标准协会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),
1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。
所以,实际上不同数据库系统之间的SQL不能完全相互通用

其中最后一句挺重要的:不同数据库系统之间的SQL不能完全相互通用

3、常用的关系型数据库:

常见的关系型数据库介绍

2.1.1  oracle数据库

Oracle前身叫SDL、由Larry Ellison和两个变成任意在1977创办,他们开发了主机的拳头产品,在市场上大量销售。
Oracle公司是最早开发关系型数据库的厂商之一,其产品支持最广泛的操作系统平台。
目前Oracle关系数据库产品的市场占有率数一数二 。
Oracle公司是目前全球最大的数据库软件公司,也是近年业务增长极为迅速的软件提供与服务商
主要应用范围:传统大企业、大公司、政府、金融、证券等。
版本升级:oracle8i,oracle9i,oracle10g,oracle11g,oracle12c

2.1.2  MySQL

MySQL被广泛的应用在Internet上的大中小型网站中。
由于体积小、速度快、总体拥有成本低,开放源代码

2.1.3  MariaDB数据库

MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开元社区维护,采用GPL授权许可。
开发这个MariaDB的原因之一是:甲骨文公司收购了MySQL后,有MySQL闭源的潜在风险,
因此MySQL开元社区采用分支的方式来避开这个风险。

MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM的存储引擎,
它使用了Percona的XtraDB(InnoDB的变体)这个版本还包括了PrimeBase XT (PBXT)和Federated X存储引擎。

2.1.4 SQL Server数据库

Microsoft SQL Server是微软公司开发的大型关系数据库系统。
SQL Server的功能比较全面,效率高,可以作为中型企业或单位的数据库平台。
SQL Server可以与Winodws操作系统紧密集成,不论是应用程序开发速度还是系统事务处理运行速度,都得到较大的提升,
对于在Windows平台上开发的各种企业级信息管理系统来说,不论是C/S(客户机/服务器)架构还是B/S(浏览器/服务器)架构。
SQL Server都是一个很好的选择。SQL Server的缺点是只能在Windows系统下运行

2.1.5  Access数据库

Access是入门级小型桌面数据库,性能安全性都很一般,可供个人管理或小型企业只用
Access不是数据库语言,只是一个数据库程序,目前最新版本为Office 2007,其特点主要如下:
(1)完善地管理各种数据库对象,具有强大的数据组织,用户管理、安全检查等功能
(2)强大的数据处理功能,在一个工作组级别的网络环境中,
使用Access开发的多用户管理系统具有传统的XSASE(DBASE、FoxBASE的统称)数据库系统所无法实现的客户服务器(Ckient/Server)结构和响应的数据库安全机制,
Access具备了许多先进的大型数据管理管理系统所具备的特征。
(3)可以方便地生成各种数据对象,利用存储的数据建立窗体和报表
(4)作为Office套件的一部分,可以与Office集成,实现无缝连接
(5)能够利用Web检索和发布数据,实现与Internet的连接,Access主要适用于中小企业应用系统,或作为客户机/服务器系统中的客户端数据库。

2.1.6  其他不常用关系型数据库

DB2,PostgreSQL,Informix,Sybase等。这些关系型数据库逐步的淡化了普通运维的实现,特别是互联网公司几乎见不到
Python

2、非关系型数据库

非关系型数据库也被成为NoSQL数据库,NOSQL的本意是“Not Olnly SQL”

指的是非关系型数据库,而不是“No SQL”的意思,因此,NoSQL的产生并不是要彻底地否定关系型数据库,
而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。

高性能、高并发、对数据一致性要求不高

  开源的NoSQL体系,如Facebook的Cassandra,Apache的HBase,也得到了广泛认同,
Redis,mongb也逐渐越来越受到各类大中小型公司的欢迎和追捧

1、NOSQL非关系型数据库小结:

1、NOSQL不是否定关系数据库,而是作为关系数据库的一个重要补充

  2、NOSQL为了高性能、高并发而生,忽略影响高性能,高并发的功能
  3、NOSQL典型产品memcached (纯内存),redis(持久化缓存),mongodb(文档的数据库

2、非关系型数据库又分为以下4种:

非关系数据库分类

1)键值(Key-Value)存储数据库

  键值数据库就类似传统语言中使用哈希表,可以通过key来添加、查询或删除数据,
  因为使用key主键访问,所以会获得很高的性能及扩展性
  键值(Key-Value)数据库主要是使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
  Key/value模型对于IT系统来说的优势在于简单、易部署、高并发
        k1—>数据
        k2—>数据
   典型产品:Memcached、Redis、MemcacheDB、BerkeleyDB

(2)列存储(Column-oriedted)数据库 ======>了解即可,一般公司用不到
   这部分数据库通常用来分布式存储的海量数据,键仍然存在,但是他们的特点是指向了多个列。
        典型产品:Cassandra,HBase

(3)面向文档(Document-Oriented)数据库
   面向文档数据库会将以文档的形式存储。每个文档都是自包含的数据单元,是一系列数据项的集合。
   每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;
   也可以是复杂的类型,如有序列表和关系对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,
   数据可以使用XML、JSON或者JSONB等多种形式存储
   典型产品:MorgoDB、CouchDB

(4)图形(Graph)数据库
Python

3、常见的非关系型数据库

常见的非关系型数据库介绍

2.2.1  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)

2.2.2  Redis(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

2.2.3  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.自动处理碎片、以支持云计算层次的扩展性
2.2.4  Cassandra(Column-oriented)

  Apache Cassndra是一套开源分布式Key-Value存储系统。
    它最初由Facebook开发,用于存储特别大的数据。Facebook目前在使用此系统。
主要特点:

  1.分布式
  2.基于column的结构化
  3.高伸展性
  4.Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成一个分布式网络服务,
    对Cassandra的一个写操作,会被复制到其他节点上去,对Cassandra的读操作。也会被路由到某个节点上面去读取。
  Cassandir是一个混合型的非关系的数据库,类似于Google的BigTable。
    其主要功能比Dynomie(分布式的key-value存储系统)更丰富,Cassandra最初由Facebook开发,后转变成了开源项目。

2.2.5  其他不常用非关系型数据库

  HBase、MemcacheDB、BerkeleyDB、Tokyo CabinetTokyo Tyrant(ttserver)
  ttserver 持久化输出,缺点存储2千万条 性能下降(由日本人发明)
Python

先学好MySQL数据库

二、MySQL介绍

1.mysql版本

双授权版本:社区版(完全免费,功能也够nb了)和商业版
(更好,功能更多更强大一些,但是收费,VIP,有售后服务,
也会参考和吸收社区版的一些nb的功能,安全性和稳定性都是最好的,大几十万),一般NB的开源软件都是双授权的

1.每个版本又分四个版本依次进行发布:

Alpha版:一般只在开发公司内部使用,不对外公开,测试、自我检查的版本
Beta版:一般是开发完也测试完的版本,一般不会出现比较大的性能bug(一般我们不用,阿里、去哪儿会使用这个版本,有些新功能,内部有高手能调,也能评估新功能的性能)
RC版:根据Beta版测试之后收集到一些bug等在进行完善的一个版本
GA版:软件正式发布的版本,没有特别的需求一定要使用GA版,有些公司追求新功能会使用Beta版,这是个例。

2.MySQL的产品线:(mysql是C++写的,oracle 9i版本之前是C语言写的,之后主要是java)

最早期,mysql是按照3.x--4.x--5.x等来开发的,但是为了提高MySQL的竞争优势,以及提高性能、降低开发维护成本等原因,
同时,更方便企业用户更精准的选择合适的版本产品用于自己的企业生产环境中,MySQL在发展到5.1系列版本之后,重新规划为三条产品线。

  第一条:5.0.xx 到 5.1.xx产品线系列介绍
  第二条:5.4.xx 到 5.7.xx产品线系列介绍(主流:5.5和5.6)
  第三条:6.0.xx 到 7.1.xx产品线系列介绍

3. MySQL数据库软件命名介绍

以mysql-5.6.42.tar.gz的版本号来解释:
1.第一个数字5是主版本号,描述了文件格式。所有版本5发行都有相同的文件格式。
2.第二个数字6是发行级别。主版本号和发行级别组合到一起便构成了发行序列号。
3.第三个数据42是在此发行系列的版本号,随每个新发布版递增。
通常你需要已经选择发行的最新版本,每次更新后,版本字符串的最后一个数字会递增。
如果增加了一些新功能或者微小的不兼容性,版本字符串的第二个数字会递增。
如果文件格式改变,第一个数字会递增。

一般有的版本也会加上上面我们说的4个版本的后缀,beta、alpha、rc版、ga版等等,
我们举得这个例子是不带后缀的,就相当于GA版

4.1 MySQL版本选择建议

1.稳定版:选择开源的社区版的稳定版GA版本
2.产品线:可以选择5.1、5.5、5.6,互联网公司主流5.5和5.6,其次是5.1.
3.选择MySQL数据库GA版发布后6个月以上的GA版本。
4.要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本
5.最好向后较长时间没有更新发布的版本。
6.开发、测试、运维、DBA进行自己本地测试的时候,最好要和线上的版本一致,最差也要兼容,所以作为开发,你要清楚公司用的哪个版本的数据库
7.作为内部开发测试数据库环境,跑大概3-6个月的时间。
8.优先企业非核心业务采用新版本的数据库GA版本的软件。
9.向DBA高手请教,或者在技术分为好的群里和大家一起交流,使用真正高手用过的好用的GA版本产品

经过上述工序后,若没有重要的功能BUG或者性能瓶颈,则可以开始考虑作为任何业务数据服务的后端数据库软件。

三、MySQL的使用

1、mysql安装

如果你在mysql官网下载的是zip压缩包,就是免安装的,

mysql下载地址

1、mysql安装的简单总结:

win10下安装mysql

#1、下载:MySQL Community Server 5.7.16
http://dev.mysql.com/downloads/mysql/

#2、解压
如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:mysql-5.7.16-winx64

#3、添加环境变量
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》
【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】

#4、初始化
mysqld --initialize-insecure

#5、启动MySQL服务
mysqld # 启动MySQL服务

#6、启动MySQL客户端并连接MySQL服务

mysql -u root -p # 连接MySQL服务器
连接指令是:mysql -h 服务端IP地址 -P(大写) 3306(mysql服务端默认端口) -uroot(用户,这里我使用root用户来测了) -p密码
。注意:如果这样直接输入密码的话,密码和前面的-p中间不要有空格。

我自己在本机进行测试的,所以我写的mysql服务端的IP地址为我本机的回环地址127.0.0.1,
其实如果是自己测试本机的mysql服务端,我们可以不用写ip地址和端口的,
直接写mysql -uroot -p,但是连接别的电脑的mysql的时候一定要写IP地址和端口,
并且不能用root用户去远程连接别的电脑的mysql服务端,并且要注意mysql服务器上的防火墙是否允许3306能够被外人连接,
如果想让别人连,要更改防火墙设置,让他允许3306端口被连接,或者直接关闭防火墙(不建议直接关闭,测试的时候可以用),否则会报错。


#7、将mysql添加系统服务
    若这里报错1067
    解决方法:
        其中一个方法,关掉mysql.exe, 删除安装路径data下的ib_logfile()和ib_logfile1文件
    注意:--install前,必须用mysql启动命令的绝对路径
    # 制作MySQL的Windows服务,在终端执行此命令:
    "c:mysql-5.7.16-winx64inmysqld" --install

    # 移除MySQL的Windows服务,在终端执行此命令:
    "c:mysql-5.7.16-winx64inmysqld" --remove

    注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
    # 启动MySQL服务
    net start mysql

    # 关闭MySQL服务
    net stop mysql
  添加了系统服务后,我们在启动和关闭这个mysql服务,就可以在cmd窗口下使用两个指令就搞定了:

  启动指令:net start mysql

  关闭指令:net stop mysql

   并且不能再使用 mysqld指令直接启动了。

 还可以通过指令来移除刚才添加的系统服务:

 cmd下移除服务命令为:mysqld remove
Python

2、关闭的方式有两种:

1.通过任务管理器来关闭服务端:
2.通过cmd指令来关闭mysql服务端

3、linux下安装mysql

linux下安装mysql

1.解压tar包
cd /software   #cd到一个自己创建的文件夹中
tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz  #解压下载下来的mysql文件,如果没在这个文件夹中,记得把文件移动到这个文件夹中,通过mv指令
mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21 #通过mv指令给这个解压出来的文件改了个名字

2.添加用户与组
groupadd mysql        #添加用户组
useradd -r -g mysql mysql  #创建mysql用户,并添加到mysql用户组
chown -R mysql:mysql mysql-5.6.21  #这是mysql用户和mysql用户组的归属
chmod +x -Rf /usr/local/mysql    #赐予可执行权限

3.安装数据库
su mysql
cd mysql-5.6.21/scripts
./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data  #使用mysql用户来将我们下载并解压的那个mysql文件,安装到/software/mysql-5.6.21/data这个目录里面

4.配置文件
cd /software/mysql-5.6.21/support-files  #配置文件在这个目录下
cp my-default.cnf /etc/my.cnf  #copy一份my-default.cnf文件到etc目录下,并起名为my.cnf文件
cp mysql.server /etc/init.d/mysql  #copy一份mysql.server文件,到etc的init.d的mysql文件夹中,启动加载的初始配置文件会有一部分在这个目录里面读取
vim /etc/init.d/mysql   #若mysql的安装目录是/usr/local/mysql,则可省略此步
修改文件中的两个变更值
basedir=/software/mysql-5.6.21  #基础目录
datadir=/software/mysql-5.6.21/data  #数据目录

5.配置环境变量
vim /etc/profile  #环境变量的配置文件 ,添加下面两行
export MYSQL_HOME="/software/mysql-5.6.21"
export PATH="$PATH:$MYSQL_HOME/bin"
#使配置生效,通过source指令
source /etc/profile

6.添加自启动服务
chkconfig --add mysql
chkconfig mysql on

7.启动mysql
service mysql start

8.登录mysql及改密码与配置远程访问
mysqladmin -u root password 'your_password'     #修改root用户密码
mysql -u root -p     #登录mysql,需要输入密码
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;

#允许root用户远程访问(默认远程连接是不能使用root用户来连接的)
mysql>FLUSH PRIVILEGES;     #刷新权限

9. 一些必要的初始配置(除了下面这些,将来玩mysql的时候还有很多很多的配置)
1)修改字符集为UTF8
vi /etc/my.cnf
在[client]下面添加 default-character-set = utf8
在[mysqld]下面添加 character_set_server = utf8
2)增加错误日志
vi /etc/my.cnf
在[mysqld]下面添加:
log-error = /usr/local/mysql/log/error.log
general-log-file = /usr/local/mysql/log/mysql.log
3) 设置为不区分大小写,linux下默认会区分大小写。
vi /etc/my.cnf
在[mysqld]下面添加:
lower_case_table_name=1

修改完重启:#service  mysql  restart

在linux上使用mysql的时候,一定要注意的就是权限问题,linux恶心的地方就是权限问题。
Python

3、mysql的简单使用演示

简单命令演示

这里只是给大家演示一下mysql是个什么样子,具体怎么管理数据,后面我们会学,这里只做演示用,
因为演示一下之后,你对这个东西就有了一些简单的认识和了解,再进行后面的学的时候,你就不会摸着黑听理论了,
所谓的瞎听了,哈哈。注意,我们下面会输入一些指令进行操作数据库,数据库里面的指令必须要用;分号结尾,然后才能执行,切记。

1.开启服务端,mysqld net start mysql

2.使用mysql自带的客户端进行连接,cmd下输入mysql -u root -p,
然后回车,会提示你输入密码,此时初始的root用户还没有密码,所以还是直接回车就可以连接上了

3.show databases;先不讲里面的内容,说一下这是几个库,
每个项目可以有自己单独的一个库,里面放这个项目的所有数据表

4.创建一个库:create database CRM;然后show databases;查看一下就有了这个crm库,
不分大小写,统一会变成小写,对照着我们mysql安装目录下的data文件夹里面的内容看一下,库就是对应的文件夹。

5.我们目前在所有数据库之上,想在我们自己项目的库里面操作数据,
就需要切换到我们自己这个crm项目的库里面进行数据的操作,切换数据库使用use + 库名,
例如:use crm;就提示你切换成功了。

6.我们说过,库里面维护的数据就像一张一张的数据表,
类似excel,对不对,那我们创建一张表看一下,命令:
      create table student(
        id int,
        name char(10),
        age int,
      );
7.再执行show tables;就可以看到有了一个student表

8.查看一下这个表里的数据select * from student;发现什么数据也没有

9.插入几条数据,写几条数据:insert into student values(1,'d',18),(2,'x',11),(3,'d',10),(4,'k',9);
然后回车,就执行了这条指令,然后我们再查看一下这个表里面有没有数据了,
执行上一条指令,select * from student;发现里面就有数据了:
        结果:
        mysql> select * from student;
        +------+------+------+
        | id | name | age |
        +------+------+------+
        | 1 | d | 18 |
        | 2 | x | 11 |
        | 3 | d | 10 |
        | 4 | k | 9 |
        +------+------+------+
        4 rows in set (0.00 sec)
Python

1、分析一下:

上面这些就是mysql数据帮我们保存的数据,以表格的外貌展示,第一行为表头,从第二行开始都是对应的数据,
每列都是自己这一列规定的内容,比如id这一列是你插入的这几条数据的id,
我们这个insert就是插入数据,select就是查看数据,
这就是我们通过MySQL自带的客户端来操作的MySQL服务端来进行数据的操作。

MySQL服务端和操作系统及硬盘打交道,快速的帮你实现数据的操作,
其他的语言开发的客户端就是通过这种形式来操作数据库里面的数据的,将来我们使用python操作数据库的时候,
会使用一个叫做pymysql的工具来搞,到时候会给你们讲,他就是一个咱们MySQL服务器的客户端,
连接上服务端就可以操作服务端的保存的你的项目的数据了。
例如用户要查看自己的信息,就通过你写的程序接受到客户的请求,通过自己的mysql客户端去MySQL服务端查看对应的信息,
然后mysql服务端将这些信息发送给你的py程序客户端,你通过程序再将数据返回给你的用户,你的用户就看到了自己的信息,就是这么个过程,大家理解了吗。

真正的数据库维护优化等高级数据库的技术一般都是由公司的DBA来做,或者由比较懂数据库的运维来做,
一般不会让开发来搞,除非你开发人员的数据库能力很强,
这些NB的技术包括:数据库优化,数据库BUG解决,数据库备份(冷备、热备),保证数据不丢失,集群,
高可用等等保证项目的稳定性和可用性及高并发用(很多的用户都来操作数据,你要并发),数据库各项配置参数的调优,
慢sql语句的提炼和调优,数据库开发、数据库更新,数据迁移,数据恢复,分库分表等等,这些是数据库的高端技术,

而针对开发人员,一般你需要学习这些:基本的开发环境使用的数据库搭建,然后增删改查就差不多了。

当然如果想提升自己的能力和水平(还有薪资水平),数据库是你必须要学好的内容,但是那是你做开发之后的事情了,
而且有好多同学目前已经在数据库或者运维方面很NB了,但是开发还不行啊,对不对,哈哈,
好好学python,数据库不是你学习python的重点,但是必须要会一些基本的内容,懂得越多越好,ok吗,
Python

4、MySQL安装目录介绍

看图:

其中,我们重点看一下data文件夹:



关于数据库中的这4个初始的库的详细介绍,有兴趣的同学可以来看看我的这篇文章(目前作为了解用):
4个初识库详细介绍链接

3、其中mysql这个库我需要提一下:

mysql:这个是mysql整个服务的核心数据库,类似于sql server中的master表,
主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。
不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。

总结:其实这些库就是我们电脑上对应的文件夹,在mysql中显示为对应的库,来方便我们管理数据,
而文件或者文件夹这种与硬盘打交道的事情就交给mysql了,
我们只需要对mysql库中的数据进行操作就可以了,
你可以看到,我们刚才简单使用的时候创建的一个crm库,也就是在data目录下的生成了一个crm文件夹。

说到这里,大家对数据库有个基本的了解了呢。那么我们返回去看一下mysql的一些其他知识(提高逼格的内容~~),回到数据库分类及mysql介绍~~~~~
Python

5、root用户密码设置及忘记密码的解决方法

再怎么说我们的root用户密码也不能为空啊对不对,所以需要设置一个密码,
看下面设置密码的方法,我给了三种方法:

方法1: 用SET PASSWORD命令

首先登录MySQL,使用mysql自带的那个客户端连接上mysql。
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');

方法2:用mysqladmin

(因为我们将bin已经添加到环境变量了,这个mysqladmin也在bin目录下,
所以可以直接使用这个mysqladmin功能,使用它来修改密码)
关于mysqladmin的介绍:是一个执行管理操作的客户端程序。
它可以用来检查服务器的配置和当前状态、创建和删除数据库、修改用户密码等等的功能,
虽然mysqladmin的很多功能通过使用MySQL自带的mysql客户端可以搞定,但是有时候使用mysqladmin操作会比较简单。

  格式:mysqladmin -u用户名 -p旧密码 password 新密码
  例子:mysqladmin -uroot -p123456 password 123

只用mysqladmin的时候,会出现一个warning警告信息:Warning: Using a password on the command line interface can be insecure.,
这个没关系,是提示你,你直接在cmd下使用明文设置密码的时候,
是不安全的,因为别人可以通过翻看你输入指令的历史记录来查看到你设置的密码,
所以提示你一下,不信你按上下键,可以看到自己之前输入的命令,或者输入下面这个指令也可以看到:
或者用doskey/history查看历史命令

所以我们最好连接进入到mysql里面之后,在进行密码的修改和设置。
Python

6、修改字符集编码(使用前一定要统一)

一开始编码并没有统一,在开始建立数据库的时候一定要注意这个问题,
建立统一的字符集编码,因为数据库一旦建立,是没有办法修改字符集编码的。

1、一开始创建库时,mysql会默认指定一个字符集:latin1,

fe:看一下各个角色的编码(客户端、服务端,数据库等等):

在mysql中执行指令:show variables like '%char%';看结果:
      mysql> show variables like "%char%";
      +--------------------------+-------------------------------------------+
      | Variable_name | Value |
      +--------------------------+-------------------------------------------+
      | character_set_client | gbk |  # 网络连接的客户端
      | character_set_connection | gbk |  #双方连接也是gbk编码的,这个不用管
      | character_set_database | latin1 |  # 数据库默认是Latin1
      | character_set_filesystem | binary |
      | character_set_results | gbk |
      | character_set_server | latin1 |  # 服务端默认是Latin1
      | character_set_system | utf8 |
      | character_sets_dir | F:jjmysql-5.6.42-winx64sharecharsets |
      +--------------------------+-------------------------------------------+
      8 rows in set (0.00 sec)
Mysql

关于上面这些编码的详细解释,

2、出现乱码的原因:

因为客户端mysql的字符集和服务端的字符集不一样,
注意一下其中的character_set_client、character_set_connection、character_set_results这三项,
我们在这里可以简单称为客户端三炮,就是因为这三炮和服务端的编码不一致导致的,
所以我们需要将这三项改为和服务端一致的字符集就可以了。

3、第一种方法:临时修改客户端三项

临时修改客户端三炮的字符集,让客户端插入数据的时候按照服务端的字符集编码来插入数据,然后我们再插入一条数据,然后看效果:

总结:在进行DQL和DML语句(关于DQL和DML的解释我们后面会讲的,
你就理解为一些sql语句)之前,先执行set names latin1;
但是我们如果断开连接,退出数据库之后,在连接进来以后,
插入数据时如果不执行set names latin1,还是会乱码,说明这句指令没有让字符集永久生效

4、在配置文件里面修改客户端和服务端参数,可以实现set names latin1;的效果,并且永久生效

如果你的安装目录里面没有这个文件并且没有在其他地方设置,那么mysql就会按照自己默认的配置参数来运行,
我们可以通过写一个my.ini文件来指定,mysql运行起来时会读取这个my.ini文件中的一些配置,其中就可以配置指定字符集。

之前我们用root用户连接输入库的命令是这样的:
C:Userschao>mysql -uroot -p
Enter password: ***

可是配置my.ini文件,永久设定编码集

用my.ini永久设置编码

#强调:配置文件中的注释可以有中文,但是配置项中不能出现中文
#在mysql的解压目录下,新建my.ini,然后配置
  #1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效
    [mysqld]

    character_set_server=utf8
    collation-server=utf8_general_ci  #就是一个校对规则,一般默认都是这个,如果不是就改成这个就可以了,所以直接写上就行了,这个规则后面我们会讲的~~~

  #2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效
    [client]
    default-character-set=utf8

  #3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置
    [mysql]
    user=root
    password=666
    default-character-set=utf8

  #如果没有[mysql],则用户在使用mysql系统自带的mysql客户端来执行mysql命令时的配置以[client]为准

  重启mysql服务,让配置文件生效:
    C:WINDOWSsystem32>net stop mysql
    MySQL 服务正在停止..
    MySQL 服务已成功停止。

    C:WINDOWSsystem32>net start mysql
    MySQL 服务正在启动 .
    MySQL 服务已经启动成功。

  然后连接进入mysql,再次查看编码:
    C:Userschao>mysql -uroot -p
    Enter password: ***
    mysql> show variables like "%char%";
    +--------------------------+-------------------------------------------+
    | Variable_name | Value |
    +--------------------------+-------------------------------------------+
     | character_set_client | utf8 |
    | character_set_connection | utf8 |
    | character_set_database | utf8 |
    | character_set_filesystem | binary |
    | character_set_results | utf8 |
    | character_set_server | utf8 |
    | character_set_system | utf8 |
    | character_sets_dir | F:jjmysql-5.6.42-winx64sharecharsets |
    +--------------------------+-------------------------------------------+
    8 rows in set (0.00 sec)
Python

5、总结

如果库在编码统一之前,就已经创建了,那么后面的统一编码,将对其不起作用。

如果将来你们公司使用的数据库的编码确实有问题,并且和你们现在要使用的编码不一致,
那么就需要使用第一种临时修改字符集的方式来插入和查询数据,没办法,要不然就要重塑数据库,将编码调节好。

不乱码的思想:系统的编码、客户端、服务端、库、表、列,这几项的编码都要统一才不会出现乱码的情况。

7、初识sql语句

有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写。

  mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的客户端,
或者其他模块来连接到mysqld,然后使用mysql软件规定的语法格式去提交自己命令,实现对文件夹或文件的管理。
该命令的语法即sql(Structured Query Language 即结构化查询语言),
sql语句又分为几类,具体看博客:
主要分为4中,DDL、DQL、DML、DCL。

1、SQL语句主要是针对数据库里面三个角色进行操作

对象是:库、表、行,操作包括:增删改查

1、库

(data文件夹中的文件夹,每创建一个库,这个库的名称就是文件夹的名称,文件夹里面保存着一些这个库相关的初始信息)
增:create database db1 charset utf8; #创建一个库,可以指定字符集

查:show databases; #查看数据库中所有的库

show create database db1; #查看单独某个库db1的信息

改:alter database db1 charset latin1;
#修改库的字符集,注意语句的格式(其他语句也是这么个格式),
alter(修改) database(修改数据库) db1(哪个数据库) charset(字符集) latin1(改成哪个字符集)

删除: drop database db1; #删除数据库
Mysql

2、表(操作文件,表是上面库文件夹里面的文件)

先切换库:use db1; #要操作表文件,要先切换到对应的库下才能操作表

查看当前所在的是哪个库:select database();

增:create table t1(id int,name char(10) );
#创建表的时候,和excel一样,需要有字段啊,每个字段还需要只能一下这个字段数据的格式,
这里指定的是两个字段列,id和name列,id和name是列名(字段名),
id 后面的int的意思说id这一列中的数据只能是int类型的,name后面的char的意思是,
name这一列中的数据只能是char类型的(char表示定长字符串类型),
char里面的10是说这个字段的长度最长为10个字符,
如果不指定这个长度,默认长度是1,注意是字符而不是字节,
这些字段的内容我们后面会详解,这里知道一下就好啦。

#在创建表的时候,我们去看一下mysql安装目录里面的data文件夹里面的db1文件夹里面的文件,
然后我们执行创建表的指令,看看db1文件夹里面的变化,多了两个文件,分别是:db1.frm,db1.ibd文件,
创建了一张表为什么会多了两个文件呢,这两个文件都是啥呢?看解释(里面涉及到存储引擎,关于存储引擎我们后面会讲的~~):  

解释

1.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息

2.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息;

3.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,
主要是存储采用独立表储存模式时存储的数据信息;

4.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;

5.ibdata1文件:主要作用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。
    从上面可以看出,.ibd储存的是数据信息和索引信息,ibdata1文件也是存储数据信息和索引信息,
    .MYD和.MYI也是分别储存数据信息和索引信息,那他们之间有什么区别呢?

    主要区别是再于数据库的存储引擎不一样,如果储存引擎采用的是MyISAM,
    则生成的数据文件为表名.frm、表名.MYD、表名的MYI;而储存引擎如果是innoDB,
    开启了innodb_file_per_table=1,也就是采用独立储存的模式,生成的文件是表名.frm、表名.ibd,
    如果采用共存储模式的,数据信息和索引信息都存储在ibdata1中;

    在进行数据恢复的时候,如果用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去即可。
    但是如果是innodb的话,则每一个数据表都是一个单独的文件,只将相应的.frm和.ibd文件拷贝过去是不够的,
    必须在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。

msyql人家设定的规则就是这样存储表的,使用人家的系统,就要理解人家的规则。
Python
查:show tables;  #查看当前库中所有的表

show create table t1; #查看单表的创建信息

#还可以通过下面两句来查看表信息,以表格的形式展示结果:

desc t1;

describe t1;#上下这两句是一样的结果

改:alter table t1 modify name char(3);  #修改字段属性的,将name字段的char长度改为3,改完之后我们在用上面的show create table t1;desc t1;describe t1;来查看一下修改结果。

alter table t1 change name name1 char(2);

删:drop table t1;
Mysql

3. 行(操作文件(表)中的内容/记录)(*****将来的重中之重)

增:insert into t1 values(1,'dsb1'),(2,'dsb2'),(3,'dsb3'); #往t1表中插入三行数据,
注意你插入的每行内容都要和你创建表的时候的字段个数和字段属性对应好,注意每行数据以逗号分隔。

insert后面的into可以不用写。

查:select * from t1; #查看t1表中所有字段的数据,select 字段 from 表。
原文地址:https://www.cnblogs.com/yipianshuying/p/10073108.html