day43
自己总结内容:
一:在python中连接mysql;
1. 在终端cmd 中输入 pip3 install pymysql
2. 在pycham中输入以下
import pymysql
连接mysql服务器
conn = pymysql.connect(host="localhost",user="root",
password="123",database="db1",charset="utf8") host可以是主机名,可以是主机地址,user为用户名 ,database为要连接的数据库,charset为字符编码
建立一只手,从服务器中取数据
#cursor = conn.cursor() 如果括号中没指定,他取出来的数据是以元组类型显示,无法更好的见名知意
cursor = conn.cursor(cursor=pymysql.cursor.DictCursor) 通常采用字典这种方式,更好的知道数据的内容
利用sql语句来完成对数据库的操作
sql = "select * from student where id> %s" % (12,)
1: 函数方法功能体
......
功能方法结束
cursor.execute(sql) 把sql语法提交给服务器
2:删除和更新的时候需要事务提交commit
conn.commit() 查找的时候不需要此功能
#res = cursor.fetchone() 获得一条数据
#res = cursor.fetchmany(10) 获得许多条数据 即括号内的数据
res = cursor.fetchall() 获得全部数据
这样得到的数据都是列表里面套字典
print(res) 打印一下这个数据
cursor.close() 关闭手这只工具
conn.close() 关闭连接
案列:
向t2表中插入10条数据
import pymysql
import random
一:在python中连接mysql;
1. 在终端cmd 中输入 pip3 install pymysql
2. 在pycham中输入以下
import pymysql
连接mysql服务器
conn = pymysql.connect(host="localhost",user="root",
password="123",database="db1",charset="utf8") host可以是主机名,可以是主机地址,user为用户名 ,database为要连接的数据库,charset为字符编码
建立一只手,从服务器中取数据
#cursor = conn.cursor() 如果括号中没指定,他取出来的数据是以元组类型显示,无法更好的见名知意
cursor = conn.cursor(cursor=pymysql.cursor.DictCursor) 通常采用字典这种方式,更好的知道数据的内容
利用sql语句来完成对数据库的操作
sql = "select * from student where id> %s" % (12,)
1: 函数方法功能体
......
功能方法结束
cursor.execute(sql) 把sql语法提交给服务器
2:删除和更新的时候需要事务提交commit
conn.commit() 查找的时候不需要此功能
#res = cursor.fetchone() 获得一条数据
#res = cursor.fetchmany(10) 获得许多条数据 即括号内的数据
res = cursor.fetchall() 获得全部数据
这样得到的数据都是列表里面套字典
print(res) 打印一下这个数据
cursor.close() 关闭手这只工具
conn.close() 关闭连接
案列:
向t2表中插入10条数据
import pymysql
import random
# 连接mysql服务器a
conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'insert into t2 (name,age) values (%s,%s)'
data = []
for i in range(10):
num = random.randrange(0, 10)
data.append(('root' + str(num), 'root' + str(num) + '@qq.com'))
conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'insert into t2 (name,age) values (%s,%s)'
data = []
for i in range(10):
num = random.randrange(0, 10)
data.append(('root' + str(num), 'root' + str(num) + '@qq.com'))
cursor.executemany(sql, data) #提交多条
conn.commit()
res = cursor.fetchall()
conn.commit()
res = cursor.fetchall()
print(res)
cursor.close()
conn.close()
import mysql
改表:
cursor.close()
conn.close()
import mysql
改表:
分组:select id,name from 表名 where 条件1 and 条件2 group by 分组的列名 having 分组后的二次筛选 limit 限制取几条
多表连接查询:左连接 union 右连接 ===>全连接 显示的是有对应关系的数据, 还显示两张表中彼此没有对应关系的数据
inner join ...on... #内连接 只是连接有对应关系的两张表
left join ...on...#左连接 显示有对应关系的数据,且显示左表中没的对应关系的数据 即左表数据全部显示,右边表数据无关系的不显示
right join ...on...#右连接 显示有对应关系的数据,且显示右表中没的对应关系的数据 即右表数据全部显示,左表数据无关系的不显示
思路先连表,在查询
多表连接可以不断的和虚拟表连接 表连接完成再有条件,再有分组 再有二次筛选 再有排序 再有限制取几条
数据库备份:
语法:
mysqldump -h 服务器 -u用户名 -p密码 数据库名 >备份文件.sql
#示例:
#单库备份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
多表连接可以不断的和虚拟表连接 表连接完成再有条件,再有分组 再有二次筛选 再有排序 再有限制取几条
数据库备份:
语法:
mysqldump -h 服务器 -u用户名 -p密码 数据库名 >备份文件.sql
#示例:
#单库备份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
#多库备份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
#备份所有库
mysqldump -uroot -p123 --all-databases > all.sql
sql注入:字符串的拼接关系所致,用特殊符号把sql语句进行了注释,所以形成了安全问题
在服务端防止sql注入问题,不要自己拼接字符串,让pymysql去拼接,用execute()来传值,把需要的值写在他的括号里面
案例;
import mysql
conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
inp_user = input("请输入用户名:").strip()
inp_pwd = input("前输入密码:").strip()
sql = "select * from yy where name=%s and pwd = %s"
print(sql)
在这里就可以用execute来解决sql注入带来的问题
res = cursor.execute(sql, (inp_user, inp_pwd)) #在这里传值,注意括号,解决了sql注入
print(res)
if res:
print("登录成功")
else:
print("登录失败")
cursor.close()
conn.close()
mysqldump -uroot -p123 --all-databases > all.sql
sql注入:字符串的拼接关系所致,用特殊符号把sql语句进行了注释,所以形成了安全问题
在服务端防止sql注入问题,不要自己拼接字符串,让pymysql去拼接,用execute()来传值,把需要的值写在他的括号里面
案例;
import mysql
conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
inp_user = input("请输入用户名:").strip()
inp_pwd = input("前输入密码:").strip()
sql = "select * from yy where name=%s and pwd = %s"
print(sql)
在这里就可以用execute来解决sql注入带来的问题
res = cursor.execute(sql, (inp_user, inp_pwd)) #在这里传值,注意括号,解决了sql注入
print(res)
if res:
print("登录成功")
else:
print("登录失败")
cursor.close()
conn.close()
在表中添加数据 前提是在pycham中用语法添加数据
import mysql
conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "insert into yy(name,pwd) values (%s,%s)" 添加数据 *******
print(sql)
rows = cursor.execute(sql, ('张无忌', "234")) ***************
print(rows)
#data = ['name':'asa','ggg':123]
#rows = cursor.executemany(sql,data) #插入多条数据
#rows = cursor.execute('update yy set name="sb" where pwd="pwdr"') 修改数据
#print(rows)
conn.commit() #只有执行commit 这条增加的数据才会正真的添加到表中 ****************
cursor.close()
conn.close()
import mysql
conn = pymysql.connect(host='localhost', user='root', password='123', database='t123', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "insert into yy(name,pwd) values (%s,%s)" 添加数据 *******
print(sql)
rows = cursor.execute(sql, ('张无忌', "234")) ***************
print(rows)
#data = ['name':'asa','ggg':123]
#rows = cursor.executemany(sql,data) #插入多条数据
#rows = cursor.execute('update yy set name="sb" where pwd="pwdr"') 修改数据
#print(rows)
conn.commit() #只有执行commit 这条增加的数据才会正真的添加到表中 ****************
cursor.close()
conn.close()
存储引擎:
create table t1(
id int auto_increment primary key,
name varchar(32) not null default ''
)engine=Innodb charset=utf8;
分类: (****************)
Innodb
1.(默认版本包含5.5)
2.支持事务
3.不支持全文索引
4.索引和数据都是在同一个文件中, .ibd
表的结构实在.frm文件中
create table t1(
id int auto_increment primary key,
name varchar(32) not null default ''
)engine=Innodb charset=utf8;
分类: (****************)
Innodb
1.(默认版本包含5.5)
2.支持事务
3.不支持全文索引
4.索引和数据都是在同一个文件中, .ibd
表的结构实在.frm文件中
MyIsam
1.(默认版本5.5以下 5.3)
2.不支持事务
3.支持全文索引
4..frm: 表结构
.MYD: 表数据
.MYI: 表索引
memory
全文索引:
sphinx
索引:
作用: 加快查询的速度
类比: 新华字典的目录, 可以将索引理解成一个特殊的文件, 然后如果没有这个文件的话, 查询是从前到后查找数据的,
如果有这个文件的话, 会按照一种特殊的数据结构(二叉树)查找数据
分类:
主键索引: 加快查询 + 不能重复 + 不能为空 primary key
唯一索引: 加快查询 + 不能重复 unique(列名)
联合唯一索引: 加快查询 + 不能重复 unique(列名1,列名2)
普通索引: 加快查询 index('列名')
创建:
主键索引:
第一种:
create table t1(
id int auto_increment primary key,
name varchar(32) not null default ''
)engine=Innodb charset=utf8;
第二种:
alter table t1 change id id int auto_increment primary key;
唯一索引:
第一种:
create table t1(
id int auto_increment primary key,
name varchar(32) not null default '',
unique ix_name ('name')
)engine=Innodb charset=utf8;
第二种:
create unique index 索引名称(ix_name) on 表名(t1)(name);
create unique index 索引名称(ix_name_age) on 表名(t1)(name,age);
普通索引:
第一种:
create table t1(
id int auto_increment primary key,
name varchar(32) not null default '',
index ix_name ('name')
)engine=Innodb charset=utf8;
第二种:
create index 索引名称(ix_name) on 表名(t1)(name);
删除:
drop 索引名称(ix_name) on 表名(t1);
场景:
使用频繁的列上加一个索引
索引的缺点:
版本5.3以下:
删除和修改的速度就变慢了
版本5.5以上:
删除和修改的速度不是特别的慢
create table t12(
id int auto_increment primary key,
name varchar(32) not null default '',
email varchar(32) not null default ''
)engine=Innodb charset=utf8;
索引的使用:
explain 工具
查看sql语句是否用的上索引, 或者查看sql执行效率的工具
给执行的SQL语句出一个报告, 通过此报告来判断sql语句的执行效率和效果
ES (elasticsearch )
SQL语句的规则:
- 不建议使用 like 进行搜索
- 组合索引最左前缀
如果组合索引为:(name,email)
where name and email -- 使用索引
where name -- 使用索引
where email -- 不使用索引
慢日志查询(slow log):
日志文件: 记录了执行速度特别慢的SQL语句
开启的步骤:
1. show variables like '%query%';
2. set global long_query_time = 1; 设置慢查询的时间
3. slow_query_log = ON
4. slow_query_log_file = E:\program\mysql-5.6.44-winx64\data\oldboy-slow.log
1.(默认版本5.5以下 5.3)
2.不支持事务
3.支持全文索引
4..frm: 表结构
.MYD: 表数据
.MYI: 表索引
memory
全文索引:
sphinx
索引:
作用: 加快查询的速度
类比: 新华字典的目录, 可以将索引理解成一个特殊的文件, 然后如果没有这个文件的话, 查询是从前到后查找数据的,
如果有这个文件的话, 会按照一种特殊的数据结构(二叉树)查找数据
分类:
主键索引: 加快查询 + 不能重复 + 不能为空 primary key
唯一索引: 加快查询 + 不能重复 unique(列名)
联合唯一索引: 加快查询 + 不能重复 unique(列名1,列名2)
普通索引: 加快查询 index('列名')
创建:
主键索引:
第一种:
create table t1(
id int auto_increment primary key,
name varchar(32) not null default ''
)engine=Innodb charset=utf8;
第二种:
alter table t1 change id id int auto_increment primary key;
唯一索引:
第一种:
create table t1(
id int auto_increment primary key,
name varchar(32) not null default '',
unique ix_name ('name')
)engine=Innodb charset=utf8;
第二种:
create unique index 索引名称(ix_name) on 表名(t1)(name);
create unique index 索引名称(ix_name_age) on 表名(t1)(name,age);
普通索引:
第一种:
create table t1(
id int auto_increment primary key,
name varchar(32) not null default '',
index ix_name ('name')
)engine=Innodb charset=utf8;
第二种:
create index 索引名称(ix_name) on 表名(t1)(name);
删除:
drop 索引名称(ix_name) on 表名(t1);
场景:
使用频繁的列上加一个索引
索引的缺点:
版本5.3以下:
删除和修改的速度就变慢了
版本5.5以上:
删除和修改的速度不是特别的慢
create table t12(
id int auto_increment primary key,
name varchar(32) not null default '',
email varchar(32) not null default ''
)engine=Innodb charset=utf8;
索引的使用:
explain 工具
查看sql语句是否用的上索引, 或者查看sql执行效率的工具
给执行的SQL语句出一个报告, 通过此报告来判断sql语句的执行效率和效果
ES (elasticsearch )
SQL语句的规则:
- 不建议使用 like 进行搜索
- 组合索引最左前缀
如果组合索引为:(name,email)
where name and email -- 使用索引
where name -- 使用索引
where email -- 不使用索引
慢日志查询(slow log):
日志文件: 记录了执行速度特别慢的SQL语句
开启的步骤:
1. show variables like '%query%';
2. set global long_query_time = 1; 设置慢查询的时间
3. slow_query_log = ON
4. slow_query_log_file = E:\program\mysql-5.6.44-winx64\data\oldboy-slow.log
普通日志记录(general log):
SQL审计 (记录sql的操作语句)
SQL审计 (记录sql的操作语句)