python_MySQL数据库

MySQL数据库的特色:
    一、是关系型数据库
        关系型数据库的特色
            一、数据是以行和列的的形式存储的
            二、这一系列的行和列称为表
            三、表中的每一行叫作记录
            四、表中的每一列叫作字段
            五、表和表之间的逻辑关联叫作关系
            六、关系型数据库的核心内容是:关系 即二维表
        示例:
            一、关系型数据库存储
                表1:学生信息表
                    姓名        年龄        班级
                     aa         20        1712
                     bb         25        1713
                表2:班级信息表
                    班级        班主任
                    1712     曹操    
                    1713     刘备
                说明:要找到学生aa的班主任是谁,须要经过班级字段来找到班主任
            二、非关系型数据库存储(是以键值对的形式存储的)
                {姓名:“aa”,年龄:20,班级:1712,班主任:“曹操”}
            两者之间的比较:
                非关系行数据的性能比较高(查找数据的速度)可是会形成数据的冗余

    二、跨平台
        能够在Unix、Linux、Windows上运行MySQL服务
    三、支持多种语言编程语言
    四、是基于硬盘的读写
MySQL的安装:
    一、Linux系统下安装MySQL服务
        一、安装服务端:sudo apt-get install mysql-server
        二、安装客户端:sudo apt-get install mysql-client
        三、初始的用户名和密码在/etc/mysql/debian.cnf文件中,使用 cd /etc/mysql/ 进去目录,subl debian.cnf 打开查看
启动和链接MySQL服务
    一、服务端启动
        一、查看MySQL服务的状态:sudo /etc/init.d/mysql status
        二、启动MySQL服务:sudo /etc/init.d/mysql start
        三、中止MySQL服务:sudo /etc/init.d/mysql stop
        四、重启MySQL服务:sudo /etc/init.d/mysql restart
    二、客户端连接
        一、命令格式:mysql -h主机名 -u用户名 -p密码(-h和-u后面能够添加空格,-p后面不能够)
            mysql -h localhost -u debian-sys-maint -pLo0r79JmxvMFNtA
        二、本地链接能够省略 -h 选项
            mysql  -u debian-sys-maint -pLo0r79JmxvMFNtA
        三、断开与服务端的链接:exit  quit   \q
基本的SQL命令:
    一、SQL命令的使用规则
        一、每条命令必须以分号(;)结尾(说明中文分号无效)
        二、SQL命令不区分字母大小写
        三、使用\c终止命令的执行
    二、库的管理(指定字符集)
        一、库的基本操做
            一、查看已有的库:show databases;
                (有四个默认的库,不要修改或删除:information_schema,mysql,performance_schema,sys)
            二、建立库:create database 库名 default charset=utf8;
            三、查看建立库的语句:show create database 库名;
                ( CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */)
            四、查看当前所在库:select database();
            五、切换库:use 库名;
            六、查看库中已有的表:show tables;(若是当前的库为NULL则会报错:ERROR 1046 (3D000): No database selected)
            七、删除库:drop database 库名;
        二、库的命名规则
            一、可使用数字、字母、_,可是不能是纯数字
            二、库名区分字母大小写
            三、库名具备惟一性(不能重复)
            四、不能使用特殊字符和mysql关键字
    三、表的管理:
        一、表的基本操做:
            一、建立表:
                create table 表名(
                    字段名1 数据类型,
                    字段名2 数据类型,
                    ....
                )
            二、查看建立表的语句(字符集):show create table 表名;
            三、查看表结构:desc 表名;
            四、删除表:drop table 表名;
        二、注意:
            一、全部的数据都是以文件的形式存储在数据库目录下
            二、数据库目录:/var/lib/mysql
    四、表记录的管理:
        一、在表中插入记录
            一、insert into 表名 values(值1,值2),...  说明:值就是每一个字段对应的值,python

    二、insert into 表名(字段名1,字段名2...)values(值1,值2...)说明:给指定的字段添加值  mysql

    三、insert into 表名 values(一条记录1),(一条记录2)... 说明:能够同时添加多条记录
        二、查看表记录
            一、select * from 表名;*号表明全部的字段
            二、select 字段名1,字段名2,... from 表名;linux

  三、更新表的记录
            一、update 表名 set 字段=值,字段=值,...where 条件;
            二、注意:update语句后若是不加where子句,表中全部记录该字段的值都会更改
        四、删除表记录
            一、delete from 表名 where 条件1 and 条件2;
            二、注意:delete语句后若是不加where子句,表中的全部记录都会被删除面试

    五、如何更改默认字符集:
        一、方法:经过更改Mysql的配置文件实现
        二、步骤:
            一、获取root权限:sudo -i
            二、修改mysql配置文件:vi /etc/mysql/mysql.conf.d/mysqld.cnf
                一、点击a键进入编辑状态
                二、在[mysqld]下 插入character_set_server = utf8
                三、点击Esc键退出编辑状态
                四、点击Shift + :
                四、输入wq命令写入并退出 (输入q!退出不保存)
            三、重启mysql服务:sudo /etc/init.d/mysql restartsql

  说明:更改默认字符集以后,并不影响以前建立好的数据库和数据库中的数据表,要想修改已经建立好的数据库编码和数据表的编码:shell

    数据库:alter database fruit character set utf8;数据库

    数据表:alter table user character set utf8;编程

客户端把数据存储到数据库服务器上的过程(面试会问到)
    一、链接到数据库服务器:mysql -h -u -p
    二、选择库:use 库名;
    三、建立/修改表
    四、断开与数据库的链接:exit 、quit、\q
数据类型:
    一、数值类型(有符号signed 和 无符号 unsigned)
        一、整型
            一、int 大整型(占4个字节):
                    取值范围:0~2**32-1
            二、tinyint 微小整型(占1字节)
                一、有符号(signed默认)取值范围:-128~127
                二、无符号(unsigned) 取值范围:0~2**8-1
            三、smallint 小整型(占2字节)
                取值范围:0~65535
            四、bigint 极大整型(占8字节)
                取值范围:0~2**64-1
        二、浮点型
            一、float(4个字节,最多显示7个有效位)
                一、用法:字段名 float(m,n) m表明总位数,n表明小数位位数
                    float(5,2)取值范围:-999.99~999.99;会根据小数第3位进行四舍五入
                    说明:m总位数不要超过7位,不然7位以后数字会随机生成。
                二、double(8字节,最多显示15个有效位)
                    用法:字段名 double(m,n)
                三、decimal(占M+2个字节,最多显示28个有效位)
                    用法:decimal(M,D)bash

     说明:浮点型插入整数时会自动补全小数位数;
    二、字符类型
        一、char(定长)
            一、宽度取值范围:1~255
            二、不给宽度默认为宽度为1
        二、varchar(变长)(输入要的值不能超过变长值,储存空间根据实际输入的数值来肯定)
            一、取值范围:1~65535
            二、注意:
                一、varchar没有默认宽度,必须给定一个宽度
                二、char和varchar使用时都给宽度,但不能超过各自的范围
            三、char 和 varchar 的特色
                一、char浪费存储空间可是性能高
                二、varchar节省存储空间,性能低(须要计算须要占用的存储空间)
            四、字符类型的宽度和数值类型的宽度的区别
                一、数值类型的宽度为显示宽度,只用于select查询时使用,和占用存储空间的大小无关,可用zerofill查看效果
                二、字符类型的宽度超过则没法存储
    三、枚举类型
        一、定义:字段值只能在列举的范围内选择
        二、enum 单选(最多有65535个不一样的值)
            字段名 enmu(值1,值2,...)
        三、set 多选(最多有64个不一样的值)
            字段名 set(值1,值2,...),插入值的时候每一个值之间用逗号分隔开
    四、日期时间类型
        一、year: 年 YYYY
        二、date:日期 YYYYMMDD
        三、time:时间 HHMMSS
        四、datetime:日期时间 YYYYMMDDHHMMSS
        五、timestamp:时间日期 YYYYMMDDHHMMSS
        六、说明:
            一、datetime 不给值默认返回NULL
            二、timestamp不给值默认返回系统当前时间
表字段的操做:
    一、语法:alter table 表名 执行动做
        一、添加字段(add):
            一、添加到末尾
                alter table 表名 add 字段名 数据类型
            二、添加到开始
                alter table 表名 add 字段名 数据类型 first
            三、添加到指定位置
                alter table 表名 add 字段名 数据类型 after 已有字段名
        二、删除字段(drop):
            alter table 表名 drop 字段名
        三、修改数据类型(modify):
            alter table 表名 modify 字段名 新的数据类型
        四、修改字段名
            alter table 表名 change 旧名 新名 数据类型
        五、修改表名
            alter table 表名 rename 新表名
练习:
    一、填空题:
        一、MySQL中的数据类型有 数值类型、字符类型、枚举类型、日期时间类型
        二、关系型数据库的核心内容是 关系 即 二维表
    二、简答题:
        一、简述客户端把数据存储到数据库服务器上的过程
        答:
            一、链接MySQL服务器数
            二、选择库 use 库名
            三、添加\修改表
            四、断开与数据库的链接 exit | quit | \q
        二、char和varchar的区别?各自的特色
        答:
            一、char(定长),所占用的内容空间已经由定长决定了,虽然多占用内存,可是效率高
            二、varchar(不定长),所占用的内控空间由添加字段的数据自己决定,可是须要计算占用的空间,效率低,省内存
    三、操做题:
        一、建立一个库school
            create database school;
        二、在库中建立表students来存储学生信息,字段以下学生(id)要求显示宽度为3位,不够用0填充
           姓名(name),年龄(age只能为正数)、成绩(score浮点)、性别(sex单选)、爱好(likes多选)、入学时间(年月日)
            use school;
            create table students(
            id int(3) zerofill,
            name char(20),
            age tinyint unsigned,
            score float(4,1),
            sex enum('男','女'),
            likes set('打篮球','学习','购物','打游戏','打仗'),
            go_school_time date
            )default charset = utf8;   
        三、查看students的表结构
            desc students;
        四、在students表中增长一个字段id,加在第一列
            alter table students add kid int first;
        五、在表中任意插入5条记录
            insert into students values(1,1,'曹操',60,80,'男','打仗,打游戏',20000912);
            insert into students values(2,2,'刘备',50,90,'男','打仗,打游戏',20000912);
            insert into students values(3,3,'关羽',45,70,'男','打仗,打游戏',20000912);
            insert into students values(4,4,'张飞',40,60,'男','打仗,打游戏',20000912);
            insert into students values(5,5,'小乔',20,100,'女','学习,购物',20000912);
        六、查看全部学生的姓名、成绩、和入学时间
            select name,score,go_school_time from students;服务器

名词介绍
    一、DB(Database)
        DB就是数据库,存储数据库的仓库
    二、DBMS(Database Management System)
        数据库管理系统
        数据库管理的软件有MySQL、Oracle....
    三、DBS(Database System)
        数据库系统
        DBS = DB(存储)+DBMS(数据库软件)+数据库应用(财务管理系统、人事管理系统)+用户
where 条件子句(配合查、改、删操做)
    一、语法格式:
        select * from 表名 where 条件;
运算符操做(配合查询、修改、删除操做)
    一、数值比较&字符比较:
        一、数值比较运算符:=  !=  > >= < <=
        二、字符比较运算符:=  !=
        三、语法格式:
            查询:select * from 表名 where 字段名 运算符 数字/字符;
            修改:update 表名 set 字段名=值,...where 字段名 运算符 数字/字符;
            删除:delete from 表名 where 字段名 运算符 数字/字符;
    二、逻辑比较:
        一、运算符:
            and(多个条件同时知足)
            or(多个条件有一个条件知足就能够)
    三、范围内比较:
        一、运算符:between and 、 in 、not in
        二、语法格式
            字段名 between 值1 and 值2(包括值1和值2)
            字段名 in(值1,值2,...)
            字段名 not in (值1,值2,...)
    四、匹配空、非空
        一、空:is null
        二、非空:is not null
        三、注意:
            一、null:空值,必须用is 或者is not 去匹配
            二、‘’:空字符串,用 = 或者 !=  去匹配
    五、模糊比较
        一、语法格式:字段名 like 表达式
        二、表达式
            一、_:匹配单个字符
            二、%:匹配0到多个字符,不能是NULL
SQL查询:
    一、总结(执行顺序)
        完整的语句:select ...聚合函数 from ... where ... group by...having ... order by ...limit...;
        上面语句的执行顺序:一、where 二、group by 三、select...聚合函数 from 四、having 五、order by 六、limit
    二、order by  
        一、做用:对查询的结果进行排序
        二、语法格式:order by 字段名 排序方式;
        三、排序方式:
            一、ASC(默认):升序
            二、DESC:降序
            三、说明:这个排序方式不区分大小写(asc,desc)
    三、limit (永远放在SQL语句的最后面)
        一、做用:限制显示查询记录的条数
        二、用法
            一、limit n   :显示n条记录
            二、limit m n :从m+1条记录开始显示,n表示显示显示几条记录
                示例:limit 1,3 :显示2,3,4三条记录        
            三、练习
                一、查找防护值倒数第二名至倒数第四名的蜀国英雄记录
            select * from sanguo where country='蜀国' order by fangyu asc limit 1,3;
                二、查找攻击值前三名且名字不为空值的蜀国英雄的姓名,攻击值和国家
            select name,gongji,country from sanguo where country='蜀国' and name is not NULL order by gongji desc  limit 3;
    四、聚合函数:
        一、分类
            一、avg(字段名):求字段的平均值
            二、sum(字段名):求字段的和
            三、max(字段名):求字段的最大值
            四、min(字段名):求字段的最小值
            五、count(字段名)统计该字段记录的个数(空值NULL不会被统计,‘’能够被统计)
        二、练习:
            一、攻击力最强值
            select max(gongji) from sanguo;(默认的将max(gongji)作为字段名,能够经过as 来修改)
            二、统计一下表中id,name字段分别有多少条记录
            select count(id) as,c_id count(name) as c_name from sanguo;
            三、计算蜀国英雄的总攻击力
            select sum(gongji) from sanguo where country='蜀国';
            四、统计蜀国英雄中攻击力大于200的英雄数量
            select count(*) from sanguo where country='蜀国' and gongji >200;
    五、group by
        一、做用:给查询的结果进行分组
        二、练习
            一、查询sanguo表中一共有几个国家
            select country from sanguo group by country;
            二、计算全部国家的平均攻击力
            select country,avg(gongji)from sanguo group by country;
            三、查找全部国家中 英雄数量最多的 前2名 的国家的名称和英雄数量
            select country,count(*) from sanguo group by country order by count(*) desc limit 2;
        三、注意:
            一、group by以后的字段必需要为select以后的字段
            二、若是select以后的字段和group by以后的字段不一致,则必需要对select以后的该字段作聚合处理
    六、having
        一、做用:对查询的结果进行进一步的筛选
        二、练习
            一、找出平均攻击力大于105的国家的前两名,显示国家名和平均攻击力
            select country,avg(gongji) from sanguo group by country having avg(gongji)>105 order by avg(gongji) desc limit 2;
        三、注意:
            一、having语句一般与group by 语句联合使用,用来过滤由group by语句返回的记录集
            二、having语句的存在弥补了where关键字不能与聚合函数联合使用的不足,having操做聚合函数生成的显示列
            三、where只能操做表中实际存在的字段,having能够操做聚合函数生成的显示列
    七、distinct
        一、做用:不显示字段的重复值
        二、练习:
            一、sanguo表中一共有多少个国家
            select distinct country from sanguo;
            二、计算蜀国一共有多少个英雄
            select count(distinct id) from sanguo where country='蜀国';
        三、注意
            一、distinct处理的是distinct和from之间的全部字段,全部字段值必须所有相同才能去重
            二、distinct不能对任何字段作聚合处理
    八、在查询表记录时作数学运算
        一、运算符: +  - *  / %
        二、练习:
            一、查询时显示全部英雄的防护力+5
            select id,name,fangyu+5 from sanguo;
约束
    一、做用:为了保证数据的完整性、一致性、有效性
    二、约束分类
        一、默认约束(default)
            一、做用:在插入记录时,若是不给字段赋值,则使用默认值
            二、格式:字段名 数据类型 default 默认值
        二、非空约束(not null)
            一、做用:不容许将该字段设置为null
            二、格式:字段名 数据类型 not null
索引
    一、定义:对数据库中表的一列或者多列的值进行排序的一种结构(MySQL中用Btree方式(二叉树))
    二、优势:加快数据的检索速度
    三、缺点
        一、当对表中的数据进行增长、删除或修改的时候,索引也要动态维护,下降了数据的维护速度
        二、索引须要占用物理空间
    四、索引分类
        一、普通索引(index)
            一、使用规则:
                一、一个表中能够有多个index字段
                二、字段的值能够有重复,且能够为null值
                三、常常把作查询条件的字段设置为index字段
                四、index字段的key标志是MUL
            二、建立index
                一、建立表时建立:index (字段名1),index(字段名2)
                    create table t2(
                    id int,
                    name char(15),
                    age tinyint unsigned,
                    index(id),inedx(name));
                二、在已有表中建立index
                    一、语法:
                        create index 索引名 on 表名(字段名)
                         create index age on t2(age);
                    二、注意:
                        索引名通常和字段名同样
            三、查看普通索引
                一、经过desc 表名 -----→查看key标志
                二、show index from 表名;
            四、删除普通索引
                drop index 索引名 on 表名;
        二、惟一索引(unique key)
            一、使用规则
                一、一个表中能够有多个unique字段
                二、unique字段的值不容许重复,但能够为空
                三、unique的key标志是UNI
            二、建立惟一索引
                一、建立表的时候建立
                    方法一、unique (字段名1),unique(字段名2)
                    方法二、字段名 数据类型 unique
                二、在已有表中建立
                    create unique index 索引名 on 表名(字段名);

      示例:create unique index name on user(name);
            三、删除惟一索引
                drop index 索引名 on 表名;
            注意:index unique在删除时只能一个一个删
        三、主键索引(primary key)
            一、使用规则
                一、一个表中只能有一个主键字段
                二、对应字段的值不能重复,且不能为空
                三、主键字段的key标志为PRI
                四、把表中可以惟一标识一个一条记录的字段设置为主键,一般把表中记录编号的字段设置为主键
            二、建立主键(primary key)
                一、在建立表时
                    一、字段名 数据类型 primary key ;
                    二、primary key (字段名)
                    三、primary key (字段名1,字段名2):复合主键,当字段1,2的值都相同时才算相同,通常不用
                二、在已有表中建立
                    一、alter table 表名 add primary key(字段名)
                三、删除
                    一、alter table 表名 drop primary key  
                    说明:删除主键后把不能重复的特性删掉了,可是不能为空的特性还在
                四、自增加属性(auto_increment)
                    一、做用:一般和主键字段一块儿配合使用
                    二、建立
                        一、在建立表的时候建立
                            字段名 数据类型 primary key auto_increment
                        二、在已有表中建立
                            alter table 表名 modify 字段名 数据类型 primary key auto_increment;
                    三、说明:有自增加属性的字段在插入记录时能够用0来补位,值从1开始逐一递增,若是字段填入的值比表中最后一个的值大
                            那么他们之间的值将不存在。
                五、删除主键及自增加属性
                    一、alter table 表名 modify 字段名 数据类型 ;(先删除自增加属性)
                    二、alter table 表名 drop primary key;
        四、外键索引(foreign key)
            一、定义:让当前表的字段值在另外一张表的范围内选择
            二、语法格式:
                foreign key (参考字段名) reference 被参考表名(被参考字段名) on delete 级联动做 on update 级联动做
            三、案例:
                表1:缴费信息表(财务)
                    学号        姓名            班级        缴费金额
                     1     唐伯虎        1712     20000
                     2     秋香            1712     19000
                表2:学生信息表(班主任)
                    学号        姓名            缴费金额
                     1      唐伯虎         20000
                create table jftab(
                id int primary key,
                name char(20),
                class char(7),
                money int
                )default charset=utf8;
                create table bjtab(
                -> stu_id int,
                -> name varchar(15),
                -> money int,
                -> foreign key(stu_id) references jftab(id) on delete cascade on update cascade
                -> )default charset=utf8;
            四、删除外键
                一、语法格式:
                    alter table 表名 drop foreign key  外键名(bjtab_ibfk_1);
                二、注意
                    查看外键的方式:
                    show create table 表名;(查看 CONSTRAINT `bjtab_ibfk_1`)
            五、在已有表中添加外键
                alter table 表名 add foreign key(参考字段名)references 被参考表名(被参考字段名)on delete 级联动做 on update 级联动做
                说明:在已有表中添加外键时,会受到表中原有数据的限制
            六、级联动做
                一、cascade:数据级联更新
                    一、当主表删除记录时,若是从表有相关联记录则级联删除
                    二、当主表更新被参考字段值时,从表级联更新参考字段值
                二、restrict(默认)
                    一、当主表删除记录时,若是从表中有相关联记录,则不容许主表删除
                    二、当主表更新被参考字段值时,若是自从表有参考字段,则不容许更新
                三、set null
                    一、当主表删除记录时,从表中相关联记录外键字段值变为null
                    二、update同理
                四、no action
                    同restrict同样,都是当即检查外键限制
            七、使用规则
                一、两张表被参考字段和参考字段的数据类型要一致
                二、被参考字段必须是key的一种,一般是primary key

    五、在哪些字段上面适合添加索引
        一、在较为频繁的做为查询条件的字段应该建立索引
        二、惟一性太差的字段不适合单首创建索引,好比性别
        三、更新太频繁的字段不适合建立索引
        四、不会出如今where子句中的字段不适合建立索引
    六、注意事项
        一、建立一个复合索引后,查询只用到了其中的一个字段则不会使用索引
            建立复合索引:create index fangyu_country on sanguo(fangyu,country);
            explain能够帮助咱们在不真正执行某个SQL语句的时候,就能够分析sql语句
            mysql> explain select * from sanguo where country="蜀国"\G
                *************************** 1. row ***************************
                           id: 1         #查询序列
                  select_type: SIMPLE    #查询类型
                        table: sanguo    #查询表名
                   partitions: NULL      
                         type: ALL       #扫描方式,ALL表示全表扫描    
                possible_keys: NULL      #可能使用到的索引
                          key: NULL      #实际使用到的索引
                      key_len: NULL      #使用索引的个数   
                          ref: NULL
                         rows: 8         #SQL语句扫描的行数
                     filtered: 12.50
                        Extra: Using where
                1 row in set, 1 warning (0.00 sec)
        二、使用模糊查询时不会使用到索引
        三、若是查询语句中使用了or只要其中一个条件没有索引,则查询时则不会使用索引

数据导入
    一、做用:将文件系统的内容导入到数据库中
    二、语法格式:
        一、load data infile '文件名' into table 表名 fields terminated by '分隔符' lines terminated by '分隔符';
        说明:文件为绝对路径
    三、xdl:     x:   1000:1000:xdl,,,:/home/xdl:/bin/bash(使用cat /etc/passwd | grep "xdl";命令查看)
        用户名:密码:UID:GID:   描述:   家目录:  登陆权限
    四、把/ect/passwd/ 导入到MySQL数据库中
    五、操做步骤:
        一、在数据库中建立对应的表:
            create table userinfo(
            -> username char(20),
            -> password char(1),
            -> uid int,
            -> gid int,
            -> comment varchar(50),
            -> homedir varchar(50),
            -> shell varchar(50)
            -> );
        二、查看数据库的默认搜索路径:
            show variables like 'secure_file_priv';
        三、将系统文件拷贝到数据库的默认搜索路径中
            sudo cp /etc/passwd /var/lib/mysql-files
        四、将数据导入表中
            load data infile '/var/lib/mysql-files/passwd'
            -> into table userinfo
            -> fields terminated by ':'
            -> lines terminated by '\n';
数据导出
    一、做用:将数据库中表的记录保存到系统文件中
    二、语法格式:
        select ... from 表名 into outfile '文件名' fields terminated by '分隔符' lines teriminated by '分隔符'
    三、练习:
        一、把userinfo 表中的用户名,密码,和uid号三个字段导出到userinfo.txt中
           select username,password,uid from userinfo
        -> into outfile '/var/lib/mysql-files/userinfo.txt'
        -> fields terminated by '   '
        -> lines terminated by '\n';
        二、将库名为mysql库中的user表中的User,Host两个字段的值导出到user2.txt
            select User,Host from user
            -> into outfile '/var/lib/mysql-files/user2.txt'
            -> fields terminated by '   '
            -> lines terminated by '\n';
    四、注意:
        一、导出的内容由SQL查询语句决定
        二、执行导出命令时路径必须指定在对应的数据库目录下
        三、show variables like 'secuer_file_priv';查询路径
表的复制
    一、表的复制
        一、语法格式
            create table 表名 select 查询命令;
        二、练习
            一、复制userinfo表中的数据到userinfo2表中
                create table userinfo2 select * from userinfo;
            二、复制userinfo表的前10行记录到uesrinfo3中
                create table userinfo3 select * from userinfo limit 10;
            三、复制userinfo表的用户名、密码、uid三个字段的2~10条记录到userinfo4中
                create table userinfo4 select username,password,uid from userinfo limit 1,9;
        二、只复制表结构
            一、语法格式
                create table 表名 select...where false;
        三、注意复制表的时候不会把原有表的 键 属性赋值过来
嵌套查询
    一、定义:把内层的查询结果做为外层查询的条件
    二、语法格式:
        select 查询语句 where 条件 (select 查询语句)
    三、练习:
        一、把uid的值小于这个字段的平均值的用户和uid显示出来
            方法1:select avg(uid) from userinfo;
                  select ussername,uid from userinfo where uid < 第一条查询的结果
            方法2:
            select username,uid from userinfo where uid < (select avg(uid) as vag_uid from userinfo);
        二、查找userinfo表中用户名在mysql库下的user表中Host值为localhost而且User值为root的 用户名
            select username from userinfo where username in (select User from mysql.user where Host='localhost' and User='root')
多表查询
    一、两种方式:
        一、select 字段名列表 from 表名列表;(笛卡尔积)
            select * from tt2,tt3;
        二、select 字段名列表 from 表名列表 where 条件
            select * from tt2,tt3 where tt2.uid = tt3.uid;
    二、练习
        一、显示省和市的信息
            select sheng.S_name,city.C_name from sheng,city where sheng.S_ID = city.CFather_ID;
        二、显示省、市、县的信息
            select sheng.S_name,city.C_name,xian.X_name from sheng,city,xian where sheng.S_ID=city.CFather_ID and city.C_ID=xian.XFather_ID;
链接查询
    一、内链接
        一、定义:从表中删除与其余被链接表中没有匹配到的行
        二、语法格式
            select 字段名列表 from 表1 inner join 表2 on 条件
        三、练习
            一、显示省、市信息
            select sheng.S_name,city.C_name from sheng inner join city on sheng.S_ID = city.CFather_ID;
            二、显示省、市、县的信息
            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;

    二、外链接
        一、左链接
            一、定义:以左表为主显示查询结果
            二、语法:
                select 字段名列表 from 表1 left join 表2 on 条件
            三、练习:
                一、显示省市信息
                select sheng.S_name,city.C_name from sheng left join city  on sheng.S_ID = city.CFather_ID;
        二、右链接
            一、定义:以右表为主显示查询结果
            二、语法:
                select 字段名列表 from 表1 right join 表2 on 条件
            三、练习
                一、显示省市信息
                select sheng.S_name,city.C_name from sheng right join city on sheng.S_ID = city.CFather_ID;
                二、显示省市县的信息,要求市所有显示
                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;

数据备份(在linux终端下操做)
    一、命令格式:
        mysqldump -u用户名 -p 源库名 >  路径/xxx.sql:
    二、源库名的表示方式
        --all-database        备份全部库
        库名                    备份单个库
        -B 库1 库2 ...         备份多个库
        库名 表1 表2         备份指定库的指定表
    三、练习
        一、备份全部库为all_mysql.sql放到主目录下mydata目录中
        mysqldump -u debian-sys-maint -p --all-databases > ~/mydata/all_mysql.sql
        二、备份三个库,放到mydata目录中
        mysqldump -u debian-sys-maint -p -B db1 db2 db3 > ~/mydata/db1_db2_db3.sql
        三、备份省市县的三张表
        mysqldump -u debian-sys-maint -p db3 sheng city xian > ~/mydata/sheng_city_xian.sql
数据恢复(在linux终端下操做)
    一、命令格式
        mysql -u用户名 -p 目标库名 < 路径/xxx.sql
    二、从全部备份文件中恢复指定库(--one-database)    
        mysql -u用户名 -p --one-database 目标库 < 路径/xxx.sql
        说明:目标库必须是全部备份中存在的库名
    三、练习
        一、先备份db3库,删除省市县三张表,
            drop table sheng,city,xian;
        二、在db3库中建立一张新表t88888
            create table t88888(id int);
        三、恢复db3库
    四、注意
        一、恢复时若是恢复到原有库会将表中数据覆盖,新增的表不会被删除
        二、在恢复时若是恢复的库不存在,则先要建立空库
ER模型&ER图
    一、定义:ER模型就是实体——关系模型,ER图就是实体-关系图
    二、三个概念
        一、实体
            一、定义:现实世界中任何能够被认知、区分的实物
            二、示例
                一、学校:学生、教师、课程、班主任...
                二、企业:职工、产品...
        二、属性
            一、定义:实体所具备的特性
            二、示例
                一、学生属性:学号、姓名、年龄、性别、专业...
                二、产品属性:产品编号、产品名称、规格...
        三、关系
            一、定义:实体之间的关系
            二、分类
                一、一对一关系(1:1):班级和班长
                二、一对多关系(1:n):公司和职工、班级和学生
                三、多对多关系(m:n):学生和课程、商店和顾客
        四、ER图的绘制
            一、矩形框表明实体、菱形框表明关系、椭圆形表明属性。
            二、示例:
                学生选课系统

workbench(图形化界面操做数据库)
事务&事务回滚
    一、事务定义:一件事从开始到结束的整个过程
    二、属性
        一、原子性:
            一个事务是不可分割的工做单位,事务中各个操做要么都作,要么都不作
        二、一致性:
            事务必须从一个一致性状态到另外一个一致性状态
        三、隔离性:
            一个事务的执行不能被其余并发事务干扰
        四、持久性:
            一个事物一旦提交,它对数据的改变是永久性的
    三、事务及事务回滚的应用:
        一、mysql中默认sql语句会自动commit到数据库
            show variables like ‘autocommit’;
        二、事务应用
            一、开启事务:
                mysql> start transaction;#此时autocommit被禁用,SQL语句不会对数据库中数据作修改
            二、终止事务;
                一、mysql> commit;
                二、mysql> rollback;
            三、注意:
                事务和事务回滚只针对对表记录的操做:增长、删除、修改,对建立库、建立表、查询表记录是无效的
python数据库编程
    一、python数据库接口(Python DB-API)
        一、定义:为开发人员提供的数据库应用编程接口
        二、python支持的数据库服务软件
            MySQL、Oracle、SQL_Server、Sybase、Mogodb
        三、Python提供的操做MySQL的模块
            模块名:pymysql
        四、pymysql的使用流程
            一、先创建数据库链接
            二、建立游标对象
            三、使用游标对象的方法和SQL语句操做mysql数据库
            四、提交commit
            五、关闭游标
            六、关闭数据库链接

import pymysql
#打开数据库链接
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2',charset='utf8')
#建立一个游标对象
cur = db.cursor()
#建立一个库
cur.execute('create database if not exists python;')
#切换库
cur.execute('use python;')
#建立一个表
cur.execute('create table if not exists t1(id int primary key,name varchar(20),score tinyint unsigned)default charset=utf8;')
#插入5条记录
cur.execute("insert into t1 values(1,'貂蝉',88),(2,'赵子龙',100),(3,'诸葛亮',80),(4,'张飞',60),(5,'司马懿',99);")
#提交
db.commit()
#关闭游标
cur.close()
#关闭数据库链接
db.close()
View Code

        五、须要安装pymysql模块
            一、安装pip3:sudo apt install python3-pip
            二、安装pymysql:pip3 install pymysql
        六、创建数据库链接:
            一、语法格式:
                对象名=pymysql.connect('主机名','用户名','密码','库名',port=3306,charset='utf8')
            二、connect对象(db)的方法
                一、cursor()    建立一个游标对象:db.cursor()
                二、commit()    提交到数据库 db.commit()
                三、rollback()    回滚 db.rollback()
                四、close()        关闭与数据库的链接 db.close()
            三、cursor游标对象(cur)的方法
                一、execute()        执行sql命令
                二、fetchone()        取得结果集的第一条记录

import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8')

cur = db.cursor()

sql_select = 'select * from t1;'

cur.execute(sql_select)

data = cur.fetchone()

print('fetchone的结果为:',data) #fetchone的结果为: (1, '貂蝉', 88)

db.commit()
cur.close()
db.close()
View Code

                三、fetchmany(数字)    取得结果集的第几条记录

import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8')

cur = db.cursor()

sql_select = 'select * from t1;'

cur.execute(sql_select)

data = cur.fetchmany(3)
all_data = cur.fetchall()

print('fetchmany的结果为:',data)#fetchmany的结果为: ((1, '貂蝉', 88), (2, '赵子龙', 100), (3, '诸葛亮', 80))
print('fetchall的结果为:',all_data)
db.commit()
cur.close()
db.close()
View Code

                四、fetchall()        取得结果集的全部行
                五、close()            关闭游标对象
                属性:rowcount :    返回命令执行影响的条数

import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8')

cur = db.cursor()

sql_select = 'select * from t1;'
print('命令影响的条数:',cur.rowcount)

cur.execute(sql_select)
all_data = cur.fetchall()


print('fetchall的结果为:',all_data)#fetchall的结果为: ((1, '貂蝉', 88), (2, '赵子龙', 100), (3, '诸葛亮', 80), (4, '张飞', 60), (5, '司马懿', 99))

db.commit()
cur.close()
db.close()
View Code
#rollback.py
import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','db3',charset='utf8')
cur = db.cursor()

try:
    cur.execute("update CCB set money = 95000 where name='转钱';")
    cur.execute("update ICBC set money = 7000 where name= '借钱';")

    db.commit()
    print('ok')

except Exception as e:
    db.rollback()
    print("出现错误已经回滚")
cur.close()
db.close()
View Code
from pymysql import *

class MysqlPython:

    def __init__(self,host,user,password,db,port,charset='utf8'):
        self.host = host
        self.user = user
        self.pwd = password
        self.db = db
        self.port = port
        self.charset = charset

    def open(self):
        '''建立与数据库的链接'''
        self.conn = connect(self.host,self.user,self.pwd,self.db,self.port,charset=self.charset)
        #建立游标
        self.cur = self.conn.cursor()

    def close(self):
        '''关闭游标、关闭与数据库的链接'''
        self.cur.close()
        self.conn.close()

    def myexecute(self,sql):
        '''执行SQL命令'''
        self.open()
        try:
            self.cur.execute(sql)
            self.conn.commit()    
            print('操做成功')
        except Exception as e:
            self.conn.rollback()
            print('出现错误,已经回滚:',e)

    def myFetchone(self,sql):
        '''获得一条记录'''
        try:
            self.open()
            self.cur.execute(sql)
            data = self.cur.fetchone()
            return data
        except Exception as e:
            print('出现错误:',e)

    def myFetchmany(self,sql,n):
        '''获得多条记录'''
        try:
            self.open()
            self.cur.execute(sql)
            data = self.cur.fetchmany(n)
            return data
        except Exception as e:
            print('出现错误:',e)

    def myFetchall(self,sql):
        '''获得所有记录'''
        try:
            self.open()
            self.cur.execute(sql)
            data = self.cur.fetchall()
            return data
        except Exception as e:
            print('出现错误:',e)
View Code
#test.py

from MysqlPython import MysqlPython

# name = input("请输入要修改为绩的学生姓名:")
# score = int(input("请输入新的成绩:"))

# sql = "update t1 set score=%s where name='%s';"%(score,name)
# mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306)

# mp.myexecute(sql)
# mp.close()

sql = "select * from t1"
mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306)
data = mp.myFetchone(sql)
print(data)
mp.close()


data = mp.myFetchmany(sql,3)
print(data)

data = mp.myFetchall(sql)
print(data)
View Code

select user_id,count(*) from comment group by user_id order by count(*) desc limit 10;
思路:首先找到全部的用户,按用户分组,按评论的文章计数而后降序,取前10条记录

TCL(事务控制语言)

1.事务Transaction:要么一块儿成功,要么一块儿失败.

2.事务的开始

  一个事务的结束,就是下一个事务的开始

3.事务的结束

  DDL(数据定义语言)语句可以自动提交事务:create, drop, alter

  DML(数据操纵语言)语句不会自动提交事务:insert, delete,update,select

4.commit:提交

5.rollback:回滚

相关文章
相关标签/搜索