Python全栈开发之MySQL51CTO博客 - 牛牛娱乐

Python全栈开发之MySQL51CTO博客

2019年03月05日09时05分26秒 | 作者: 智刚 | 标签: 效劳,查询,数据 | 浏览: 2263

No.1 数据库概念 什么是数据库?

数据库就是一种特别的文件,内部存储着需求的数据

RDBMS

所谓联系数据库,是树立在联系模型根底的数据库,借助于调集代数等数学概念和办法来处理数据库中的数据

SQL

SQL是结构化言语,是一种用来操作联系数据库的数据库言语,

SQL句子 阐明 举例
DQL 数据查询言语 select
DML 数据操作言语 insert、update、delete
TPL 事物处理言语 begin、transaction、commit、rollback
DCL 数据操控言语 grant、revoke
DDL 数据界说言语 create、drop
CCL 指针操控言语 declare、cursor
MySQL

MySQL是一个联系数据库办理系统

特色:

  • 运用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更改功用
  • 仿制大局业务标识
  • 仿制无溃散从机
  • 仿制多线程从机
No.2 数据完好性

一个数据库就是一个完好的业务单元,能够包含多张表,在表中为了愈加精准的存储数据,确保数据的正确性,能够在创立表的时分,为表添加一些强制性的验证,包含数据类型、束缚

数据类型
  • 整数:int,bit

  • 小数:decimal

  • 字符串:varchar,char

  • 日期时刻: date, time, datetime

  • 枚举类型(enum)

  • decimal表明浮点数,如decimal(5,2)表明共存5位数,小数占2位

  • char表明固定长度的字符串,如char(3),假如填充ab时会补一个空格

  • varchar表明可变长度的字符串,如varchar(3),填充ab时就会存储ab

  • 字符串text表明存储大文本,当字符大于4000时引荐运用

  • 关于图片、音频、视频等文件,不存储在数据库中,而是上传到某个效劳器上,然后在表中存储这个文件的保存途径
数值类型
类型 字节巨细 有符号规模(Signed) 无符号规模(Unsigned)
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
INT/INTEGER 4 -2147483648 ~2147483647 0 ~ 4294967295
BIGINT 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615
字符串
类型 字节巨细 示例
CHAR 0-255 类型:char(3) 输入 ab, 实践存储为ab , 输入abcd 实践存储为 abc
VARCHAR 0-255 类型:varchar(3) 输 ab,实践存储为ab, 输入abcd,实践存储为abc
TEXT 0-65535 大文本

日期时刻类型

类型 字节巨细 示例
DATE 4 2020-01-01
TIME 3 12:29:59
DATETIME 8 2020-01-01 12:29:59
YEAR 1 2017
TIMESTAMP 4 1970-01-01 00:00:01 UTC ~ 2038-01-01 00:00:01 UTC
束缚
  • 主键primary key:物理上存储的次序
  • 非空not null:此字段不允许填写空值
  • 专一unique:此字段的值不允许重复
  • 默许default:当不填写此值时会运用默许值,假如填写时以填写为准
  • 外键foreign key:对联系字段进行束缚,当为联系字段填写值时,会到相关的表中查询此值是否存在,假如存在则填写成功,假如不存在则填写失利并抛出反常
No.3 命令行脚本 数据库操作
show databases; 检查数据库
use 数据库名; 运用数据库
select database(); 检查当时运用的数据库
create database 数据库名 charset=utf8; 创立数据库
drop database 数据库名; 删去数据库
数据表操作
show tables; 检查当时数据库中的一切表
desc 表名; 检查表结构
创立表
create table students(
  id int unsingned primary key auto_increment not null,
  name varchar(20) default ,
  age int unsingned default 0,
  height descimal(3,2) default 1.8,
  gender enum(男,女) default 男
)
alter table 表名 add 列名 类型; 添加字段
alter table 表名 change 类型及束缚; 修正字段
alter table 表名 change 原名 新名 类型及束缚; 修正字段(重命姓名段)
alter table 表名 drop 列名; 删去字段
drop table 表名; 删去表
show create table 表名; 检查表的创立句子
数据增修正查

insert into 表名 values(); 悉数列刺进
insert into 表名(列1,...) values(); 部摆放刺进
insert into 表名(列1,...) values(),...; 刺进多条数据

delete from 表名 where 条件; 删去删选出的数据

update 表名 set 列1=值1,列2=值2... where 条件; 修正数据

select 列1,列2,... from 表名; 查询数据
数据备份与康复

备份

mysqldump –uroot –p 数据库名 > 数据库名.sql;

康复

创立新的数据库
mysql -uroot –p 新数据库名 < 数据库名.sql
No.4 数据库规划

联系型数据库主张在E-R模型的根底上,咱们需求依据产品司理的规划策划,抽取出来模型与联系,拟定出表结构,这是项目开端的榜首步,在开发中有许多规划数据库的软件,常用的如power designer,db desinger等,这些软件能够直观的看到实体及实体间的联系,规划数据库,可能是由专门的数据库规划人员完结,也可能是由开发组成员完结,一般是项目司理带领组员来完结

三范式

经过研讨和对运用中问题的总结,关于规划数据库提出了一些标准,这些标准被称为范式

榜首范式(1NF) 着重的是列的原子性,即列不能够再分红其他几列

第二范式(2NF) 首先是 1NF,别的包含两部分内容,一是表有必要有一个主键;二是没有包含在主键中的列有必要彻底依靠于主键,而不能只依靠于主键的一部分

第三范式(3NF) 首先是 2NF,别的非主键列有必要直接依靠于主键,不能存在传递依靠。即不能存在:非主键列 A 依靠于非主键列 B,非主键列 B 依靠于主键的状况

E-R模型
  • E表明entry,实体,规划实体就像界说一个类相同,指定从哪些方面描绘目标,一个实体转换为数据库中的一个表

  • R表明relationship,联系,联系描绘两个实体之间的对应规矩,联系的类型包含包含一对一、一对多、多对多

  • 联系也是一种数据,需求经过一个字段存储在表中

  • 实体A对实体B为1对1,则在表A或表B中创立一个字段,存储另一个表的主键值

  • 实体A对实体B为1对多:在表B中创立一个字段,存储表A的主键值

  • 实体A对实体B为多对多:新建一张表C,这个表只需两个字段,一个用于存储A的主键值,一个用于存储B的主键值
逻辑删去
  • 关于重要数据,并不期望物理删去,一旦删去,数据无法找回
  • 删去计划:设置isDelete的列,类型为bit,表明逻辑删去,默许值为0
  • 关于非重要数据,能够进行物理删去
  • 数据的重要性,要依据实践开发决议
No.5 MySQL查询 预备测验数据
创立数据库
create database python charset=utf8;
运用数据库
use python;
创立students表
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,
  is_delete bit default 0
);
创立classes表
create table classes (
  id int unsigned auto_increment primary key not null,
  name varchar(30) not null
);
向students表中刺进数据
insert into students values
(0,小明,18,180.00,2,1,0),
(0,小月月,18,180.00,2,2,1),
(0,彭于晏,29,185.00,1,1,0),
(0,刘德华,59,175.00,1,2,1),
(0,黄蓉,38,160.00,2,1,0),
(0,凤姐,28,150.00,4,2,1),
(0,王祖贤,18,172.00,2,1,1),
(0,周杰伦,36,NULL,1,1,0),
(0,程坤,27,181.00,1,2,0),
(0,刘亦菲,25,166.00,2,2,0),
(0,金星,33,162.00,3,3,1),
(0,静香,12,180.00,2,4,0),
(0,郭靖,12,170.00,1,4,0),
(0,周杰,34,176.00,2,5,0);
向classes表中刺进数据
insert into classes values (0, "python_01期"), (0, "python_02期");

查询一切字段

select * from students;

查询指定字段

select name from students;

运用as给字段起别号

select id as 序号,name as 姓名,gender as 性别 from students;

运用as给表起别号

select s.id,s.name from students as s;

消除重复行

select distinct gender from students;
条件

运用where子句对表中的数据挑选,成果为True的行会呈现在成果会集

where后边支撑比较运算符、逻辑运算符、含糊查询、规模查询、空判别

比较运算符

  • 等于: =

  • 大于: >

  • 大于等于: >=

  • 小于: <

  • 小于等于: <=

  • 不等于: != 或 <>
select * from students where id > 3; 查询id大于3的学生
select * from students where id <= 4; 查询小于等于4的学生
select * from students where name != 黄蓉; 查询姓名不是黄蓉的
select * from students where is_delete=0; 查询没有被删去的

逻辑运算符

  • and
  • or
  • not
select * from students where id > 3 and gender=0; 查询id大于3的女同学
select * from students where id < 4 or is_delete=0; 查询id<4没被删去的同学

含糊查询

  • like
  • %表明恣意多个恣意字符
  • _表明一个恣意字符
select * from students where name like 黄%; 查询姓黄的同学
select * from students where name like 李_; 查询姓黄而且姓名是两个字的同学
select * from students where name like 黄% or name like %泽; 查询姓黄的或许最终一个字是泽的同学

规模查询

  • in表明在一个非接连的规模内
  • between ... and ...表明在一个接连的规模内
select * from students where id in(1,4,5); 查询id是1或许4或许5的同学
select * from students where id between 3 and 7; 查询id为3到8的同学

空判别

  • 留意:null与是不同的
  • 判空is null
select * from students where height is null; 查询没有填写身高的同学
select * from students where height is not null; 查询填写了身高的同学

优先级

  • 优先级由高到低的次序为:小括号,not,比较运算符,逻辑运算符
  • and比or先运算,假如一起呈现并期望先算or,需求结合()运用
排序

语法

select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]

阐明

  • 将数据先依照列1进行排序,假如列1相同,依照列2,以此类推
  • asc从小到大摆放,即升序(默许)
  • desc从大到小排序,即降序
select * from students where gender=1 and is_delete=0 order by id asc; 查询未删去的男生升序摆放
select * from students order by age desc,height desc;查询一切同学,按年纪排序,年纪相同的按身高排序
聚合

总数

select count(*) from students; 查询表中总共有多少条数据

最大值

select max(age) from students where gender=1; 查询一切男生中最老的

最小值

select min(age) from students where gender=2; 查询一切女生中年纪最小的

求和

select sum(age) from students; 查询一切同学的总年纪

均匀值

select avg(height) from students where is_delete=0 and gender=2; 查询未删去的女生的均匀身高
分组

group by 将查询成果依照一个或多个字段进行分组,字段值相同的为一组

SELECT gender FROM students GROUP BY gender;

group by + group_concat() group_concat(字段名)能够作为一个输出字段来运用,表明分组今后,依据分组检查某字段的调集

select gender,group_concat(name) from students group by gender;
++-+
| gender | group_concat(name)              |
++-+
| 男   | 彭于晏,刘德华,周杰伦,程坤,郭靖           |
| 女   | 小明,小月月,黄蓉,王祖贤,刘亦菲,静香,周杰        |
| 中性 | 金星                   |
| 保密 | 凤姐                   |
++-+
select gender,group_concat(id) from students group by gender;
+++
| gender | group_concat(id) |
+++
| 男   | 3,4,8,9,14   |
| 女   | 1,2,5,7,10,12,13 |
| 中性 | 11     |
| 保密 | 6      |
+++

group by + 聚合函数 能够经过聚合函数来对这个值的调集做一些操聚合操作

select gender,avg(height) from students group by gender;
++-+
| gender | avg(height) |
++-+
| 男   |  177.750000 |
| 女   |  173.428571 |
| 中性 |  162.000000 |
| 保密 |  150.000000 |
++-+

group by + having having表达式,用来分组今后设定条件挑选数据,功用和where相同,可是having只能用于group by

select gender,count(*) from students group by gender having count(*)>2;
+++
| gender | count(*) |
+++
| 男   |    5 |
| 女   |    7 |
+++

group by + with rollup 在最终添加一行,核算该列的和

select gender,count(*) from students group by gender with rollup;
+++
| gender | count(*) |
+++
| 男   |    5 |
| 女   |    7 |
| 中性 |    1 |
| 保密 |    1 |
| NULL |   14 |
+++
分页

当数据量很大的时分,就不可能在一页中检查一切数据了,需求对它进行分页操作

语法

select * from 表名 limit start,count

阐明

从start开端,获取count条数据

select * from where gender=1 limit 0,3; 查询前三条男生记载
衔接

mysql支撑三种衔接查询

  • 内衔接 查询的成果为两个表匹配到的数据

  • 左衔接 查询的成果为两个表匹配到的数据,右表特有的数据,关于左表中不存在的数据运用null填充

  • 右衔接 查询的成果为两个表匹配到的数据,左表特有的数据,关于右表中不存在的数据运用null填充

语法

select * from 表1 inner或left或right join 表2 on 表1.列 = 表2.列
select * from students inner join classes on students.cls_id = classes.id; 运用内相关查询班级表和学生表
+++++++-++-+
| id | name | age  | height | gender | cls_id | is_delete | id | name    |
+++++++-++-+
|  1 | 小明 | 18 | 180.00 | 女   |  1 |     |  1 | python_01期 |
|  2 | 小月月 | 18 | 180.00 | 女   |  2 |    |  2 | python_02期 |
|  3 | 彭于晏 | 29 | 185.00 | 男   |  1 |     |  1 | python_01期 |
|  4 | 刘德华 | 59 | 175.00 | 男   |  2 |    |  2 | python_02期 |
|  5 | 黄蓉 | 38 | 160.00 | 女   |  1 |     |  1 | python_01期 |
|  6 | 凤姐 | 28 | 150.00 | 保密 |  2 |    |  2 | python_02期 |
|  7 | 王祖贤 | 18 | 172.00 | 女   |  1 |    |  1 | python_01期 |
|  8 | 周杰伦 | 36 | NULL | 男   |  1 |     |  1 | python_01期 |
|  9 | 程坤 | 27 | 181.00 | 男   |  2 |     |  2 | python_02期 |
| 10 | 刘亦菲 | 25 | 166.00 | 女   |  2 |     |  2 | python_02期 |
+++++++-++-+
select * from students as s left join classes as c on s.cls_id = c.id; 运用左相关查询班级表和学生表
+++++++-++-+
| id | name | age  | height | gender | cls_id | is_delete | id | name    |
+++++++-++-+
|  1 | 小明 | 18 | 180.00 | 女   |  1 |     |  1 | python_01期 |
|  2 | 小月月 | 18 | 180.00 | 女   |  2 |    |  2 | python_02期 |
|  3 | 彭于晏 | 29 | 185.00 | 男   |  1 |     |  1 | python_01期 |
|  4 | 刘德华 | 59 | 175.00 | 男   |  2 |    |  2 | python_02期 |
|  5 | 黄蓉 | 38 | 160.00 | 女   |  1 |     |  1 | python_01期 |
|  6 | 凤姐 | 28 | 150.00 | 保密 |  2 |    |  2 | python_02期 |
|  7 | 王祖贤 | 18 | 172.00 | 女   |  1 |    |  1 | python_01期 |
|  8 | 周杰伦 | 36 | NULL | 男   |  1 |     |  1 | python_01期 |
|  9 | 程坤 | 27 | 181.00 | 男   |  2 |     |  2 | python_02期 |
| 10 | 刘亦菲 | 25 | 166.00 | 女   |  2 |     |  2 | python_02期 |
| 11 | 金星 | 33 | 162.00 | 中性 |  3 |    | NULL | NULL    |
| 12 | 静香 | 12 | 180.00 | 女   |  4 |     | NULL | NULL    |
| 13 | 郭靖 | 12 | 170.00 | 男   |  4 |     | NULL | NULL    |
| 14 | 周杰 | 34 | 176.00 | 女   |  5 |     | NULL | NULL    |
+++++++-++-+
select * from students as s right join classes as c on s.cls_id = c.id; 运用右相关查询班级表和学生表
+++++++-++-+
| id | name | age  | height | gender | cls_id | is_delete | id | name    |
+++++++-++-+
|  1 | 小明 | 18 | 180.00 | 女   |  1 |     |  1 | python_01期 |
|  2 | 小月月 | 18 | 180.00 | 女   |  2 |    |  2 | python_02期 |
|  3 | 彭于晏 | 29 | 185.00 | 男   |  1 |     |  1 | python_01期 |
|  4 | 刘德华 | 59 | 175.00 | 男   |  2 |    |  2 | python_02期 |
|  5 | 黄蓉 | 38 | 160.00 | 女   |  1 |     |  1 | python_01期 |
|  6 | 凤姐 | 28 | 150.00 | 保密 |  2 |    |  2 | python_02期 |
|  7 | 王祖贤 | 18 | 172.00 | 女   |  1 |    |  1 | python_01期 |
|  8 | 周杰伦 | 36 | NULL | 男   |  1 |     |  1 | python_01期 |
|  9 | 程坤 | 27 | 181.00 | 男   |  2 |     |  2 | python_02期 |
| 10 | 刘亦菲 | 25 | 166.00 | 女   |  2 |     |  2 | python_02期 |
+++++++-++-+
select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id; 查询学生姓名及班级称号
++-+
| name | name    |
++-+
| 小明 | python_01期 |
| 小月月 | python_02期 |
| 彭于晏 | python_01期 |
| 刘德华 | python_02期 |
| 黄蓉 | python_01期 |
| 凤姐 | python_02期 |
| 王祖贤 | python_01期 |
| 周杰伦 | python_01期 |
| 程坤 | python_02期 |
| 刘亦菲 | python_02期 |
++-+
子查询

子查询 在一个 select 句子中,嵌入了别的一个 select 句子, 那么被嵌入的 select 句子称之为子查询句子

主查询 首要查询的目标,榜首条 select 句子

主查询和子查询的联系

  • 子查询是嵌入到主查询中
  • 子查询是辅佐主查询的,要么充任条件,要么充任数据源
  • 子查询是能够独立存在的句子,是一条完好的 select 句子

子查询分类

  • 标量子查询: 子查询回来的成果是一个数据(一行一列)
  • 列子查询: 回来的成果是一列(一列多行)
  • 行子查询: 回来的成果是一行(一行多列)

查询大于均匀年纪的学生

select * from students where age > (select avg(age) from students);

查询还有学生在班的一切班级姓名

select name from classes where id in (select cls_id from students);

需求: 查找班级年纪最大,身高最高的学生

select * from students where (height,age) = (select max(height),max(age) from students);
查询的履行次序

from表名>where>group by>slect distinct>having>order by>limit

No.6 Python与MySQL交互 预备数据
创立京东数据库
create database jing_dong charset=utf8;
运用京东数据库
use jing_dong;
创立一个产品goods数据表
create table goods(
  id int unsigned primary key auto_increment not null,
  name varchar(150) not null,
  cate_name varchar(40) not null,
  brand_name varchar(40) not null,
  price decimal(10,3) not null default 0,
  is_show bit not null default 1,
  is_saleoff bit not null default 0
);
向goods表中刺进数据
insert into goods values(0,r510vc 15.6英寸笔记本,笔记本,华硕,3399,default,default); 
insert into goods values(0,y400n 14.0英寸笔记本电脑,笔记本,联想,4999,default,default);
insert into goods values(0,g150th 15.6英寸游戏本,游戏本,雷神,8499,default,default); 
insert into goods values(0,x550cc 15.6英寸笔记本,笔记本,华硕,2799,default,default); 
insert into goods values(0,x240 超极本,超级本,联想,4880,default,default); 
insert into goods values(0,u330p 13.3英寸超极本,超级本,联想,4299,default,default); 
insert into goods values(0,svp13226scb 触控超极本,超级本,索尼,7999,default,default); 
insert into goods values(0,ipad mini 7.9英寸平板电脑,平板电脑,苹果,1998,default,default);
insert into goods values(0,ipad air 9.7英寸平板电脑,平板电脑,苹果,3388,default,default); 
insert into goods values(0,ipad mini 装备 retina 显现屏,平板电脑,苹果,2788,default,default); 
insert into goods values(0,ideacentre c340 20英寸一体电脑 ,台式机,联想,3499,default,default); 
insert into goods values(0,vostro 3800-r1206 台式电脑,台式机,戴尔,2899,default,default); 
insert into goods values(0,imac me086ch/a 21.5英寸一体电脑,台式机,苹果,9188,default,default); 
insert into goods values(0,at7-7414lp 台式电脑 linux ),台式机,宏碁,3699,default,default); 
insert into goods values(0,z220sff f4f06pa作业站,效劳器/作业站,惠普,4288,default,default); 
insert into goods values(0,poweredge ii效劳器,效劳器/作业站,戴尔,5388,default,default); 
insert into goods values(0,mac pro专业级台式电脑,效劳器/作业站,苹果,28888,default,default); 
insert into goods values(0,hmz-t3w 头戴显现设备,笔记本配件,索尼,6999,default,default); 
insert into goods values(0,商务双肩背包,笔记本配件,索尼,99,default,default); 
insert into goods values(0,x3250 m4机架式效劳器,效劳器/作业站,ibm,6888,default,default); 
insert into goods values(0,商务双肩背包,笔记本配件,索尼,99,default,default);
数据库规划

创立产品分类表

create table goods_cates(
  id int unsigned primary key auto_increment not null,
  name varchar(40) not null
);

创立产品品牌表

create table goods_brands (
  id int unsigned primary key auto_increment not null,
  name varchar(40) not null
);

创立产品表

create table goods(
  id int unsigned primary key auto_increment not null,
  name varchar(40) default ,
  price decimal(5,2),
  cate_id int unsigned,
  brand_id int unsigned,
  is_show bit default 1,
  is_saleoff bit default 0,
  foreign key(cate_id) references goods_cates(id),
  foreign key(brand_id) references goods_brands(id)
);

创立顾客表

create table customer(
  id int unsigned auto_increment primary key not null,
  name varchar(30) not null,
  addr varchar(100),
  tel varchar(11) not null
);

创立订单表

create table orders(
  id int unsigned auto_increment primary key not null,
  order_date_time datetime not null,
  customer_id int unsigned,
  foreign key(customer_id) references customer(id)
);

创立订单状况表

create table order_detail(
  id int unsigned auto_increment primary key not null,
  order_id int unsigned not null,
  goods_id int unsigned not null,
  quantity tinyint unsigned not null,
  foreign key(order_id) references orders(id),
  foreign key(goods_id) references goods(id)
);
PyMySQL操作流程

Connection目标

用于树立与数据库的衔接

conn=connect(参数列表)
host:衔接的mysql主机,假如本机是localhost
port:衔接的mysql主机的端口,默许是3306
database:数据库的称号
user:衔接的用户名
password:衔接的暗码
charset:通讯选用的编码办法,引荐运用utf8
close() 封闭衔接
commit() 提交
cursor() 回来cursor目标,履行sql并回来成果

Cursor目标

回来cursor目标,履行sql并回来成果

rowcount只读特点,表明最近一次execute()履行后受影响的行数
connection取得当时衔接目标
close()封闭
execute(operation [, parameters ])履行句子,回来受影响的行数,首要用于履行insert、update、delete句子,也能够履行create、alter、drop等句子
fetchone()履行查询句子时,获取查询成果集的榜首个行数据,回来一个元组
fetchall()履行查询时,获取成果集的一切行,一行构成一个元组,再将这些元组装入一个元组回来
增修正查

增修正

import pymysql

if __name__  __main__:
  conn = pymysql.connect(host=,port=3306,database=jing_dong,user=root,password=123456,charset=utf8)
  cursor = conn.cursor()
  # 添加
  count = cursor.execute(insert into goods(name,cate_name,brand_name) values("硬盘","",""))
  print(count)
  count = cursor.execute(insert into goods(name) values("光盘"))
  print(count)
  # 更新
  count = cursor.execute(update goods set name="机械硬盘" where name="硬盘")
  # 删去
  count = cursor.execute(delete from goods where id=6)
  print(count)
  conn.commit()
  cursor.close()
  conn.close()

查询一条数据

import pymysql

if __name__  __main__:
  conn = pymysql.connect(host=,port=3306,database=jing_dong,user=root,password=123456,charset=utf8)
  cursor = conn.cursor()
  count = cursor.execute(select id,name from goods where id<=4)
  print(count)
  for i in range(count):
    ret = cursor.fetchone()
    print(ret)
  conn.commit()
  cursor.close()
  conn.close()

查询多条数据

import pymysql

if __name__  __main__:
  conn = pymysql.connect(host=,port=3306,database=jing_dong,user=root,password=123456,charset=utf8)
  cursor = conn.cursor()

  count = cursor.execute(select id,name from goods where id<=4)
  print(count)
  ret = cursor.fetchall()
  print(ret)
  conn.commit()
  cursor.close()
  conn.close()
参数化

sql句子的参数化,能够有用避免sql注入

import pymysql

if __name__  __main__:
  conn = pymysql.connect(host=,port=3306,database=jing_dong,user=root,password=123456,charset=utf8)
  cursor = conn.cursor()
  count = cursor.execute(select id,name from goods where id<=%s,4)
  print(count)
  ret = cursor.fetchall()
  print(ret)
  conn.commit()
  cursor.close()
  conn.close()
No.7 视图 视图是什么?

浅显的讲,视图就是一条SELECT句子履行后回来的成果集,所以咱们在创立视图的时分,首要的作业就落在创立这条SQL查询句子上,视图是对若干张根本表的引证,一张虚表,查询句子履行的成果,不存储具体的数据(根本表数据发生了改动,视图也会跟着改动),便利操作,特别是查询操作,削减杂乱的SQL句子,增强可读性

界说视图
create view 视图称号 as select句子;
检查视图
show tables;
运用视图
select * from 视图称号;
删去视图
drop view 视图称号;
视图的效果

进步了重用性,就像一个函数
对数据库重构,却不影响程序的运转
进步了安全功用,能够对不同的用户
让数据愈加明晰

No.8 业务 什么是业务?

所谓业务,它是一个操作序列,这些操作要么都履行,要么都不履行,它是一个不可分割的作业单位,只需业务内的一切操作悉数履行成功才会提交到数据库,只需有一条履行失利,也不会提交,广泛应用于订单系统、银行系统

业务四大特性
  • 原子性(Atomicity)
  • 共同性(Consistency)
  • 阻隔性(Isolation)
  • 持久性(Durability)

    敞开业务
    start transaction;
    提交业务
    commit;
    回滚业务
    rollback;
    No.9 索引 什么是索引?

    索引是一种特别的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里一切记载的引证指针,索引就像一本书的目录,加速查找速度

    索引的运用

    检查索引

    show index from 表名;

    创立索引

    create index 索引称号 on 表名(字段称号(长度))

    删去索引

    drop index 索引称号 on 表名;
    No.10 权限
  • 在出产环境下操作数据库时,肯定不能够运用root账户衔接,而是创立特定的账户,颁发这个账户特定的操作权限,然后衔接进行操作,首要的操作就是数据的crud

  • MySQL账户系统:依据账户所具有的权限的不同,MySQL的账户能够分为以下几种

    • 效劳实例级账号:,启动了一个mysqld,即为一个数据库实例;假如某用户如root,具有效劳实例级分配的权限,那么该账号就能够删去一切的数据库、连同这些库中的表

    • 数据库等级账号:对特定数据库履行增修正查的一切操作

    • 数据表等级账号:对特定表履行增修正查等一切操作

    • 字段等级的权限:对某些表的特定字段进行操作

    • 存储程序等级的账号:对存储程序进行增修正查的操作
  • 帐户的操作首要包含创立账户、删去账户、修正暗码、授权权限等
No.11 主从 主从同步的界说

主从同步使得数据能够从一个数据库效劳器仿制到其他效劳器上,在仿制数据时,一个效劳器充任主效劳器(master),其他的效劳器充任从效劳器(slave),由于仿制是异步进行的,所以从效劳器不需求一直衔接着主效劳器,从效劳器乃至能够经过拨号时断时续地衔接主效劳器,经过装备文件,能够指定仿制一切的数据库,某个数据库,乃至是某个数据库上的某个表

运用主从同步的优点:

  • 经过添加从效劳器来进步数据库的功用,在主效劳器上履行写入和更新,在从效劳器上向外供给读功用,能够动态地调整从效劳器的数量,然后调整整个数据库的功用。
  • 进步数据安全,由于数据已仿制到从效劳器,从效劳器能够停止仿制进程,所以,能够在从效劳器上备份而不损坏主效劳器相应数据
  • 在主效劳器上生成实时数据,而在从效劳器上剖析这些数据,然后进步主效劳器的功用
主从同步的机制

Mysql效劳器之间的主从同步是根据二进制日志机制,主效劳器运用二进制日志来记载数据库的变化状况,从效劳器经过读取和履行该日志文件来坚持和主效劳器的数据共同

在运用二进制日志时,主效劳器的一切操作都会被记载下来,然后从效劳器会接收到该日志的一个副本。从效劳器能够指定履行该日志中的哪一类事情(比如只刺进数据或许只更新数据),默许会履行日志中的一切句子

每一个从效劳器会记载关于二进制日志的信息:文件名和现已处理过的句子,这样意味着不同的从效劳器能够别离履行同一个二进制日志的不同部分,而且从效劳器能够随时衔接或许中止和效劳器的衔接

主效劳器和每一个从效劳器都有必要装备一个仅有的ID号(在my.cnf文件的[mysqld]模块下有一个server-id装备项),别的,每一个从效劳器还需求经过CHANGE MASTER TO句子来装备它要衔接的主效劳器的ip地址,日志文件称号和该日志里边的方位(这些信息存储在主效劳器的数据库里)

装备主从同步的过程
  1. 在主效劳器上,有必要敞开二进制日志机制和装备一个独立的ID
  2. 在每一个从效劳器上,装备一个仅有的ID,创立一个用来专门仿制主效劳器数据的账号
  3. 在开端仿制进程前,在主效劳器上记载二进制文件的方位信息
  4. 假如在开端仿制之前,数据库中现已有数据,就有必要先创立一个数据快照(能够运用mysqldump导出数据库,或许直接仿制数据文件)
  5. 装备从效劳器要衔接的主效劳器的IP地址和登陆授权,二进制日志文件名和方位
具体装备主从同步的办法

主和从的身份能够自己指定,咱们将虚拟机Ubuntu中MySQL作为主效劳器,将Windows中的MySQL作为从效劳器

  1. 备份主效劳器原有数据到从效劳器

假如在设置主从同步前,主效劳器上已有很多数据,能够运用mysqldump进行数据备份并复原到从效劳器以完成数据的仿制

  • 在主效劳器Ubuntu进步行备份,履行命令
mysqldump -uroot -p123456 all-databases lock-all-tables > ~/master_db.sql
-u :用户名
-p :暗码
all-databases :导出一切数据库
lock-all-tables :履行操作时锁住一切表,避免操作时有数据修正
~/master_db.sql :导出的备份数据(sql文件)方位,可自己指定
  • 在从效劳器Windows进步行数据复原
mysql –uroot –p123456 < master_db.sql
  1. 装备主效劳器master
  • 修改设置mysqld的装备文件,设置log_bin和server-id
    vim /etc/mysql/mysql.conf.d/mysqld.cnf
    server-id     = 1
    log_bin     = /var/log/mysql/mysql-bin.log
  • 重启mysql效劳
    service mysql restart
  • 登入主效劳器Ubuntu中的mysql,创立用于从效劳器同步数据运用的帐号
    mysql –uroot –p123456
    GRANT REPLICATION SLAVE ON *.* TO slave@% identified by slave;
    FLUSH PRIVILEGES;
  • 获取主效劳器的二进制日志信息
    SHOW MASTER STATUS;
    -File: 运用的日志文件姓名
    Position: 运用的文件方位
    1. 装备从效劳器slave(Windows中的MySQL)
  • 找到Windows中MySQL的装备文件
  • 修改my.ini文件,将server-id修正为2,并保存退出
  • 重启MySQL效劳
进入MySQL,设置衔接到master主效劳器
change master to master_host=10.211.55.5, master_user=slave, master_password=slave,master_log_file=mysql-bin.000006, master_log_pos=590;
  • master_host:主效劳器Ubuntu的ip地址
  • master_log_file: 前面查询到的主效劳器日志文件名
  • master_log_pos: 前面查询到的主效劳器日志文件方位
敞开同步,检查同步状况
start slave; 敞开同步
show slave status \G; 检查同步状况
测验主从同步

在主效劳器上创立一个数据库,在从效劳上检查

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章