MySQL数据库#6

Python操作mysql

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

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

import pymysqlcoon = 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', 本地ipport=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.mzph.cn/news/121573.shtml

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

相关文章

面试题之JavaScript经典for循环(var let)

如果你也在面试找工作&#xff0c;那么也一定遇到过这道for循环打印结果的题&#xff0c;下面我们来探讨下 var循环 for(var i 0; i < 10; i) {setTimeout(function(){console.log(i)}); } 先把答案写出来 下面来讲一下原因&#xff1a; 划重点 ① var ②setTimeout() …

两个list中实体某个属性值相同的实体和不同的实体

说明 有两个list,分别是newList 和 oldList&#xff0c;快速取出两个 newList 中某个属性值相同的实体和不同的实体 代码 import lombok.Data; import lombok.ToString;import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.str…

redis集群的多key原子性操作如何实现?

1、背景 在单实例redis中&#xff0c;我们知道多key原子性操作可以用lua脚本或者multi命令来实现。 比如说有一个双删场景&#xff0c;要保证原子性同时删除k1和k2。 可以用lua双删 EVAL "redis.call(del, KEYS[1]);redis.call(del, KEYS[2])" 2 k1 k2也可以用事务…

10款轻量型的嵌入式GUI库分享

LVGL LittlevGL是一个免费的开源图形库&#xff0c;提供了创建嵌入式GUI所需的一切&#xff0c;具有易于使用的图形元素、漂亮的视觉效果和低内存占用。 特点&#xff1a; 强大的构建模组 按钮、图表、列表、滑块、图像等 ​先进的图形 动画、反锯齿、半透明、平滑滚动 多样…

Elasticsearch核心技术与实战-05-elasticsearch的安装与简单配置-Windows

首先下载elasticsearch的zip包&#xff1a;下载地址 网络不通的解决方法&#xff1a;国内镜像站 es、kibana、logstash均可在华为云开元镜像站自行选择版本下载&#xff1a;下载地址 下载插件包&#xff1a; .\bin\elasticsearch-plugin install analysis-icu .\bin\elasti…

HTTPS协议:保障网络安全的加密通信协议

在当今数字化时代&#xff0c;网络安全问题备受关注。为了保护用户的隐私和数据安全&#xff0c;HTTPS协议应运而生。本文将介绍HTTPS协议的定义、工作原理以及其在网络通信中的重要性。 一、HTTPS协议的定义 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;…

Oracle RU 19.21及 datapatch -sanity_checks

参考文档&#xff1a; Oracle Database Patch 35643107 - Database Release Update 19.21.0.0.231017 Datapatch User Guide (Doc ID 2680521.1) datapatch fails with ORA-04061/ORA-4065/ORA-04045/ORA-04067 due to Golden Gate triggers. (Doc ID 2301658.1) 在19.21的…

用Scapy模块中的sr()函数提供一个程序的例子

from scapy.all import *# 构造ARP请求包 arp_request ARP(pdst192.168.1.1)# 发送ARP请求并获取响应 arp_response sr(arp_request, timeout1, verboseFalse)# 解析响应数据包中的MAC地址 if arp_response[0]:mac_address arp_response[0][ARP].hwsrcprint(fThe MAC addres…

Ensemble Methods集成学习大比拼:性能、应用场景和可视化对比总结

集成学习(Ensemble Learning)是一种机器学习范式,其中多个模型(通常称为“弱学习器”)被训练以解决相同的问题,并且通过某种方式结合它们的预测以提高整体性能。这种方法的核心思想是,多个模型比单一模型更能准确地预测未知数据。在本文中,我们将探讨多种集成学习算法,…

LLM在text2sql上的应用 | 京东云技术团队

一、前言&#xff1a; 目前&#xff0c;大模型的一个热门应用方向text2sql它可以帮助用户快速生成想要查询的SQL语句。那对于用户来说&#xff0c;大部分简单的sql都是正确的&#xff0c;但对于一些复杂逻辑来说&#xff0c;需要用户在产出SQL的基础上进行简单修改&#xff0c…

c 从avi 视频中提取图片

avi 视频的视频流编码必须是jpeg&#xff0c;或者mjpg 直接用摄像头录取的视频都是这两种格式&#xff0c;不能用ffmpeg转成avi的视频。 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.…

shell_52.Linux测试与其他网络主机的连通性脚本

实战演练 本节将展示一个实用脚本&#xff0c;该脚本在处理用户输入的同时&#xff0c;使用 ping 命令或 ping6 命令来测试与其他网络主机的连通性。 ping 命令或 ping6 命令可以快速测试网络主机是否可用。这个命令很有用&#xff0c;经常作为首选工具。如果只是检查单个主机&…

【Apache Flink】基于时间和窗口的算子-配置时间特性

文章目录 前言配置时间特性将时间特性设置为事件时间时间戳分配器周期性水位线分配器创建一个实现AssignerWithPeriodicWatermarks接口的类&#xff0c;目的是为了周期性生成watermark 定点水位线分配器示例 参考文档 前言 Apache Flink 它提供了多种类型的时间和窗口概念&…

C#WinformListView实现缺陷图片浏览器

C#&Winform&ListView实现缺陷图片浏览器 功能需求图像浏览行间距调整悬浮提示 功能需求 机器视觉检测系统中特别是缺陷检测系统&#xff0c;通常需要进行对已经检出的缺陷图片进行浏览查阅。主要是通过条件筛选查询出所需要的数据&#xff0c;进行分页再展示到界面中。…

[计算机提升] Windows系统各种开机启动方式介绍

1.14 开机启动 在Windows系统中&#xff0c;开机启动是指开启电脑后&#xff0c;自动运行指定的程序或服务的技术。一些程序或服务需要在开机后自动启动&#xff0c;以便及时响应用户操作&#xff0c;比如防安防软件、即时通信工具、文件同步软件等。 同时&#xff0c;一些系统…

深入剖析SQL与NoSQL的优劣势,帮你决定最佳数据存储方案

你是否在为系统的数据库来一波大流量就几乎打满 CPU&#xff0c;日常 CPU 居高不下烦恼?你是否在各种 NoSQL 间纠结不定&#xff0c;到底该选用哪种最好?今天的你就是昨天的我&#xff0c;这也是我写这篇文章的初衷。 作为互联网从业人员&#xff0c;我们要知道关系型数据库…

电感基础复盘

1、在高速电路中&#xff0c;我们通常选用SMD贴片电阻&#xff0c;有薄膜和厚膜之分。 2、电容的性质主要为“充放电”和”隔直通交“。获得电荷为充电&#xff0c;反之为放电。隔离直流电不能通过电容器&#xff0c;⽽交流电能通过电容器。充电时直流电相当于导通&#xff0c;…

如何快速安装MONAI(莫奈)医学标注软件

安装 MONAI Label软件怕【官网】 python -m pip install --upgrade pip setuptools wheel# Install latest stable version for pytorch pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113# Check if cuda enabled python …

FPGA时序分析与约束(7)——通过Tcl扩展SDC

一、概述 术语“Synopsys公司设计约束”&#xff08;又名SDC&#xff0c;Synopsys Design Constraints&#xff09;用于描述对时序、功率和面积的设计要求&#xff0c;是EDA工具中用于综合、STA和布局布线最常用的格式。本文介绍时序约束的历史概要和SDC的描述。 二、时序约束…

综合性练习

名片管理系统 综合性项目实现—详细请点这里 dict {} # 定义一个空字典&#xff0c;用于存储信息。 list [] # 定义一个列表&#xff0c;存储name值 list1 [] #存储age值 list2 [] #存储phone值 def people_tips(): #提示print("*****" * 10)print("…