Python 中MySQL的用法以及基础的命令行操作MySQL。

MySQL

一.数据库管理软件的由来:

1.==数据想要永久的保存,需要保存于文件中,这个是毫无疑问的。==但是像一般的存储方式都是针对机器去存储的。(以前都是一个文件存放在所对应的机器,电脑上。

2.我们如果接触到多个组件分布在多台计算机上运行但是还是需要访问同一个文件的情况下。那我们就需要考虑到是不是需要,专门将文件存储在一个计算机上,这个涉及到了多用户查询,也需要我们由专门的程序去接收和返回数据,这就引出了我们的MySQL数据库管理软件了。

1、程序所有的组件就不可能运行在一台机器上

因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器机器的性能总归是有限的,受限于目前的硬件水平,就一台机器的性能垂直进行扩展是有极限的。

于是我们只能通过水平扩展来增强我们系统的整体性能,这就需要我们将程序的各个组件分布于多台机器去执行。

2、数据安全问题

根据1的描述,我们将程序的各个组件分布到各台机器,但需知各组件仍然是一个整体,言外之意,所有组件的数据还是要共享的。但每台机器上的组件都只能操作本机的文件,这就导致了数据必然不一致。

于是我们想到了将数据与应用程序分离:把文件存放于一台机器,然后将多台机器通过网络去访问这台机器上的文件(用socket实现),即共享这台机器上的文件,共享则意味着竞争,会发生数据不安全,需要加锁处理。。。。

3、并发

根据2的描述,我们必须写一个socket服务端来管理这台机器(数据库服务器)上的文件,然后写一个socket客户端,完成如下功能:

1.远程连接(支持并发)
2.打开文件
3.读写(加锁)
4.关闭文件

总结:

我们在编写任何程序之前,都需要事先写好基于网络操作一台主机上文件的程序(socket服务端与客户端程序),于是有人将此类程序写成一个专门的处理软件,这就是mysql等数据库管理软件的由来,但mysql解决的不仅仅是数据共享的问题,还有查询效率,安全性等一系列问题,总之,把程序员从数据管理中解脱出来,专注于自己的程序逻辑的编写。

二 数据库概述

MySQL:数据库管理软件,本质就是一个套接字程序;

库:文件夹

表:文件

字段:标题

记录:文件中的一行内容

数据库管理系统:如mysql(是一个软件)

数据库服务器:一台计算机(对内存要求比较高)

2.1 数据库管理软件分类

分两大类:
  关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用
  非关系型:mongodb,redis,memcache

可以简单的理解为:
    关系型数据库需要有表结构
    非关系型数据库是key-value存储的,没有表结构

三.忘记密码

linux平台下,破解密码的两种方式

[root@egon ~]# rm -rf /var/lib/mysql/mysql #所有授权信息全部丢失!!!
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
[root@egon ~]# vim /etc/my.cnf    #mysql主配置文件
[mysqld]
skip-grant-table
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q
[root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql -u root -p123 #以新密码登录

windows平台下,5.7版本mysql,破解密码的两种方式:

#1 关闭mysql
#2 在cmd中执行:mysqld --skip-grant-tables
#3 在cmd中执行:mysql
#4 执行如下sql:
update mysql.user set authentication_string=password('') where user = 'root';
flush privileges;

#5 tskill mysqld #或taskkill -f /PID 7832
#6 重新启动mysql
#1. 关闭mysql,可以用tskill mysqld将其杀死
#2. 在解压目录下,新建mysql配置文件my.ini
#3. my.ini内容,指定
[mysqld]
skip-grant-tables

#4.启动mysqld
#5.在cmd里直接输入mysql登录,然后操作
update mysql.user set authentication_string=password('') where user='root and host='localhost';

flush privileges;

#6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了

四 统一字符编码

步骤一:

找到所解压的目录表,找到 my-default.ini 文件。

步骤二:

复制文件 my-default.ini 修改名称为 my.ini 。

步骤三:

双击打开文件,添加相关配置。

[client]
default-character-set = utf8mb4
 
[mysql]
default-character-set = utf8mb4
 
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

步骤四:

重启MySQL,进行存储操作。(可存贮表情包。)

五 MySQL语句:

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

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

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
#1、DDL语句    数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
#2、DML语句    数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
#3、DCL语句    数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

1.库操作:文件夹

我们对库进行操作就是在操作文件夹

文件夹可以创建,但是需要指定编码存储格式

增:create database db1 charset utf8; #编码格式:charset utf8
                  #文件名称:db1

我们也可以文件夹,有两种查找方式

查:show databases;  #如果文件显示很大请在后面加上\G
        #针对目录下文件查询,也就是查看目录下那些文件夹。 
        #要注意:文件夹创建了以后在文件夹下就会有一个文件,那个文件是配置文件,形容文件夹的编码格式等等。
查:show create database db1\G;  #这个是加了\G的。
        # 查询的是针对文件名,来查询文件的编辑代码,例如我们可以看到是什么编码存储格式的。

我们可以对文件夹进行修改

注意:我们不能够修改文件夹的名称,只能修改文件夹的编码存储格式。

改:alter database db1 charset gbk; # 指定修改的编码格式
                 #所要修改的文件夹名字

我们也可以对文件夹进行删除

删除: drop database db1;
                  #所需要删除的文件夹名称。

2.表操作:文件

需要注意的是:我们在对表进行操作的时候必须要进入对应的文件夹下去进行,增删改查操作

**切换文件夹:use db1; **

use db1;  #db1指的是目标库,也就是目标文件夹,目标的意思就是在这个文件夹下进行操作:
#创建表之前我们需要先切到具体的文件夹下进行创建表,否则创建的时候mysql不知道你要在哪个文件夹下创建文件就会报错,当然你也可以在创建的表前指定数据库名
select database(); #查看当前所在的库(文件夹)  
#可以当前创建的表是在哪个表下进行创建的

结果查看:

mysql> use db1;
Database changed
mysql> select database();#查看在哪个文件夹目录下的操作。
+------------+
| database() |
+------------+
| db1        |
+------------+
1 row in set (0.00 sec)

mysql>

创建表:也就是创建文件

需要注意的是,创建表,我们需要注意格式是什么

也就是说我们需要设置,例如:id,name 后面需要加上类型,完整示例:==id int,name char(x)==x:是我们来指定字符串长度。

增:create table t1(id int,name char);#创建表一定要指定字段的类型,而且字段不能为空,所有字段放在括号内,并用逗号隔开
增:create table db1.t1(id int,name char); #如果创建表时没有切换到指定的文件夹下,可以在表名前添加上库名即可

找文件:

查:show tables;#查看当前库下创建的所有表,查看出的表会显示在哪个库下的
查:show create table t1;  #查看具体的某一个表的表机构但是该表结构看上去有点乱
查:desc t1; #也是查看表的表结构,但是比上面的方法查看的规整,当然我们也可以用describe t1;来进行查询表的表结构
查:describe t1; #查询表的表结构  效果同上。

库:

:
alter table t1 add age int; #改是改变表的表结构,add是向表中添加新的字段,并指定字段的类型,不需要用括号
alter table t1 modify name char(15);#modify是修改表中字段的类型,但是不可以修改字段名
alter table t1 change name NAME char(15); #change和modify的区别是可以修改字段的名字,当然也可以修改字段的类型
alter table t1 drop age; #删除表中的某一个字段,一般没有删除字段的需求,因为这样会连同字段下的记录也会一同被删除
alter table department rename to dep; #对表名进行重新命名

除库:

:
drop table t1;  #删除表时直接指定删除的表名即可             

3.记录操作:文件中的内容:

加文件内内容:

按照上面我们所创建库的格式去传。

 增
insert into t1(id,name) values 
        (1,'egon'),
        (2,'lxx'),
        (3,'alex');
 #向表中插入记录,此时要指定要插入的表名,以及表的字段名,和要插入的字段对应的值,值用括号进行插入,每插入一组值用逗号隔开,最后一组用分号,表示此条语句的结束

看文件内内容:

:
select id from db1.t1;              #指定要查看表中哪个字段下的记录
select id,name from t1;             #我们也可以指定查看多个字段,查看多个字段下的内容
select name,id from t1;             #查看多个字段我们可以调换字段的顺序,那么查看的结果也是按照我们查看字段的顺序进行排列,当然这种查看并不会改变我们原有存储时的顺序

select * from t1;                   #*代表的是查看所有的字段下的记录,会将指定的表下多有字段下的记录查询出来

select * from t1 where id >= 2;     #当然我们还可以查询所有字段是加上约束条件,更精准的查询我们想要的记录

文件内内容:

:
update t2 set name="lxx",id=444 where id=4;  #可以id和name都改
update db1.t1 set name='lxx_dsb' where id=2;   #update修改记录的值,set指定要修改字段名直接进行修改,后面可以跟要修改的约束条件,来修改我们想要修改具体的那条记录

删除文件内内容:

按照上面我们所创建库的格式去传。

:
delete from db1.t1 where id >= 2;     
#delete删除记录,要指定要删除哪个表下的记录,并指定条件,进行筛选出自己想要删除的记录,强调这种删除并不会变id值得结构,id并不会重新进行排序,因为如果表中的数据量很大,重新排序显然是不合理的

create table t2(id int primary key auto_incremnt,name char(15));#创建表的时候一般我们将标的字段id设定成主键,主键的意思就是id不能为空且唯一,并将id设置成自增长,这样进行插入记录的时候就不需要在传入id的值了

insert into t2(name) values           
        ('egon'),
        ('lxx'),
        ('wxx'),
        ('axx');                         
#向表中插入多条记录,要指定要插入记录的表,插入的多条记录要放在括号内,并且多条记录之间用逗号进行分隔开,最后一条记录以分号进行结束
posted @ 2020-09-01 10:15  Orange-ONE  阅读(287)  评论(0编辑  收藏  举报