MySQL数据库#6

news2024/10/6 5:19:10

Python操作mysql

        在使用Python连接mysql之前我们需要先下载一个第三方的模块 pymysql的模块,导入后再进行操作。

操作步骤:1. 先连接mysql host,port,charset,username password  库,等等。

import pymysql

coon = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='12345',
    db='db10',
    charset='utf8',
    autocommit=True
)
"""coon = pymysql.connect(
    host='127.0.0.1', 本地ip
    port=3306,   端口
    user='root', 用户名
    passwd='12345', 密码
    db='db10'
    charset='utf8', 字符编码
    
)"""

                  2.在Python中书写mysql语句

"""获取游标"""
cur = coon.cursor()

sql = 'select * from student'

#写SQL语句

affect_rows = cur.execute(sql)#代表影响的行数

                  3.执行SQL语句,拿到结果

fetchmany(3)就是前条数据

fetchall()所以信息

res = cur.fetchone() #使用fetchone()代表一个数
print(res) # (1, '男', 1, '理解')

"""mysql> select * from student;
+-----+--------+----------+-------+
| sid | gender | class_id | sname |
+-----+--------+----------+-------+
|   1 | 男     |        1 | 理解  |
|   2 | 女     |        1 | 钢蛋  |
|   3 | 男     |        1 | 张三  |
|   4 | 男     |        1 | 张一  |
|   5 | 女     |        1 | 张二  |

                  4. 在Python中对数据的进一步处理

在游标这边加上cursor=pymysql.cursors.DictCursor让最终结果输出变为字典类型

cur = coon.cursor(cursor=pymysql.cursors.DictCursor)

sql = 'select * from student'

#写SQL语句

affect_rows = cur.execute(sql)
print(affect_rows)
#
#拿到结果

res = cur.fetchone()
print(res)  # 加上之后变为字典类型 {'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '理解'}

当我们在Python中修改数据后,那么在原来的数据库也会跟着修改

"""获取游标"""
cur = coon.cursor(cursor=pymysql.cursors.DictCursor)

sql = 'insert into teacher(tid, tname) values (6,"ll")'#输出结果为1
#当我们修改之后还要进行二次确认:
coon.commit()

#写SQL语句

affect_rows = cur.execute(sql)
print(affect_rows)
#

添加二次确认 coon.commit(),之后就同步修改成功了

除了查询之外,都需要二次确认。

后续可以直接添加,只需要在开始的地方输入

autocommit=True

基于数据库写一个用户注册和登录功能(注册的数据保存在用户表中,然后根据这个用户名做登录)

1. 使用Navicat 来创建一个用户表:

2. 在python中使用sql语句来登录:

coon = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='12345',
    db='db10',
    charset='utf8',
    autocommit=True
)

    # 游标
sor = coon.cursor(pymysql.cursors.DictCursor)

# 写sql语句
ip_name = input('username')
ip_pwd = input('password')
sql1 = ''
sql = "select * from  userinfo where username='%s' and password='%s'" % (ip_name, ip_pwd)

add = sor.execute(sql)

res = sor.fetchone()
if res:
    print('登录成功')
else:
    print('登录失败')

视图

        什么是视图

        MySQL中的视图是一个虚拟表,它根据 SELECT 语句的结果集生成。与物理表一样,视图包含一些列和行,但是这些列和行并不是真实存在的,而是基于 SELECT 语句所定义的查询结果。



为什么要使用视图

使用视图有以下优点:

  • 可以简化复杂的查询,将多个表的数据组合在一起,提供新的查询界面,方便用户操作。
  • 可以隐藏敏感数据,只向用户显示有限的数据。
  • 可以在不修改底层表的结构的情况下,修改和更新数据。

如何使用视图

        关键字:select view

        select view 表名 as select * from teacher inner join course on teacher.tid = course.teacher_id;

这样就创建成功了

如何删除表

drop view (新建表名)

注意:在硬盘中,视图只有表结构,没有表数据文件,视图通常用于查询,尽量不要去修改。

在开发过程中,会不会去使用视图?

答:不会!视图是mysql的功能,如果你的项目里面大量的使用到了视图,那意味着你后期想要扩张某个功能的时候这个功能恰巧又需要对视图进行修改,意味着你需要先在mysql这边将视图先修改一下,然后再去应用程序中修改对应的sql语句,这就涉及到跨部门沟通的问题,所以通常不会使用视图,而是通过重新修改sql语句来扩展功能

 

触发器

        什么是触发器

        触发器(Trigger)是一种特殊的存储过程,可以在特定的数据库事件发生时(如插入、更新或删除数据)自动执行。触发器是通过设置一些触发条件来触发的,一旦触发条件满足,就会自动执行触发器所定义的操作。通常用于实现数据的约束性和完整性控制、数据同步、日志记录等功能。触发器可以在数据库中创建、修改和删除。

语法结构:

create trigger 触发器名称 before(之前)/after (之后)insert/update/delete on 表名 for each row
begin


    sql语句


end

针对插入

 针对插入
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
    sql代码。。。
end 


create trigger tri_after_insert_t2 before insert on 表名 for each row
begin
    sql代码。。。
end

针对删除

 针对删除
create trigger tri_after_delete_t1 after delete on 表名 for each row
begin
    sql代码。。。
end


create trigger tri_after_delete_t2 before delete on 表名 for each row
begin
    sql代码。。。
end

针对修改

 针对修改
create trigger tri_after_update_t1 after update on 表名 for each row
begin
    sql代码。。。
end


create trigger tri_after_update_t2 before update on 表名 for each row
begin
    sql代码。。。
end
 

案例:


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
);

delimiter $$    将mysql默认的结束符由;换成$$

create trigger tri_after_insert_cmd after insert on cmd for each row
begin
    if NEW.success = 'no' then  # 新记录都会被MySQL封装成NEW对象
        insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
    end if;
end $$

delimiter ;  结束之后记得再改回来,不然后面结束符就都是$$了

 往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)
VALUES
    ('egon','0755','ls -l /etc',NOW(),'yes'),
    ('egon','0755','cat /etc/passwd',NOW(),'no'),
    ('egon','0755','useradd xxx',NOW(),'no'),
    ('egon','0755','ps aux',NOW(),'yes');

查询errlog表记录
select * from errlog;


 删除触发器
drop trigger tri_after_insert_cmd;

事物

什么是事物:

        开启一个事务可以包含一些sql语句,这些sql语句要么同时成功
要么一个都别想成功,称之为事务的原子性

事物的作用:

保证了数据操作的数据安全性

事物所拥有的四个属性

原子性(atomicity);一个事物是一个不可分割的工作单位,事物中包含了多个操作,要么都做,要么都不做。

一致性(consistency):事物必须是数据库中的一个一致性状态变成另一个一致性状态,一致性与原子性相关的

隔离性(isolation):一个事物的执行不能被其他事物所干扰,即一个事物内部操作级使用的数据,对并发的其他事物是隔开的,并发执行的各个事物之间,不能互相干扰。

持久性(durability):也被称为永久性(permanence )一个事物一旦提交,对于数据库的改变就是永久的,接下来的操作或故障不应该对其有所影响。        

事物关键字:

start transaction;
commit;
rollback;

create table user(
id int primary key auto_increment,
name char(32),
balance int
);

insert into user(name,balance)
values
('jason',1000),
('egon',1000),
('tank',1000);

修改数据之前先开启事务操作
start transaction;

 修改操作
update user set balance=900 where name='jason';         买支付100元
update user set balance=1010 where name='egon';        中介拿走10元
update user set balance=1090 where name='tank';         卖家拿到90元

回滚到上一个状态
rollback;

开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
commit;
开启事务检测操作是否完整,不完整主动回滚到上一个状态,如果完整就应该执行commit操作

站在python代码的角度,应该实现的伪代码逻辑,
try:
    少了开事务...
    update user set balance=900 where name='jason';         买支付100元
    update user set balance=1010 where name='egon';         中介拿走10元
    update user set balance=1090 where name='tank';         卖家拿到90元
except 异常:
    rollback;
else:
    commit;

存储过程

基本使用:

delimiter $$
create procedure p1()
begin
    select * from user;
end $$


delimiter ;

调用
call p1()

创建存储过程

delimiter $$

create procedure p2(
    in m int,  

 in表示这个参数必须只能是传入不能被返回出去


    in n int,  
    out res int  

 out表示这个参数可以被返回出去
)

begin
    select tname from teacher where tid > m and tid < n;
    set res=0;          

用来标志存储过程是否执行
end $$
delimiter ;


 针对res需要先提前定义
set @res=10;  定义
select @res;  查看
call p1(1,5,@res)  调用
select @res  查看

函数

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');


+----+--------------------------------------+---------------------+
| id | NAME                                 | sub_time            |  month
+----+--------------------------------------+---------------------+
|  1 | 第1篇                                | 2015-03-01 11:31:21 |  2015-03
|  2 | 第2篇                                | 2015-03-11 16:31:21 |  2015-03
|  3 | 第3篇                                | 2016-07-01 10:21:31 |  2016-07
|  4 | 第4篇                                | 2016-07-22 09:23:21 |  2016-07
|  5 | 第5篇                                | 2016-07-23 10:11:11 |  2016-07 
|  6 | 第6篇                                | 2016-07-25 11:21:31 |  2016-07
|  7 | 第7篇                                | 2017-03-01 15:33:21 |  2017-03
|  8 | 第8篇                                | 2017-03-01 17:32:21 |  2017-03
|  9 | 第9篇                                | 2017-03-01 18:31:21 |  2017-03
+----+--------------------------------------+---------------------+

select count(*) from blog group by month;

select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');

索引

我们知道数据都是存在硬盘上的,查询数据不可避免的使用IO操作

索引就是一种数据结构,类似于书的目录。意味着以后再查数据应该先找目录再找数据,而不是用翻页的方式查询数据

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。

  • primary key

  • unique key

  • index key

  • 注意:上面三种key前两种除了有加速查询的效果之外还有额外的约束条件(primary key:非空且唯一,unique key:唯一),而index key没有任何约束功能只会帮你加速查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RawNet 1-3 介绍

1. Overview RawNet: Advanced end-to-end deep neural network using raw waveforms for text-independent speaker verification &#xff08;RawNet 1&#xff09; 出自会议&#xff1a;INTERSPEECH 2019. &#xff08;论文链接&#xff1a;https://arxiv.org/pdf/1904.0…

超分辨率——SESR网络训练并推理测试(详细图文教程)

最近学了一个超轻量化的超分辨率网络SESR&#xff0c;效果还不错。 目录 一、 源码包二、 数据集的准备2.1 官网下载2.2 网盘下载 三、 训练环境配置四、训练4.1 修改配置参数4.2 导入数据集4.3 2倍超分网络训练4.3.1 训练SESR-M5网络4.3.2 训练SESR-M5网络4.3.3 训练SESR-M11…

使用pycharm远程调试

使用pycharm 专业版&#xff0c; 在设置解释器中&#xff0c;具备ssh 解释器功能&#xff1b; 一般在本地无法调试远程端代码&#xff0c;机械性的scp传输文件十分影响工作效率&#xff0c;PyCharm的Pro支持远程Run&#xff0c;Debug&#xff0c;等可视化的功能。 操作系统&…

超声波原理的便携式明渠流量计

便携式明渠流量计是一款便携式的可随带随走的一款仪器&#xff0c;主要是用来和在线明渠流量计做液位和流量比对的一款比对装置。 仪器可自动每两分钟记录一次液位数据&#xff0c;连续记录6次&#xff0c;同时可以累计测量10分钟的流量数据&#xff0c;将其结果与现场在线明渠…

Angular改变组件中样式(两种方法)

项目中遇到修改组件样式的情况&#xff0c;搜了半天资料基本只有vue和react的方法&#xff0c;什么/deep/,v-deep统统不起效&#xff0c;崩溃&#xff01; 所以这里总结一下Angular的方法。 angular中想引入组件并修改组件内样式&#xff0c;有两种方法。 文章目录 方法1&…

壹牛NFT数字艺术藏品数藏开源无加密

这个版本新增了不少功能&#xff0c;也修复了一些地方。 1.平台新增用户找回密码功能 2.平台新增短信注册&#xff08;实名制功能&#xff09; 3.平台新增主图后台添加功能 4.平台修复相关问题&#xff0c;系统高效运行 1、H5端与APP端在新UI完美适配 2、加入宝盒功能&am…

FL Studio21.2最新订阅版本更新升级(详细功能介绍)

好消息&#xff01;FL Studio 21.2 在 10 月 26 日正式发布啦&#xff0c;它新增了 FL Cloud 在线采样库和 AI 音乐制作功能&#xff0c;还提供音乐分发到 Spotify、Apple Music 等主要音乐平台的服务。此外&#xff0c;还有新的音频分离功能、自定义波形颜色和新的合成器 Kepl…

下一代金融将呈现 7 项激动人心的金融科技创新

金融科技处于现代技术发展的前沿。随着金融科技领域价值超过 1790 亿美元&#xff0c;初创企业和创新者都在寻找金融和银行业的下一个重大事件。 本文讨论了 2024 年的 7 项金融科技创新。 其中一些创新建立在我们在金融行业看到的现有趋势的基础上&#xff0c;而另一些则是完…

学习ftp

文章目录 一、FTP介绍二、两种模式&#xff08;主动模式和被动模式&#xff09;三、FTP配置文件详解四、实际场景举例五、黑白名单六、网络限制 一、FTP介绍 1.FTP&#xff08;File Transfer Protocol&#xff09;是一种应用广泛且古老的互联网文件传输协议。 2.主要应用于互联…

vue项目中定制化音频展示,wavesurfer.js基本使用

效果图&#xff1a; wavesurfer是一个可定制的音频波形可视化&#xff0c;建立在Audio API和HTML5 Canvas之上。 基本使用&#xff1a; <body><script src"https://unpkg.com/wavesurfer.js"></script><div id"waveform"></di…

VMware ESXi和vCenter和vSphere关系是怎样的?

事实上&#xff0c;我们所说的vSphere并不是一个特定的软件。VMware vSphere是VMware的服务器虚拟化软件套件&#xff0c;它包括了许多软件组件&#xff0c;它们中的每一个都在vSphere环境中执行不同的功能。 VMware vSphere的两个核心组件就是VMware ESXi和VMware vCenter Se…

python接口自动化测试(八)-unittest-生成测试报告

用例的管理问题解决了后&#xff0c;接下来要考虑的就是报告我问题了&#xff0c;这里生成测试报告主要用到 HTMLTestRunner.py 这个模块&#xff0c;下面简单介绍一下如何使用&#xff1a; 一、下载HTMLTestRunner下载&#xff1a; 这个模块不能通过pip安装&#xff0c;只能…

ohos的代码同步以及添加自己的代码

首先我们需要获取到官方的repo工具&#xff0c;命令如下curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ./repo&#xff0c;这里我们就拿到repo工具了&#xff0c;这个repo可以放任意地方&#xff0c;也可以放 /usr/local/bin/repo下&#xff0c;这样可以…

C++ 关键字

bool 取值 true和false&#xff0c;只有二者&#xff0c;C编译器会在赋值时将非0值转换为true&#xff0c;0转换为false ture 代表真值&#xff0c;编译器内部用1来表示 false 代表非真值&#xff0c;编译器内部用0来表示 空间 占用一个字节 多个bool变量定义在一起&a…

Power BI 傻瓜入门 13. 进入仪表板

本章内容包括&#xff1a; 配置仪表板将报表功能集成到仪表板中使用基于AI的功能增强仪表板体验基于仪表板规则定义警报 想象一下&#xff1a;图片和文本的混合体整齐地组织起来&#xff0c;就像一块美丽的画布。它告诉你组织中的一切都在顺利运行&#xff0c;但其中一个视觉…

Linux系统之部署Tale个人博客系统

Linux系统之部署Tale个人博客系统 一、Tale介绍1.1 Tale简介1.2 Tale特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查java版本 四、部署Tale个人博客系统4.1 下载Tale源码4.2 查看Tale源码目录4…

干货 | 深度多元时序模型在携程关键指标预测场景下的探索应用

作者简介 doublering&#xff0c;携程高级算法工程师&#xff0c;关注自然语言处理、LLMs、时序预测等领域。 一、背景 互联网行业中&#xff0c;有许多关键指标直接影响公司未来的规划与决策&#xff0c;比如流量、订单量、销售额等。有效地预测这些关键指标能够辅助公司提前做…

C++类模板再学习

之前已经学习了C类模板&#xff1b;类模板的写法和一般类的写法有很大的差别&#xff1b;不容易熟悉&#xff1b;下面再做一遍&#xff1b; 做一个椭圆类&#xff0c;成员有长轴长度和短轴长度&#xff1b; // ellipse.h: interface for the ellipse class. // //#if !define…

Android开发知识

文章目录 HTTPHTTP到底是什么HTTP的工作方式URL ->HTTP报文List itemHTTP的工作方式请求报文格式&#xff1a;Request响应报文格式&#xff1a;ResponseHTTP的请求方法状态码HeaderHostContent-TypeContent-LengthTransfer: chunked (分块传输编码 ChunkedTransfer Encoding…

双向链表的初始化、插入、删除

双向链表的初始化 双向链表的插入 双向链表的删除 我们可以看看这一题循环双向链表的题目 王道p40 17.设计一个算法用于判断带头结点的循环双链表是否对称&#xff08;c语言代码实现&#xff09;_认真敲代码的小火龙的博客-CSDN博客https://blog.csdn.net/m0_46702681/article…