精彩文章免费看

Python MySQL数据库1:数据存储介绍、阿里云安装myspl(使用)以及客户端Navicat使用

一、总体内容

  • 1.1、数据存储
  • 1.2、数据库
  • 1.3、RDBMS
  • 1.4、RDBMS 和 数据库的关系
  • 1.5、SQL
  • 1.6、MySQL
  • 1.7、通过navicat操作数据库
  • 1.8、数据完整性(数据类型与约束)
  • 1.9、命令行脚本操作 数据库 (重点)
  • 1.10、表中数据的增删改查(curd)
  • 1.11、数据库的备份与恢复
  • 目标 :熟练编写数据的增删改查相关的 SQL 语句

    二、数据存储

    2.1、以前是这样记录的:结绳记事

  • 4.1、RDBMS 是一套软件,将来用来管理数据库的文件,关系型数据库
  • 4.2、当前主要使用两种类型的数据库:关系型数据库、非关系型数据库,本部分主要讨论关系型数据库,对于非关系型数据库会在后面学习
  • 4.3、所谓的关系型数据库RDBMS,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据
  • 4.4、关系型数据库的主要产品:
  • oracle:在以前的大型项目中使用,银行,电信等项目,做大型网站
  • mysql:web时代使用最广泛的关系型数据库,一般用作网站,存储持久化的数据,一般用作小型网站和中型网站足够了
  • ms sql server:在微软的项目中使用
  • sqlite:轻量级数据库,主要应用在移动平台
  • redis 一般用来当做缓存
  • mongodb 用来存储非关系型的数据结构,一般用作爬虫,存储没有关系的数据
  • 五、RDBMS和数据库的关系

    六、SQL (Structured Query Language): 是一门特殊的语言,专门用来操作关系数据库,不区分大小写
    SQL是结构化查询语言 ,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库

  • 6.1、SQL语句主要分为:
  • DQL:数据查询语言,用于对数据进行查询,如select
  • DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete
  • TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
  • DCL:数据控制语言,进行授权与权限回收,如grant、revoke
  • DDL:数据定义语言,进行数据库、表的管理等,如create、drop
  • CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor
  • 6.2、对于web程序员来讲,重点是数据的crud(增删改查),必须熟练编写DQL、DML,能够编写DDL完成数据库、表的操作,其它语言如TPL、DCL、CCL了解即可
  • 6.2、学习要求
  • 熟练掌握数据增删改查相关的 SQL 语句编写

  • 在 Python代码中操作数据就是通过 SQL 语句来操作数据

    # 创建Connection连接
    conn = connect(host='localhost', port=3306, user='root', password='mysql', database='python1', charset='utf8')
    # 得Cursor对象
    cs = conn.cursor()
    # sql = 'update students set name="刘邦" where id=6'
    # sql = 'delete from students where id=6'
    # 执行select语句,并返回受影响的行数:查询一条学生数据
    sql = 'select id,name from students where id = 7'
    # sql = 'SELECT id,name FROM students WHERE id = 7'
    count=cs.execute(sql)
    # 打印受影响的行数
    print(count)
    
  • 点击查看MySQL官方网站
  • MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品
  • 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
  • 支持多种操作系统,如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等
  • 为多种编程语言提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等
  • 支持多线程,充分利用CPU资源
  • 优化的SQL查询算法,有效地提高查询速度
  • 提供多语言支持,常见的编码如GB2312、BIG5、UTF8
  • 提供TCP/IP、ODBC和JDBC等多种数据库连接途径
  • 提供用于管理、检查、优化数据库操作的管理工具
  • 大型的数据库。可以处理拥有上千万条记录的大型数据库
  • 支持多种存储引擎
  • MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库
  • MySQL使用标准的SQL数据语言形式
  • Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统
  • 在线DDL更改功能
  • 复制全局事务标识
  • 复制无崩溃从机
  • 复制多线程从机
  • 开源 免费 不要钱 使用范围广,跨平台支持性好,提供了多种语言调用的 API,是学习数据库开发的首选

    也可以在终端输入 mysql -v 查看是否安装上,会报错,想输入mysql,不报这个错咋办? 起别名

    # 从命令行访问常用程序(如 mysql 和 mysqladmin)
    alias mysql=/usr/local/mysql/bin/mysql
    alias mysqladmin=/usr/local/mysql/bin/mysqladmin
    

    (1)、找到my.cnf配置文件: 你的MySQL有没有配置,如果没有配置的话,配置下:my.cnf 配置文件
    如果/etc/目录下没有my.cnf配置文件,请到/usr/share/mysql/下找到*.cnf文件,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

    提示:我是报错:mysql创建用户报错ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value,原因是mysql默认配置严格模式,该模式禁止通过insert的方式直接修改mysql库中的user表进行添加新用户。

    (2)、vim /etc/my.cnf

    sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
    
    sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
    

    然后重启mysql服务

    service mysql restart
    

    (3)、创建用户,创建之前先输入一下:use mysql;

    mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("456123"));
    

    这样就创建了一个名为:test 密码为:1234 的用户。
    注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。

    (4)、登录MYSQL(有ROOT权限),这里以ROOT身份登录

    > mysql -u root -p
    

    (5)、为用户创建一个数据库(test),如果数据库存在就不需要再建了,直接进行第六步

    mysql>create database test;
    

    (6)、授权test1用户拥有test数据库的所有权限(某个数据库的所有权限)

    mysql>grant all privileges on test.* to test1@localhost identified by '456123';
    mysql>flush privileges;//刷新系统权限表
    

    (7)、如果想指定部分权限给一用户,可以这样来写

    mysql>grant select,update on test.* to test1@localhost identified by '456123';
    

    (8)、授权test1用户拥有所有数据库的某些权限

    mysql>grant select,delete,update,create,drop on *.* to test1@"%" identified by "456123";
    

    (9)、参考资料 MySQL添加用户、删除用户与授权

  • 查看有所有的库: show databases;
  • 建立数据库 : create database testTable;
  • step1:
    1、修改user表:MySQL>update user set host = '%' where user = 'root';
    2、授权主机访问:MySQL>GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION;
    3、刷新权限:MySQL>FLUSH PRIVILEGES;
    4、退出:MySQL>EXIT;

  • step2:查看端口监听状态,netstat -an|grep 3306,如果显示不是如下图所示,则需要修改配置文件。找到my.cnf,一般在/etc/mysql/下面,具体情况根据实际而定。注释掉其中的bind-address属性。如下

    九、数据完整性

  • 9.1、一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中;在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束。

  • 9.2、数据类型

  • 可以通过查看帮助文档查阅所有支持的数据类型
  • 使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间
  • 常用数据类型如下:
  • 整数:int,bit(更小的类型)
  • 小数:decimal
  • 字符串:varchar,char
  • 日期时间: date, time, datetime
  • 枚举类型(enum)
  • 特别说明的类型如下:
  • decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位
  • char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab '
  • varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'
  • 字符串text表示存储大文本,当字符大于4000时推荐使用
  • 对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径(我一般他视频或者图片放到七牛云,在自己的服务器存储视频或者图片的链接)
  • 更全的数据类型可以参考:东哥推荐的博客
  • 惟一unique:此字段的值不允许重复
  • 默认default:当不填写此值时会使用默认值,如果填写时以填写为准
  • 外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常;提示:在自己的表中导入的其他表的主键是外键
  • 说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加、修改、删除、查询)时,都会降低数据库的性能,所以不推荐使用,那么数据的有效性怎么保证呢?答:可以在逻辑层进行控制;
  • 9.4、类型表

    数值类型(常用)

    有符号范围(Signed) 无符号范围(Unsigned)
    create table classes(
         id int unsigned auto_increment primary key not null,
         name varchar(10)
    

    例:创建学生表(primary key auto_increment not null:设为主键、自增长、不为空) 约束的顺序随便写,最后一个字段不要 逗号,在定义类型的时候,后面加上 unsigned 表示无符号,gender enum('男','女','人妖','保密') default "保密",可以为gender设置默认值 "保密"

    create table students(
         id int unsigned primary key auto_increment not null,
         name varchar(20) default '',
         age tinyint unsigned default 0,
         height decimal(5,2),
         gender enum('男','女','人妖','保密') default "保密",
          cls_id int unsigned default 0
    

    (2)、在 班级库:ClassDataBase 里面创建一个学生表 studentTable
    ,里面创建 4 个字段:id、name、age、gender,提示:gender 是枚举类型

    create table studentTable(
          id int unsigned primary key auto_increment not null,
          name varchar(20) default '',
          age tinyint unsigned default 0,
          gender enum('男','女','人妖','保密') default '保密'
    

    全列插入:有几个字段插入几个,主键字段 可以用 0nulldefault 来占位,枚举可以用 1,2,3,4来代替,如下面的例子中 "男" 可以用 1 来代替,看上图的枚举,男是第一位,枚举有几个最大是几,上面的gender是四个性别,最大是4,超过4报错

    insert into 表名 values(value1,value2,value3,.....);
    

    例如:-- 向studentTable表插入 一个学生信息(studentTable是表名)

    insert into studentTable values(0, "小王", 26, "男");
    

    逻辑删除:用一个字段来表示 这条信息是否已经不能再使用了,给studentTable表添加一个is_delete字段 bit 类型, bit里面存储的是 0 与 1。
    例如:给表studentTable增加bit字段,默认为 0 ,代表没有删除

    alter table studentTable add is_delete bit default 0;
    

    根据小飞的id,模拟逻辑删除 小飞(也就是更新数据)

    update studentTable set is_delete=1 where id=5;
    
    update studentTable set gender=1; -- 全部都改
    update studentTable set gender=2 where name="小王"; -- 只要name是小王的 全部的修改
    update studentTable set gender=1 where id=3; -- 只要id为3的 进行修改
    update studentTable set age=22, gender=1 where id=3; -- 只要id为3的 进行修改
    

    11.5、 询数据

    查询所有列

    select * from 表名;
    
    select * from studentTable;
    

    一定条件下查询

    select * from 表名 where 条件; -- 查询 条件 下的所有信息
    
    select * from studentTable where name="小王"; -- 查询 name为 小王 的所有信息
    select * from studentTable where id>2; -- 查询 id > 2 的所有信息
    

    查询指定列

     select 列1,列2,... from 表名;
    
    select name,gender from studentTable;