MYSQ的使用以及python操作mysql

  1. day1 - day7
    MySQL概述
             1、什么是数据库
                      数据库是一个存储数据的仓库
             2、都有哪些公司在用数据库
                          金融机构、游戏网站、购物网站、论坛网站 … …
             3、提供数据库服务的软件
                      1、软件分类
                                 MySQL、SQL_Server、Oracle、Mariadb、DB2、MongoDB …
                      2、在生产环境中,如何选择使用哪个数据库
                               1、是否开源
                                        开源软件:MySQL、Mariadb、MongoDB
                                        商业软件:Oracle、DB2、SQL_Server
                               2、是否跨平台
                                        不跨平台:SQL_Server
                                        跨平台:MySQL、Mariadb、MongoDB、DB2、Oracle
                               3、公司的类型
                                        商业软件:政府部门、金融机构
                                          开源软件:游戏网站、购物网站、论坛网站… …
             4、MySQL的特点
                      1、关系型数据库
                               1、关系型数据库的特点
                                        1、数据是以行和列的形式去存储的
                                        2、这一系列的行和列称为表
                                        3、表中的每一行叫一条记录
                                        4、表中的每一列叫一个字段
                                        5、表和表之间的逻辑关联叫关系
                               2、示例
                                        1、关系型数据库存储
                                                 表1、学生信息表
                                                                      姓名 年龄 班级
                                                                          牛郎 25 AID1803
                                                                          织女 23 AID1801
                                                 表2、班级信息表
                                                                    班级 班主任
                                                              AID1803 卢大大
                                                              AID1801 孙大大
                                        2、非关系型数据库中存储
                                                 {“姓名”:“牛郎”,“年龄”:25,“班级”:“AID1803”,“班主任”:“卢大大”}
                                                 {“姓名”:“织女”,“年龄”:25,“班级”:“AID1803”}
                      2、跨平台
                               可以在Unix、Linux、Windows上运行数据库服务
                      3、支持多种编程语言
                                   Python、java、php … …
    2、MySQL的安装
                   1、Ubuntu安装MySQL服务 RedHat(红帽)、CentOS、Ubuntu
                      1、安装服务端
                                     sudo apt-get install mysql-server
                      2、安装客户端
                                     sudo apt-get install mysql-client
             2、Windows安装MySQL服务
                      1、下载MySQL安装包(windows)
                               mysql-installer***5.7.***.msi
                      2、双击、按照教程安装即可
    3、启动和连接MySQL服务
             1、服务端启动
                      1、查看MySQL服务状态
                                   sudo /etc/init.d/mysql status
                      2、停止、启动、重启MySQL服务
                                           sudo /etc/init.d/mysql stop | start | restart
             2、客户端连接
                      1、命令格式
                                     mysql -h主机地址 -u用户名 -p密码
                                     mysql -hlocalhost -uroot -p123456
                          2、本地连接可以省略 -h 选项
                                   mysql -u用户名 -p密码
                                   mysql -uroot -p123456
    4、基本SQL命令
             1、SQL命令的使用规则
                          1、每条SQL命令必须以 ; 结尾
                      2、SQL命令不区分字母大小写
                                  3、使用 \c 来终止命令的执行 (Linux中 ctrl + c)
             2、库的管理
                      1、库的基本操作
                               1、查看已有的库
                                          show databases;
                               2、创建库(指定默认字符集)
                                                create database 库名 default charset=utf8;
                               3、查看创建库的语句
                                              show create database 库名;
                               4、查看当前所在库
                                          select database();
                               5、切换库
                                          use 库名;
                               6、查看库中已有表
                                          show tables;
                               7、删除库
                                            drop database 库名;
                      2、库名的命名规则
                               1、可以使用数字、字母、_,但不能使用纯数字
                               2、库名区分字母大小写
                               3、库名具有唯一性
                               4、不能使用特殊字符和MySQL关键字
                      3、练习
                               1、创建库AID1803db,指定字符集为utf8
                                                create database AID1803db default charset=utf8;
                               2、切换到该库AID1803db
                                          use AID1803db;
                               3、查看当前所在库
                                          select database();
                               4、查看库中已有的表
                                          show tables;
                               5、查看AID1803db的字符集(查看创建库的语句)
                                              show create database AID1803db;
                               6、删除库AID1803db
                                            drop database AID1803db;
             3、表的管理
                      1、表的基本操作
                               1、创建表(指定字符集)
                                            create table 表名(
                                          字段名 数据类型,
                                          字段名 数据类型,
                                          … …
                                        );
                               2、查看创建表的语句(字符集)
                                              show create table 表名;
                               3、查看表结构
                                          desc 表名;
                               4、删除表
                                            drop table 表名;
                      2、表的命名规则(同库的命名规则)
                      3、练习
                                 1、创建库 python
                                            create database python;
                                     2、在库 python 中创建表 py_mysql,指定字符集utf8
                                                      表中字段有 id int 和 name char(20) 两个字段
                                          use python;
                                            create table py_mysql(
                                          id int,
                                          name char(20)
                                          )default charset=utf8;
                                   3、查看表 py_mysql 的字符集以及存储引擎
                                              show create table py_mysql;
                                   4、查看 py_mysql 的表结构
                                          desc py_mysql;
                                 5、删除表 py_mysql
                                            drop table py_mysql;
                      4、注意
                               1、所有的数据都是以文件的形式存放在数据库目录下
                               2、数据库目录:/var/lib/mysql
    5、更改库、表的默认字符集
             1、方法
                      通过更改MySQL服务的配置文件来实现
             2、步骤
                      1、获取root权限
                                 sudo -i
                      2、切换到配置文件所在路径
                                 cd /etc/mysql/mysql.conf.d
                      3、备份
                                     cp -p mysqld.cnf mysqld.cnf.bak
                               (-p选项连同原文件权限一起复制)
                      4、用vi打开mysqld.cnf
                                 vi mysqld.cnf
                               [mysqld]
                                     character_set_server = utf8 保存退出
                                                   a -> 写入 -> ESC -> shift + : -> wq
                      5、重启mysql服务
                                     /etc/init.d/mysql restart | reload(重载配置文件)
                        6、退出超级用户 exit
                          7、登录到mysql验证:mysql -uroot -p123456
                                                                  create database 库名;
                                                                                                                      show create database 库名;
    6、表记录管理
             1、在表中插入记录
                            1、insert into 表名 values(值1),(值2),…,(值N);
                            2、insert into 表名(字段名列表) values(值1),…(值N);
             2、查询表记录
                            1、select * from 表名;
                            2、select 字段1,字段名2,…,字段名N from 表名;
             3、练习
                            1、查看所有的库 : show databases;
                                2、创建新库 stu1 : create database stu1;
                              3、在库 stu1 中创建表 students ,字段要求如下
                                   1、id int
                                   2、name char(15)
                                   3、age int
                                   4、address char(20)
                              4、查看表 students 的表结构: desc students;
                      5、在表中插入一条记录(行)
                                     insert into students values(1,“Tom”,25,“Beijing”);
                      6、在表中一次性插入2条记录(行)
                                     insert into students values(…),(…);
                                7、查看所有表记录 : select * from students;
                                8、删除表 students : drop table students;
                                9、删除库 stu1 : drop database stu1;
    7、客户端把数据存储到数据库服务器上的过程
                     1、连接到数据库服务器 : mysql -uroot -p123456
                 2、选择一个库 :use 库名;
                 3、创建表或者修改表 :create …
                       4、断开与数据库服务器的连接 :exit | quit | \q
    8、名词介绍
               1、DB (database)
                      DB就是数据库,存储数据的仓库
                 2、DBMS(database management system)
                      数据库管理系统
                          管理数据库的软件:MySQL、Oracle、MongoDB … …
               3、DBS(database system)
                      数据库系统
                                      DBS = DB(存储) + DBMS(数据库软件) + 数据库应用(财务管理系统、人事管理系统) + 用户
    9、数据类型
             1、数值类型(有符号signed和无符号unsigned)
                      1、整型
                                 1、int 大整型(4个字节)
                                                  取值范围:0 ~ 2 *32 -1(42亿多)
                                 2、tinyint 微小整型(1个字节)
                                              1、有符号(signed默认): -128 ~ 127
                                              2、无符号(unsigned): 0 ~ 255
                                 3、smallint 小整型(2个字节)
                                            取值范围:0 ~ 65535
                                 4、bigint 极大整型(8个字节)
                                                    取值范围:0 ~ 2 ** 64 - 1
                      2、浮点型
                               1、float(4个字节,最多显示7个有效位)
                                        1、用法
                                                       字段名 float(m,n) m:表示总位数 n:小数位位数
                                                           salary float(5,2) 取值范围? -999.99 ~ 999.99
                                        2、注意
                                                 1、浮点型插入整数时会自动补全小数位位数
                                                 2、小数位如果多于指定的位数,会对指定位的下一位进行四舍五入
                                                                    float(5,2) -> 23.128 -> 23.13
                               2、double(8个字节,最多显示15个有效位)
                                        1、用法
                                                   字段名 double(m,n)
                               3、decimal(M+2个字节,最多显示28个有效位)
                                        1、用法
                                                 decimal(28,5)
             2、字符类型
                      1、char(定长)
                                   1、取值范围:1 ~ 255
                                 2、不给定宽度默认为 1
                      2、varchar(变长)
                                   1、取值范围:1 ~ 65535
                               2、注意
                                        1、varchar没有默认宽度,必须给定一个宽度值
                                                   name varchar(20)
                            3、char 和 varchar 的特点
                               1、char
                                        浪费存储空间,但是性能高
                               2、varchar
                                        节省存储空间,但是性能低
                      4、练习
                               1、创建表stuinfo,字段要求如下:
                                                                              学号:id 大整型 id int,
                                                            姓名:name 变长,宽度为15 name varchar(15),
                                                        班级:classes 定长,宽度为7 classes char(7),
                                          年龄:age 微小整型,要求不能输入负数
                                                                       age tinyint unsigned,
                                              身高:height 浮点型,小数位为2位 heigit float(5,2)
                                     2、查看表结构 : desc stuinfo
                                   3、在表 stuinfo 中插入2条记录(行)
                                              insert into stuinfo values
                                        (1,“张三丰”,“AID1803”,23,175.00)
                               4、查询所有表记录
                                              select * from stuinfo;
                               5、查询所有学生的姓名、年龄和身高
                                              select name,age,height from stuinfo;
             3、枚举类型
                      1、定义
                               字段值只能在列举的范围内选择
                        2、enum(…) 单选(最多有65535个不同的值)
                                 字段名 enum(值1,值2,…,值N)
                        3、set(…) 多选(最多有64个不同的值)
                                 字段名 set(值1,值2,…,值N)
                                 插入记录时 “Python,boy,Mysql”
             4、日期时间类型
                          1、year :年 YYYY
                          2、date :日期 YYYYMMDD
                          3、time :时间 HHMMSS
                          4、datetime :日期时间 YYYYMMDDHHMMSS
                          5、timestamp :日期时间 YYYYMMDDHHMMSS
                                   create table t6(
                                 id int,
                                 name varchar(15),
                                   age tinyint unsigned,
                                 birth_year year,
                                 birthday date,
                                 class time,
                                 meeting datetime
                                 )default charset=utf8;
                                     insert into t6 values
                               (1,“武松”,40,1979,19790520,090000,20180504000000);
                                     select * from t6;
                      6、注意
                               1、插入记录时datetime字段不给值默认返回NULL
                               2、插入记录时timestamp字段不给值默认返回系统当前时间
    10、表字段的操作
                   1、语法:alter table 表名 执行动作;
                      1、添加字段
                                                 alter table 表名 add 字段名 数据类型 first | after 字段名;
                      2、删除字段
                                       alter table 表名 drop 字段名;
                      3、修改字段数据类型
                                         alter table 表名 modify 字段名 新数据类型;
                                 # 修改数据类型时会受到表中原有数据的限制
                      4、修改字段名
                                           alter table 表名 change 旧名 新名 数据类型;
                      5、修改表名
                                       alter table 表名 rename 新表名;
    1、面试题
             1、填空题
                              1、MySQL中的数据类型有 ____ _____ ____ _____
                            2、关系型数据库的核心内容是 关系二维表
             2、简答题
                      1、简述客户端把数据存储到数据库服务器上的过程
                      2、char和varchar的区别?各自的特点?
    2、操作题
               1、创建一个学校的库 school
                 2、在库中创建一张表 students 来存储学生信息
                        学号、姓名、年龄、成绩、性别、爱好、入学时间
             3、查看students的表结构
             4、在students中添加一个字段id,添加在第一列
             5、在表中随意插入5条记录
             6、查看所有的学生信息
             7、查看所有学生的姓名和成绩
        3、练习使用一下 vi 文本编辑器

  1. 字符类型的宽度和数值类型的宽度的区别
             1、数值类型的宽度仅仅为显示宽度,只用于select查询显示,和占用的存储空间大小无关,可用zerofill查看效果
             2、字符类型的宽度超过则无法存储
    2、where条件子句(配合查询、修改、删除操作)
             1、语法格式
                                select * from 表名 where 条件;
    3、表记录管理
             1、删除表记录
                              1、delete from 表名 where 条件;
                      2、注意
                               delete语句后如果不佳where条件子句,会将表中所有记录全部删除
             2、更新表记录
                                1、update 表名 set 字段名1=值1,字段名2=值2,… where 条件;
                      2、注意
                               update语句后如果不加where条件子句会将表中所有记录全部更改
             3、练习
                      1、查找所有蜀国人的信息
                      2、查找女英雄信息,只显示姓名、性别和国家
                      3、把曹操的国籍改为蜀国
                        4、把魏延的性别改为女,国籍改为 泰国
                            5、把id为2的记录的姓名改为 司马懿,性别改为 男,国家改为 魏国
                      6、删除所有的泰国人
                      7、删除所有的英雄记录
    4、运算符操作
             1、数值比较&字符比较
                      1、数值比较运算符:=、!=、>、>=、<、<=
                      2、字符比较运算符:=、!=
                      3、练习
                               1、找出攻击力高于150的英雄的名字和攻击力值
                               2、找出防御力不等于100的英雄信息
             2、逻辑比较
                      1、运算符:
                                 and (两个或者多个条件同时满足)
                                   or (两个或者多个条件有一个满足就可以)
                      2、练习
                               1、找出攻击值大于200的蜀国英雄的名字和攻击值
                               2、查找蜀国和魏国的英雄信息
                               3、将吴国英雄中攻击值为110的英雄的攻击值设置为100,防御值设置为60
             3、范围内比较
                      1、运算符
                                       between and、 in 、not in
                      2、语法
                                     between 值1 and 值2
                               in(值1,值2,…,值N)
                                 not in(值1,值2,…,值N)
                      3、练习
                               1、查找攻击值在100-200之间的蜀国英雄信息
                               2、找到蜀国和吴国以外国家的女英雄信息
             4、匹配空、非空
                          1、空 :is null
                            2、非空 :is not null
                      3、示例
                               1、查找姓名为NULL的蜀国女英雄信息
                               2、查找姓名为"“的英雄的id、姓名和国家
                      4、注意
                                           1、null :空值,必须用 is 或者 is not 去匹配
                                             2、”" :空字符串,用 = 或者 != 去匹配
             5、模糊比较
                            1、where 字段名 like 表达式;
                      2、表达式
                                   1、_ : 匹配单个字符
                                   2、% : 匹配0到多个字符
                      3、示例
                                             1、select name from sanguo where name like “%”;
                                          # 匹配名字中至少有两个字的英雄
                                             2、select name from sanguo where name like “%”;
                                          # NULL不会被统计
                                             3、select name from sanguo where name like "__";
                                          # 匹配名字为三个字的英雄
                                             4、select name from sanguo where name like “赵%”;
                                          # 匹配姓赵的英雄
               6、正则匹配查询 regexp
                            1、where 字段名 regexp “正则表达式”;
                      2、正则表达式符号
                                   ^ : 以…开头
                                   $ : 以…结尾
                                   . : 匹配任意一个字符
                                 []: 包含…内容
                                                 [0-9]:匹配带数字的
                                                 [a-z]:匹配带小写字母的
                                                 [A-Z]
                                     * : 星号前面的字符出现0个或者多次 "^赵."
                      3、示例
                                                 1、select name from sanguo where name regexp “[0-9]”; # 匹配名字中带数字的
                                                 2、select name from sanguo where name regexp “1”; # 匹配名字中以数字开头的记录
                                                 3、select name from sanguo where name regexp “[0-9]KaTeX parse error: Expected 'EOF', got '#' at position 4: "; #̲ 匹配名字中以数字结尾的记录 …”; # 匹配以 司 开头,以 懿 结尾的记录
                                                     5、select name from sanguo where name regexp “^…$”; # … … …
    5、SQL查询
             1、总结(执行顺序)
                              3、select … 聚合函数 from 表名
                        1、where …
                          2、group by …
                        4、having …
                          5、order by …
                        6、limit …
               2、order by
                      1、作用:给查询的结果进行排序
                            2、语法格式:order by 字段名 排序方式;
                      3、排序方式
                                   1、ASC(默认) : 升序
                                   2、DESC : 降序
                      4、示例
                               1、将英雄按防御值从低到高排序
                                                      select * from sanguo order by fangyu asc;
                               2、将蜀国英雄按攻击值从高到低排序
                                                                select * from sanguo where country = “蜀国” order by gongji desc;
                               3、将魏蜀两国的男英雄中名字为三个字的英雄按防御值升序排列
                                                                        select * from sanguo where country in(“魏国”,“蜀国”) and sex=“男” and name like “___” order by fangyu asc;
             3、limit(永远放在SQL语句的最后写)
                      1、作用:限制显示查询记录的个数
                      2、用法
                                   1、limit n :–>显示n条记录
                                   2、limit m,n :–>从第(m+1)条开始,显示n条记录
                                                limit 4,5 :显示 第5名-第9名
                                            ## m的值是从0开始计数的
                      3、示例
                               1、查找防御值倒数第2名到倒数第4名的蜀国英雄记录
                                                                select * from sanguo where country=“蜀国” order by fangyu asc limit 1,3;
                               2、查找攻击值前3名且名字不为空值的蜀国英雄的姓名、攻击值和国家
                                                                          select name,gongji,country from sanguo where name is not null and country=“蜀国” order by gongji desc limit 3;
             4、聚合函数
                      1、分类
                                   1、avg(字段名) : 求字段的平均值
                                   2、sum(字段名) : 求和
                                   3、max(字段名) : 求最大值
                                   4、min(字段名) : 求最小值
                               5、count(字段名):统计该字段记录的个数
                      2、示例
                               1、攻击力最强值是多少
                                                  select max(gongji) as best from sanguo;
                               2、统计一下id,name两个字段分别有多少条记录
                                              select count(id),count(name) from sanguo;
                                          # 空值NULL不会被统计,空字符串""会被统计
                               3、统计蜀国英雄中攻击值大于200的英雄的数量
                                                      select count(
    ) from sanguo where country=“蜀国” and gongji>200;
               5、group by(先分组,再聚合)
                        1、作用 :给查询的结果进行分组
                      2、示例
                               1、统计sanguo表中一共有几个国家
                                                    select country from sanguo group by country;
                               2、计算所有国家的平均攻击力
                                                    select country,avg(gongji) from sanguo group by country;
                                        执行过程:
                                                       1、先分组(此时未去重) group by country
                                                 2、再聚合(求每组的平均攻击值)
                                                 3、去重
                                     3、查找所有国家中 英雄数量最多的 前2名 的国家名称及英雄数量
                                                                    select country,count() as numbers from sanguo group by country order by numbers desc limit 2;
                      3、注意
                                 1、group by之后的字段名必须要为select之后的字段名
                                 2、如果select之后的字段没有在group by语句之后,则必须要对该字段进行聚合处理(聚合函数)
             6、having
                        1、作用 :对查询的结果进行进一步筛选
                      2、示例
                               1、找出平均攻击力大于105的国家的前2名,显示国家名称和平均攻击力
                                                                            select country,avg(gongji) as pjgj from sanguo group by country having pjgj > 105 order by pjgj desc limit 2;
                      3、注意
                                   1、having语句通常与group by语句联合使用,用来过滤由group by语句返回的记录集
                               2、having语句的存在弥补了where条件子句不能与聚合函数联合使用的不足,where操作的是表中实际存在的字段,having操作的是聚合函数生成的显示列
             7、distinct
                      1、作用:不显示字段的重复值
                      2、示例
                               1、sanguo表中一共有哪些个国家
                                                select distinct country from sanguo;
                               2、计算蜀国一共有多少个英雄
                                                        select count(distinct name) from sanguo where country = “蜀国”;
                      3、注意
                               1、distinct处理的是distinct和from之间的所有字段,所有字段的值必须完全相同才可以去重
                               2、distinct不能对任何字段做聚合处理
             8、查询表记录时可以做数学运算
                      1、运算符
                                       + - * / %
                      2、示例
                                   1、查询时显示所有英雄的攻击力 * 10
                                              select name,gongji
    10,country from sanguo;
    6、约束
             1、作用
                      1、为了保证数据的完整性、一致性、有效性,可以限制无效的数据插入到数据表中
             2、约束分类
                      1、默认约束(default)
                               1、作用
                                        在插入记录时,如果不给该字段赋值,则使用默认值
                               2、格式
                                              字段名 数据类型 default 默认值,
                      2、非空约束
                               1、作用
                                        不允许该字段的值有空值NULL记录
                               2、格式
                                              字段名 数据类型 not null,
    7、索引
             1、定义
                      对数据库中表的一列或者多列的值进行排序的一种结构(MySQL中索引用Btree方式)
             2、索引的优点
                      可以加快数据的检索速度
             3、索引的缺点
                      1、当对表中的数据进行增加、修改、删除的时候,索引需要动态维护,降低了数据的维护速度
                      2、索引需要占用物理存储空间(数据库目录/var/lib/mysql)
             4、索引示例
                          1、运行 insert
    .py 文件,插入100万条记录
                      2、开启性能分析
                                     show variables like “%pro%”;
                                     set profiling = 1;
                      3、执行查询语句
                                         select name from t1 where name=“lucy99999”;
                      4、查看性能分析结果
                                 show profiles;
                      5、在name字段创建索引
                                       create index name on t1(name);
                      6、执行查询语句
                                         select name from t1 where name=“lucy99999”;
                      8、查看性能分析结果
                                 show profiles;
                      9、关闭性能分析
                                     set profiling = 0;

1、索引分类
         1、普通索引
         2、唯一索引
         3、主键索引
         4、外键索引
2、普通索引(index)
         1、使用规则
                  1、一个表中可以有多个index字段
                  2、字段的值可以有重复,也可以为NULL值
                  3、经常把做查询条件的字段设置为index字段
                    4、index字段的key标志为: MUL
         2、创建
                  1、创建表时创建index
                               create table t1(
                             … …,
                             … …,
                           index(id),
                           index(name));
                  2、在已有表中添加索引字段
                           1、语法格式
                                            create index 索引名 on 表名(字段名);
                                      # 索引名一般和字段名一样
         3、查看
                          1、desc 表名; ->查看KEY标志为 MUL
                        2、show index from 表名\G;
         4、删除
                          drop index 索引名 on 表名;
                  注意:
                           删除普通索引只能一个一个删除
3、唯一索引(unique)
         1、使用规则
                      1、一个表中可以有多个 unique 字段
                  2、unique字段的值不允许重复,可以为空值NULL
                    3、unique的KEY标志是 UNI
         2、创建(基本等同index创建)
                  1、创建表时创建
                           unique(字段名),
                           unique(字段名)
                  2、已有表中创建
                                     create unique index 索引名 on 表名(字段名);
                  3、查看、删除唯一索引
                             desc 表名;
                                 show index from 表名;
                                   drop index 索引名 on 表名;
      4、主键索引(primary key) && 自增长属性(auto_increment)
         1、使用规则
                  1、一个表中只能有一个主键字段
                      2、对应字段的值不允许重复 且 不能为空值NULL
                    3、主键字段的KEY标志为 PRI
                  4、把表中能够唯一标识一条记录的字段设置为主键,通常把表中记录编号的字段设置为主键
         2、创建主键(PRI)
                  1、创建表时创建
                                   1、字段名 数据类型 primary key auto_increment,
                           2、
                                        id int auto_increment,
                                                                            … …, # 设置自增长起始值
                                      primary key(id))auto_increment=10000;
                  2、删除主键
                           1、先删除自增长属性(modify)
                                              alter table 表名 modify id int;
                           2、删除主键
                                              alter table 表名 drop primary key;
                  3、在已有表中添加主键
                                     alter table 表名 add primary key(字段名);
5、外键
         1、定义
                  让当前表字段的值在另一个表的范围内选择
         2、语法格式
                    foreign key(参考字段名)
                    references 被参考表名(被参考字段名)
                      on delete 级联动作
                      on update 级联动作
         3、案例
                  表1、缴费信息表(财务)
                                             学号 姓名 班级 缴费金额
                                                    1 唐伯虎 AID01 28000
                                                    2 点秋香 AID01 20000
                  表2、学生信息表(班主任)
                                     学号 姓名 缴费金额
                                         1 唐伯虎 28000
                                              2 点秋香 20000
                  1、创建缴费信息表
                               create table jftab(
                                 id int primary key,
                             name char(15),
                             class char(5),
                             money int
                             )default charset=utf8;
                                 insert into jftab values
                           (1,“唐伯虎”,“AID01”,28000),
                           (2,“点秋香”,“AID01”,20000),
                           (3,“祝枝山”,“AID01”,22000);
                  2、创建学生信息表(从表)
                               create table bjtab(
                             stu_id int,
                             name char(15),
                             money int,
                                 foreign key(stu_id) references jftab(id)
                               on delete cascade
                               on update cascade
                           );
         4、级联动作
                    1、cascade :数据级联更新
                               当主表删除记录 或者 更新被参考字段的值时,从表会级联更新
                    2、restrict 默认
                           1、当删除主表记录时,如果从表中有相关联记录则不允许主表删除
                           2、更新同理
                    3、set null
                           1、当主表删除记录时,从表中相关联记录的参考字段值自动设置为NULL
                           2、更新同理
                    4、no action
                                         on delete no action on update no action
                             同 restrict,都是立即检查外键限制
         5、删除外键
                              alter table 表名 drop foreign key 外键名;
                  1、外键名的查看方式
                                 show create table 表名;
         6、已有表中添加外键
                    ## 会受到表中原有数据的限制
                            alter table 表名 add foreign key(参考字段名)
                    references 被参考表名(被参考字段名)
                      on delete 级联动作
                      on update 级联动作;
         7、外键使用规则
                  1、两张表被参考字段和参考字段数据类型要一致
                          2、被参考字段必须是 key 的一种,通常是 primary key
6、数据导入
         1、作用:把文件系统的内容导入到数据库中
         2、语法
                        load data infile “文件名”
                      into table 表名
                        fields terminated by “分隔符”
                        lines terminated by “\n”
         3、示例
                      把 /etc/passwd 文件中的内容导入到db2库下的userinfo表
                                      tarena : x : 1000 : 1000 :
                                  用户名 密码 UID号 GID号
                          tarena, : /home/tarena : /bin/bash
                                    用户描述 用户主目录 登录权限
                                                                        /bin/false
                                                                                                                                         /usr/sbin/nologin
         4、操作步骤
                  1、在数据库中创建对应的表
                               create table userinfo(
                             username char(20),
                             password char(1),
                             uid int,
                             gid int,
                             comment varchar(50),
                             homedir varchar(50),
                             shell varchar(50)
                           );
                  2、将要导入的文件拷贝到数据库的默认搜索路径中
                           1、查看数据库的默认搜索路径
                                          show variables like “secure_file_priv”;
                                    /var/lib/mysql-files
                           2、Linux命令行输入:
                                            sudo cp /etc/passwd /var/lib/mysql-files/
                  3、执行数据导入语句
                                 load data infile “/var/lib/mysql-files/passwd”
                               into table userinfo
                                 fields terminated by “:”
                                 lines terminated by “\n”;
         5、练习:将AID1709.csv文件导入到数据库中
                        # csv文件单元格之间以 , 分隔
                  /var/lib/mysql-files/AID1709.csv
                      ls -l AID1709.csv
                  rw-------
                      chmod 666 AID1709.csv
                  1、在数据库中创建对应的表
                                           id 姓名 成绩 手机号 班级
                               create table scoretab(
                             id int,
                             name varchar(20),
                             score float(5,2),
                             phone char(11),
                             class char(7)
                             )default charset=utf8;
                  2、把导入的文件复制到数据库的默认搜索路径中
                                       cp 源文件 目标路径
                                   cp /home/tarena/AID1709.csv /var/lib/mysql-flies/
                                     ######## 用 TAB 键 补齐路径 #######
                  3、执行数据导入语句
                                 load data infile “/var/lib/mysql-files/AID1709.csv”
                               into table scoretab
                                 fields terminated by “,”
                                 lines terminated by “\n”;
                                   # 修改文件权限 chmod 666 AID1709.csv
7、数据导出
         1、作用
                  将数据库表中的记录保存到系统文件里
         2、语法格式
                        select … from 表名
                      into outfile “文件名”
                        fields terminated by “分隔符”
                        lines terminated by “\n”;
         3、把userinfo表中的username、password和uid导出到文件user.txt
                        select username,password,uid from userinfo
                      into outfile “/var/lib/mysql-files/user.txt”
                        fields terminated by “,”
                        lines terminated by “\n”;
                    1、sudo -i
                    2、cd /var/lib/mysql-files/
                    3、cat user.txt
         4、注意
                  1、导出的内容由SQL查询语句决定
                  2、执行导出命令时路径必须指定对应的数据库搜索路径
8、表的复制
         1、语法格式
                          create table 表名 select 查询命令;
         2、示例
                  1、复制userinfo表中的全部记录,userinfo2
                                       create table userinfo2 select * from userinfo;
                  2、复制userinfo表中username,password,uid三个字段的第2-10条记录,userinfo3
                                           create table userinfo3 select username,password,uid from userinfo limit 1,9;
         3、复制表结构
                              create table 表名 select 查询命令 where false;
         4、注意
                      复制表的时候不会把原有表的 key 属性复制过来
9、嵌套查询(子查询)
         1、定义
                  把内层的查询结果作为外层的查询条件
         2、示例
                      1、把uid的值小于 uid 平均值的用户名和uid号显示出来
                                 select username,uid from userinfo
                                       where uid < (select avg(uid) from userinfo);
10、连接查询
         1、内连接
                  1、定义
                           从表中删除与其他被连接的表中没有匹配到的行
                  2、语法格式
                                 select 字段名列表 from 表1
                                             inner join 表2 on 条件 inner join 表3 on 条件;
                  3、示例
                           1、显示省市的详细信息
                                          select sheng.s_name,city.c_name from sheng
                                            inner join city on sheng.s_id=city.cfather_id;
                           2、显示省市县详细信息
                                          select sheng.s_name,city.c_name,xian.x_name from sheng
                                            inner join city on sheng.s_id=city.cfather_id
                                            inner join xian on city.c_id=xian.xfather_id;
         2、外连接
                  1、左连接
                           1、定义
                                    以左表为主显示查询结果
                           2、语法格式
                                          select 字段名列表 from 表1
                                            left join 表2 on 条件;
                           3、示例
                                    1、以省表为主显示省市详细信息
                                                   select sheng.s_name,city.c_name from sheng
                                                     left join city on sheng.s_id=city.cfather_id;
                                    2、显示省市区详细信息,要求县全部显示
                                                         select sheng.s_name,city.c_name,xian.x_name from sheng left join city
                                               on sheng.s_id=city.cfather_id
                                                     right join xian on city.c_id=xian.xfather_id;
                                        3、显示省市区详细信息,要求 市 全部显示
                                                   select sheng.s_name,city.c_name,xian.x_name from sheng
                                                     right join city on sheng.s_id=city.cfather_id
                                                     left join xian on city.c_id=xian.xfather_id;
                                        #### 结果集 ####
                  2、右连接
                           用法同左连接,以右表为主显示查询结果
11、多表查询
                     1、select 字段名列表 from 表名列表; # 笛卡尔积
                   2、select 字段名列表 from 表名列表 where 条件;
                     等同于 内连接 inner join
1、MySQL用户账户管理
         1、开启MySQL远程连接
                  1、获取root权限
                             sudo -i
                  2、cd到配置文件所在路径
                             cd /etc/mysql/mysql.conf.d/
                    3、vi mysqld.cnf
                               #bind-address = 127.0.0.1
                               浏览模式 -> a(插入模式)
                               -> esc(浏览模式) ->
                                 shift + :(命令行模式) ->
                           :wq(保存并退出)
                  4、重启mysql服务
                             /etc/init.d/mysql restart
         2、添加授权用户
                  1、使用root用户连接到服务器
                               mysql -uroot -p123456
                  2、添加新的授权用户
                                     create user “用户名”@“IP地址” identified by “密码”;
                                     create user “tiger”@"%" identified by “123456”;
                           IP地址的表示方式:
                                      1、% 表示用户可以从任何地址连接到服务器
                                      2、localhost 用户只能从本地连接
                                      3、指定一个IP 表示用户只能从此IP连接到服务器
         3、给用户授权
                                  grant 权限列表 on 库.表 to “用户名”@“IP地址” with grant option;
                                    grant all privileges on . to “tiger”@"%" with grant option;
                  权限列表:select,update,delete,insert,alter,drop,create,…
                      库.表: . 表示所有库的所有表
                        ### 写入到 库mysql下的user表, user、host两个字段
         4、练习
                        添加一个授权用户 monkey ,所有人都可以连接,只对 db1库有查询权限
                    1、添加授权用户 monkey
                                     create user “monkey”@"%" identifited by “123456”;
                      2、给 monkey 用户授权
                                           grant select on db1.* to “monkey”@"%" with grant option;
                        3、验证:mysql -hIP地址 -umonkey -p
         5、删除授权用户
                      drop user “用户名”@“IP地址”;
                      drop user “tiger”@"%";
2、数据备份(mysqldump,在Linux终端中操作)
         1、命令格式
                            mysqldump -uroot -p 源库名 > 路径/xxx.sql
         2、示例
                  1、备份db2库
                                     mysqldump -uroot -p db2 > /home/tarena/db2.sql
         3、源库名的表示方式
                    --all-databases 备份所有库
                                          库名 备份单个库
                            -B 库1 库2 … 备份多个库
                        库名 表1 表2 …备份指定库的指定表
         4、练习
                        1、备份所有库 all_mysql.sql,放到用户主目录下的 mydata 目录中
                                     mysqldump -uroot -p --all-databases > ~/mydata/all_mysql.sql
                        2、备份 db2 库中的sheng、city、xian三张表 db2scx.sql
                                           mysqldump -uroot -p db2 sheng city xian > ~/mydata/db2scx.sql
                          3、备份 MOSHOU 和 db2 库,MSdb2.sql
                                         mysqldump -uroot -p -B MOSHOU db2 > ~/mydata/MSdb2.sql
3、数据恢复
         1、命令格式
                            mysql -u用户名 -p 目标库名 < 路径/xxx.sql
         2、示例
                  1、先备份库
                                     mysqldump -uroot -p db2 > db2.sql
                  2、删除库
                               drop database db2;
                  3、先创建空库
                                   create database db2 default charset=utf8;
                  4、恢复命令
                                     mysql -uroot -p db2 < db2.sql
               3、备份分为 完全备份 和 增量备份
                    完全备份:mysqldump
                    增量备份:binlog日志、xbackup工具
         4、从所有库的备份文件中恢复某一个库(–one-database)
                              mysql -u用户名 -p --one-database 目标库名 < all_mysql.sql
                  示例:
                                       mysql -uroot -p --one-database db2 < all_mysql.sql
                  注意:
                           1、恢复库时库中新增的表不会删除
                           2、恢复时必须先创建空库
4、事务和事务回滚
         1、定义
                  一件事从开始发生到结束的整个过程
         2、作用
                  确保数据的一致性
         3、事务和事务回滚的应用
                  1、mysql中默认sql语句会自动commit到数据库
                                 show variables like “autocommit”;
                  2、事务应用
                           1、开启事务
                                        mysql> start transaction;
                                        mysql> … SQL命令
                                      ## 此时autocommit被禁用,SQL命令不会对数据库中数据做修改
                           2、终止事务
                                      mysql> commit;
                                    或者
                                      mysql> rollback;
                           3、注意
                                    1、事务回滚rollback只针对于对表记录的操作,增、删、改,对创建库、创建表的操作无效
                  3、案例
                           1、背景
                                    你:建行卡
                                    你朋友:工商卡
                                    你在建行的自动提款机给你朋友工商卡转5000元
                           2、过程
                                    1、转账中…
                                               1、先到建行的数据库把你的余额 -5000
                                               2、再到工行的数据库把你朋友的余额 +5000
                                               3、commit; 转账成功
                                                          rollback; 回滚,转账失败
                                    2、过程
                                             表1、CCB
                                                          create table CCB(
                                                        name varchar(20),
                                                        money int
                                                      );
                                                            insert into CCB values(“Zhuanqian”,10000);
                                             表2、ICBC
                                                          create table ICBC(
                                                        name varchar(20),
                                                        money int
                                                      );
                                                            insert into ICBC values(“Shouqian”,4000);
                                             开始转账
                                                        mysql>start transaction;
                                                                mysql>update CCB set money=5000 where name=“Zhuanqian”;
                                                              mysql>update ICBC set money= 断电了,宕机了…;
                                                      mysql>rollback;
5、存储引擎
         1、定义
                  是用来处理表的处理器
         2、存储引擎基本操作
                  1、查看已有表的存储引擎
                                       show create table 表名; # engine=…
                  2、创建表时指定存储引擎
                               create table 表名(…)engine=myisam;
                  3、查看所有的存储引擎
                               mysql> show engines;
         3、工作中使用的存储引擎
                      innodb myisam
         4、常用存储引擎特点
                  1、innodb特点
                           1、共享表空间
                                             表名.frm 表结构
                                             表名.ibd 表记录&索引信息
                           2、支持行级锁
                  2、myisam特点
                           1、独享表空间
                                      表名.frm 表结构
                                      表名.myd 表记录
                                      表名.myi 索引信息
                           2、支持表级锁
         5、锁
                  1、加锁的目的
                           解决客户端并发访问的冲突问题
                  2、锁类型
                           读锁(select)共享锁
                                    加读锁之后不能更改表中内容,但可以进行查询
                           写锁(insert,update,delete)互斥锁、排他锁
                  3、锁粒度
                           表级锁
                           行级锁
                           ####操作完成后会自动释放锁
         6、如何决定使用哪种存储引擎
                  1、执行查询操作多的表使用myisam存储引擎(使用innodb浪费资源)
                  2、执行写操作比较多的表使用innodb存储引擎
         7、如何更改表的默认存储引擎
                    1、sudo -i
                    2、cd /etc/mysql/mysql.conf.d/
                    3、vi mysqld.cnf
                        [mysqld]
                                 defalut-storage-engine = myisam
                    4、/etc/init.d/mysql restart
         8、memory存储引擎
                    memory: 表记录存储在内存中
                             表名.frm 表结构
                             ## 服务重启之后表结构在,表记录都消失
6、MySQL调优
         1、选择合适的存储引擎
                  1、经常用来读的表使用myisam存储引擎
                  2、其余的表都用innodb存储引擎
         2、SQL语句调优(尽量避免全表扫描)
                        1、在select where order by常涉及到的字段上建立索引
                    2、where子句中不使用 !=,否则将放弃使用索引进行全表扫描
                  3、尽量避免用NULL值判断,否则会全表扫描
                           示例:
                                                  select id from t1 where number is null;
                           优化:
                                    在number字段设置默认值0
                      4、尽量避免 or 来连接条件,导致全表扫描
                           示例(优化前):
                                                  select id from t1 where id=10 or id=20;
                           优化后:
                                              select id from t1 where id=10
                                      union all
                                              select id from t1 where id=20;
                    5、模糊查询尽量避免使用前置 %,导致全表扫描
                                         select id from t1 where name like “a%”;
                          6、尽量避免 in 和 not in,导致全表扫描
                                       select id from t1 where id in(1,2,3);
                                             select id from t1 where id between 1 and 3;
                          7、尽量避免使用 select * …,要用具体的字段列表代替 *,不要返回用不到的任何字段
7、Python数据库编程
           1、python数据库接口(Python DB-API)
                  1、为开发人员提供的数据库应用编程接口
                  2、支持的数据库服务软件
                           mysql、Oracle、SQL_Server、mongodb…
                  3、python提供的操作mysql模块
                             python3: pymysql
                             python2: MySQLdb
                  4、pymsql模块使用流程
                           1、建立数据库连接
                           2、创建游标对象
                           3、使用游标对象的方法操作数据库
                           4、提交commit
                           5、关闭游标对象
                           6、关闭数据库连接
                  5、建立数据库连接
                           1、语法格式
                                        对象名 = pymysql.connect(“主机地址”,“用户名”,“密码”,“库名”,charset=“utf8”)
                           2、connect连接对象支持的方法
                                      1、cursor() 创建一个游标对象db.cursor()
                                      2、commit() 提交到数据库执行(表记录增删改)
                                      3、rollback() 回滚
                                      4、close() 关闭数据库连接
                           3、游标对象支持的方法
                                      1、execute(“SQL命令”) 执行SQL命令
                                      2、fetchone() 取得结果集的第一条记录
                                          3、fetchmany(n) 取得结果集的 n 条记录
                                      4、fetchall() 取得结果集的所有记录
                                      5、close() 关闭游标对象
  8、Mysql workbench(图形化界面管理工具)
9、ER模型&ER图
         1、定义
                          ER模型即 实体 - 关系 模型
                    ER图即 实体关系图
         2、三个概念
                  1、实体
                  2、属性
                  3、关系
                             1、定义 :实体之间的关系
                           2、分类
                                        一对一关系(1:1) : 班级和班长
                                        一对多关系(1:n) : 公司和职工、班级和学生
                                        多对多关系(m:n) : 学生和课程
                  4、ER图的绘制
                           1、矩形框代表实体,菱形框代表关系,椭圆形代表属性
                             2、见 ER图.png

python操作mysql

'''
    Sql进程池的方式进行连接
    Author: Ribbon Huang
    Date: 2018-07-26
'''
from DBUtils.PooledDB import PooledDB
import conf.settings as Config
import pymysql
from pymysql import DatabaseError
import logging

'''
    记录日常日志
'''
logger = logging.getLogger('sqlError')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
fileHandler = logging.FileHandler('sqlError.log')
fileHandler.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(fileHandler)

'''
    Mysql数据库连接池
'''
class SqlConnectionPool(object):
    __pool = None

    def __enter__(self):
        '''单个用户连接进入连接池后,即可以执行sql语句进行查询'''
        try:
            self.conn = self.__getConn()
            self.cursor = self.conn.cursor()
        except DatabaseError:
            logger.warning('sql connect error')
        except Exception as e:
            logger.warning('sql undefined error' + e)
        return self

    def __getConn(self):
        '''连接池的方式连接mysql资料库'''
        if self.__pool is None:
            self.__pool = PooledDB(creator=pymysql, mincached=Config.DB_MIN_CACHED , maxcached=Config.DB_MAX_CACHED,
                                   maxshared=Config.DB_MAX_SHARED, maxconnections=Config.DB_MAX_CONNECYIONS,
                                   blocking=Config.DB_BLOCKING, maxusage=Config.DB_MAX_USAGE,
                                   setsession=Config.DB_SET_SESSION,
                                   host=Config.DB_TEST_HOST , port=Config.DB_TEST_PORT ,
                                   user=Config.DB_TEST_USER , passwd=Config.DB_TEST_PASSWORD ,
                                   db=Config.DB_TEST_DBNAME , use_unicode=False, charset=Config.DB_CHARSET)

        return self.__pool.connection()

    def __exit__(self, type, value, trace):
        '''连接池的释放'''
        self.cursor.close()
        self.conn.close()

'''
    mysql操作的调用
'''
class SqlUtile:
    def fetchAll(self, sql):
        '''搜索所有符合sql语句查找出来的资料'''
        with SqlConnectionPool() as db:
            try:
                db.cursor.execute(sql)
                results = db.cursor.fetchall()
                return len(results)
            except:
                logger.warning('Error: unable to fecth datas')

    def fetchAllData(self, sql):
        '''搜索所有符合sql语句查找出来的资料'''
        with SqlConnectionPool() as db:
            try:
                db.cursor.execute(sql)
                results = db.cursor.fetchall()
                return results
            except:
                logger.warning('Error: unable to fecth datas')

    def fetchOne(self, sql):
        '''搜索一条sql语句查找出来的资料'''
        with SqlConnectionPool() as db:
            try:
                db.cursor.execute(sql)
                results = db.cursor.fetchone()
                print(results)
            except:
                logger.warning('Error: unable to fecth data')

    def addIp(self, sql ,ips):
        '''对mysql进行添加进资料库的操作'''
        with SqlConnectionPool() as db:
            try:
                for info in ips:
                    param = (info['ip'], info['port'], info['type'])
                    db.cursor.execute(sql, param)
                    db.conn.commit()
            except:
                logger.warning('Error: Unable to add datas')

    def addTest(self, sql ,ip):
        '''对mysql进行添加进资料库的操作'''
        with SqlConnectionPool() as db:
            try:
                param = (ip['ip'], ip['port'], ip['type'])
                db.cursor.execute(sql, param)
                db.conn.commit()
            except:
                logger.warning('Error: Unable to add datas')

    def updateIp(self, sql, ip):
        with SqlConnectionPool() as db:
            try:
                param = (ip['id'],)
                db.cursor.execute(sql, param)
                db.conn.commit()
            except:
                logger.warning('Error: Unable to add datas')

if __name__ == '__main__':
    sql = 'UPDATE useip SET  isuse=0 where id=%s'
    ip = {'id':307}
    db = SqlUtile().updateIp(sql=sql, ip = ip)

logger.removeHandler(fileHandler)

如果觉得这篇文章对你有用,麻烦点赞并关注噢


  1. 0-9 ↩︎

你可能感兴趣的:(个人)