day49 数据库终章
一、pymysql补充
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = 'root',
database = 'day46', # 指定我们要编写的库
charset = 'utf8',# 不能写成utf-8
autocommit = True # 后面无须确认就可以操作数据库了
) # 链接数据库
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 增
sql = "insert into student values (17,'男',1,'hz')"
rows = cursor.execute(sql)
# rows = cursor.executemany(sql,[(),()....]) # 这条可以一次性添加多个数据,去替换sql中的拼接数据库
conn.commit() # 确认操作
# 改
sql = "update student set sname = 'hhhzzz' where sid = 1"
# 删除
sql = "delete from student where sid = 2"
'''
增改删 涉及到数据的修改,需要进行二次确认
查不需要
'''
二、数据库补充
1 视图(了解)
- 什么是视图
- 视图是通过查询得到的一张虚拟表,保存下来
- 所以,视图其实也是一张表
- 为什么要有视图
- 把常用的查询操作保存下来,或者拼表操作,可以减少代码
- 如何操作
- create view 视图名(表明) as 虚拟表的查询sql语句
注意事项
'''
1 创建视图在硬盘上只会有表结构,没有表数据(数据来源于原来查询到的表)
2 视图通常只用于查询 不要修改里面的数据
'''
- 视图使用频率高不高?
- 不高,创建多了会影响我们判断表与表之间的结构
总结:了解即可,基本不用
2 触发器(了解)
定义:在满足对表数据进行增、删、改情况下,自动触发的功能
作用:使用触发器可以帮助我们实现监控、日志等等
基本语法结构
# 基本语法
cteate trigger 触发器的名字(见名知意) before/after insert/update/delete
on 表名 for each row
begin
sql语句
end
'''
2对3 6种情况
增前,增后,删前,删后,改前,改后
'''
# 举例
create trigger tri_after_insert_t1 after insert on t1
for each row
begin
sql语句
end
'''
**补充**
修改mysql结束条件
delimiter $$ 表示接下来的mysql操作结束符号为$$ 关闭窗口就改回来了
'''
# 删除触发器
# 案例
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
);
CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);
"""
当cmd表中的记录succes字段是no那么就触发触发器的执行去errlog表中插入数据
NEW指代的就是一条条数据对象
"""
delimiter $$
create trigger tri_after_insert_cmd after insert on cmd
for each row
begin
if NEW.success = 'no' then
insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter ;
# 朝cmd表插入数据
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('jason','0755','ls -l /etc',NOW(),'yes'),
('jason','0755','cat /etc/passwd',NOW(),'no'),
('jason','0755','useradd xxx',NOW(),'no'),
('jason','0755','ps aux',NOW(),'yes');
# 删除触发器
drop trigger tri_after_insert_cmd;
3 事务
事务为多条sql语句共同执行,只有共同成功和共同失败
事务四大特性:ACID
- A:原子性
- 一个事物是一个不可分割的单位,事物中包含着诸多操作,要么同时成功,要么同时失败
- C:一致性
- 事物必须是使数据库从一个一致性的状态变到另外一个一致性的状态
- 一致性和原子性密切相关
- I:隔离性
- 一个事物的执行不能被其他事物干扰,并发执行的事物之间也是互不干扰
- D:持久性/永久性
- 指一个事物一旦执行成功,那么他对数据库中数据的修改是永久的
- 接下来的其他操作和故障,不会对他有影响
如何使用事务
# 事务相关的关键字
# 1 开启事务
start transaction;
# 开启事务在确认和回滚之前都属于事务代码
# 2 回滚操作(当事务中间出现一个错误,回到事务执行之前的状态)
rollbake
# 3 确认(确认之后就没法回滚了)
commit
4 存储过程(了解)
存储过程类似于python中的自定义函数
基本使用
create procedure 存储过程的名字(形参1,形参2。。。)
begin
sql语句
end
# 调用
call 存储过程的名字();
三种开发模型
- 第一种
- 应用程序:程序员写代码开发
- MySQL:提前写好存储过程,供应程序调用
- 优点:开发效率,执行效率都提高
- 缺点:需要考虑沟通问题,存储过程扩展性差
- 第二种
- 应用程序,MySQL:都是程序员写
- 优点:扩展性高
- 缺点:开发效率低,sql语句很繁琐,还要考虑优化
- 第三种
- 应用程序:只写代码,用别人写好的操作MySQL的python框架直接操作
- 优点:开发效率最高
- 缺点:语句的可扩展性差,可能会出现效率低下的问题
总结:第一种基本不会出现,基本都是第三种,出现效率问题就自己写sql
存储过程mysql演示
delimiter $$
create procedure p1(
in m int, # 只进不出 m不能返回出去
in n int,
out res int # 该形参可以返回出去
# in所对应的变量时供我们下面sql语句使用的,out对应的变量相当于一个标识,这个变量修改了,表示我们执行了存储过程
)
begin
select tname from teacher where tid>m and tid<n;
set res=666; # 将res变量修改 用来标识当前的存储过程代码确实执行了
end $$
delimiter ;
# 针对形参res 不能直接传数据 应该传一个变量名
# 定义变量
set @ret = 10;
# 查看变量对应的值
select @ret;
python中的mysql储存过程
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
passwd = '123456',
db = 'day48',
charset = 'utf8',
autocommit = True
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 调用存储过程
cursor.callproc('p1',(1,5,10))
"""
@_p1_0=1
@_p1_1=5
@_p1_2=10
"""
# print(cursor.fetchall())
cursor.execute('select @_p1_2;')
print(cursor.fetchall())
5 函数
函数和存储过程是对应的,存储过程就是自定义函数,函数就类似于内置函数
简单举例:如果我们想对当前时间存储,可以自己手打,也可以使用NOW()
('jason','0755','ls -l /etc',NOW(),'yes')
CREATE TABLE blog (
id INT PRIMARY KEY auto_increment,
NAME CHAR (32),
sub_time datetime
);
INSERT INTO blog (NAME, sub_time)
VALUES
('第1篇','2015-03-01 11:31:21'),
('第2篇','2015-03-11 16:31:21'),
('第3篇','2016-07-01 10:21:31'),
('第4篇','2016-07-22 09:23:21'),
('第5篇','2016-07-23 10:11:11'),
('第6篇','2016-07-25 11:21:31'),
('第7篇','2017-03-01 15:33:21'),
('第8篇','2017-03-01 17:32:21'),
('第9篇','2017-03-01 18:31:21');
select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
6 流程控制
就是mysql版本的if多分支和while判断
# if判断
delimiter //
CREATE PROCEDURE proc_if ()
BEGIN
declare i int default 0;
if i = 1 THEN
SELECT 1;
ELSEIF i = 2 THEN
SELECT 2;
ELSE
SELECT 7;
END IF;
END //
delimiter ;
# while循环
delimiter //
CREATE PROCEDURE proc_while ()
BEGIN
DECLARE num INT ;
SET num = 0 ;
WHILE num < 10 DO
SELECT
num ;
SET num = num + 1 ;
END WHILE ;
7 索引
索引就是一种数据结构,类似于书的目录
比如我们去看字典,有很多种找这个字的办法
- 找拼音
- 找偏旁
- 或者我们提前知道了页码直接翻过去
- 或者一页一页找
这些不同的去书中找字的办法就是索引,在计算机上就是用不同办法去硬盘中找数据,这就是索引,不同的索引给了我们对不同应用场景的需求实现
在mysql中,索引就是一种‘键’,是存储引擎用于快速找到记录的一种数据结构
- primary key (主键)
- unique key (uni键)
- index key
注意:foreign key不是用来加速查询的,只是用来建立表与表之间关系的
上面三中key,前两种不仅可以加速查询,还有约束条件,比如主键是非空且唯一,uni键是唯一的,index只是用来加速查询的
本质
索引是为了让我们缩小想找数据的范围,减少搜索时间,提高效率,也就是如果我们记录下了一条索引,以后在继续找这条数据的时候就会非常的快
一张表可以有多个索引
索引虽然能给我们在搜索特定数据的时候变的非常快速,但是也有缺点
- 当表中有大量数据的时候,创建索引会非常慢
- 因为索引的创建本质上需要用最原始的方法去搜索数据,索引是排除了其他错误路线直接帮我们找到数据
- 在索引创建完毕后,搜索性能提高了,写的性能降低了
- 因为在索引创建完毕后,对表的结构也定死了,如果我们要添加数据,相当于破坏了表数据的排列,索引就必须重新创建
8 b+树
把从用户到数据看做是一棵树,用户是树根,找到树叶上的数据需要经历多次对数据路径的判断,每个枝条放的是虚拟数据,用来帮我们区分数据在哪个分支上。
在分支上的数据,相当于一个个索引,他告诉我们这个分支派生出去的子分支哪里可能有我们的数据。所以我们用id字段作为索引,因为id是int类型,相比与其他类型他能在分支上存储的越多。
总结:当分支上的数据越多,说明在一个分支上对数据路径分析越详细,我们就可以通过越少的分支得到数据。走的路越少,我们得到数据的速度就越快
9 聚集索引(primary key)
聚集索引指的就是主键
Innodb 只有两个文件 直接将主键存放在了idb表中
MyIsam 三个文件 单独将索引存在一个文件
10 辅助索引(unique,index)
我们查询的时候不是一直用id(主键),也可能用到其他字段,这个时候就要用到辅助索引,我们从辅助索引到最后去拿到主键找到真正的数据
- 覆盖索引
- 如果我们在辅助索引的中途就找到了数据就直接返回结果了
- select name from user where name='jason';
- 非覆盖索引
- 还是需要用到主键
- select age from user where name='jason';
day49 数据库终章的更多相关文章
- 史上最简单的 SpringCloud 教程 | 终章
https://blog.csdn.net/forezp/article/details/70148833转载请标明出处:http://blog.csdn.net/forezp/article/det ...
- BugPhobia终章篇章:学霸在线系统Beta阶段展示
0x00 :序言 1 universe, 9 planets, 204 countries,809 islands, 7 seas, and i had the privilege to meet y ...
- SpringBoot非官方教程 | 终章:文章汇总
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-all/ 本文出自方志朋的博客 SpringBo ...
- JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql
JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...
- C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本系列,终 ...
- SpringCloud 教程 | 终章
错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝.赶快上船吧,老船 ...
- BUAA-OO-第四单元总结——终章
面向对象第四单元博客总结--终章 第四单元作业设计 第13次作业设计 类和对应方法属性设计 类设计如下图所示 本次作业主要涉及六个类,其中包括主类 Main ,通用Map类 UmlElementIdM ...
- KB奇遇记(10):终章
本来还想写一篇关于前CIO的著名言论,不过想想还是算了.博客空间宝贵,不乱恶心人了. 这篇博文是本系列<KB奇遇记>的最后一篇了. 虽然在KB公司有这么多的苦,但毕竟收获也很多,至少让我懂 ...
- 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面
分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们 ...
随机推荐
- 小师妹学JavaIO之:文件File和路径Path
简介 文件和路径有什么关系?文件和路径又隐藏了什么秘密?在文件系统的管理下,创建路径的方式又有哪些?今天F师兄带小师妹再给大家来一场精彩的表演. 文件和路径 小师妹:F师兄我有一个问题,java中的文 ...
- 白嫖永久免费云服务器教程,永久免费虚拟主机、永久免费云数据库、搭建FTP服务器、服务器安装Linux / windows操作系统、服务器部署网站、宝塔一键部署多网站、独立ip、永久国内高速云服务器
一.准备工作 1. 注册账号 声明:切记不可用服务器做违法的事情 申请地址:https://www.sanfengyun.com/ 图文教程地址:https://www.cnblogs.com/zwn ...
- mysqldump导出数据库
问题描述:要将一个mysql中六个数据库导出来,使用mysqldump导出 mysqldump使用语法:mysqldump -uroot -p -S /data/mysql/db_itax_m/mys ...
- input搜索框的搜索功能
如图,想要实现输入关键词,点击搜索按钮或者回车键都能进行搜索并返回. html部分代码如下: js部分—— function entersearch(){ var event = window.eve ...
- 1.vue的基础认识
vue 1.基于MvvM MVC--MVVM,是MVC的改进版 MVVM主要是将视图的状态和行为抽象化,把视图和业务逻辑分开 M:模型--存放状态的容器,是以数据为中心的 ...
- 关于领域驱动设计 DDD(Domain-Driven Design)
以下旨在 理解DDD. 1. 什么是领域? 妈妈好是做母婴新零售的产品,应该属于电商平台,那么电商平台就是一个领域. 同一个领域的系统都有相同的核心业务. eg: 电商领域都有:商品浏览.购物 ...
- Redis学习笔记(二十) 发布订阅(下)
当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系. Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面, ...
- (四)log4j同配置下多个进程写日志
原文链接:https://blog.csdn.net/voiceofwind/article/details/51966361 由于起了两个不同的任务,log4j中用的是一套配置,写入的是同一个路径, ...
- os模块查看系统数据
>>> import os >>> os.name # 操作系统类型 'posix' 如果是posix,说明系统是Linux.Unix或Mac OS X,如果是nt ...
- 基于JQuery的简单富文本编辑器
利用jQuery实现最简单的编辑器 我试了很多种方法,目前最快捷能够实现及其简单的编辑可以使用 document.execCommand("ForeColor", "fa ...