当前位置: 首页 > news >正文

MySQL数据库:SQL语言入门 【3】(学习笔记)

目录

5,TCL —— 事务控制语言(Transaction Control Language)

(1)事务的概念+作用

(2)事务的特性

        【1】原子性

        【2】一致性

        【3】隔离性

        【4】持久性

(3)并发事务带来的问题

        【1】脏读

        【2】不可重复读

        【3】幻读

(4)事务的隔离级别 

        【1】分类

  (5)jdbc对事务的操作

数据库对象

二,视图

(1)1,

2,好处

             (1)简化用户操作:

            (2)对机密数据提供安全保护:

3,jdbc操作

三,存储过程

1,什么是存储过程

2,存储过程的优点

               (1) 提高执行性能。

              (2)可减轻网络负担。

               (3)可将数据库的处理黑匣子化。

3,jdbc操作


5,TCL —— 事务控制语言(Transaction Control Language)

          用于数据库的事务管理。

(1)事务的概念+作用

          事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位,由DBMS(数据库管理系统)中的事务管理子系统负责事务的处理。

           保证数据库的完整性,保证一系列DML 操作要么全都执行,要么全都不执行。(要么全成功,要么全失败)

(2)事务的特性

并不是所有的操作序列都可以称为事务,这是因为一个操作序列要成为事务,必须满足事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性简称为ACID特性【必问】

        【1】原子性

原子是自然界最小的颗粒,具有不可再分的特性。

事务中的所有操作可以看做一个原子,事务是应用中不可再分的最小的逻辑执行体。

使用事务对数据进行修改的操作序列,要么全部执行,要么全不执行。

        【2】一致性

事务开始前后,状态一致

        【3】隔离性

隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。(并发执行的事务之间既不能看到对方的中间状态,也不能相互影响。)

        【4】持久性

持久性指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库,即使数据库出现故障,提交的数据也应该能够恢复。但如果是由于外部原因导致的数据库故障,如硬盘被损坏,那么之前提交的数据则有可能会丢失。

(3)并发事务带来的问题

        【1】脏读

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

读到了别人事务中没提交的数据   ,读到的数据  就叫做 脏数据,本次读取 就叫做 脏读。    

(不可以接收)

        【2】不可重复读

 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

-- 读到了别人事务提交后   又修改后的数据 ,   

(可以接收)

        【3】幻读

 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

读到了别人事务提交后   又 添加 或者 删除 后的数据

(可以接收)

不可重复度和幻读区别: 

  • 不可重复读的重点是修改,幻读的重点在于新增或者删除。
  • 解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表 

(4)事务的隔离级别 

MySQL数据库 解决事务并发问题  的解决方案————调整MySQL数据库的隔离级别

事务的隔离级别用于决定如何控制并发用户读写数据的操作

数据库是允许多用户并发访问的,如果多个用户同时开启事务并对同一数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问题,所以MySQL中提供了四种隔离级别来解决上述问题。

mysql数据库默认的隔离级别是 REPEATABLE READ(可重复读取)。

        【1】分类

从低到高依次为

READ UNCOMMITTED(读取未提交的)READ COMMITTED(读取已提交的)REPEATABLE READ(可重复读取)以及 SERIALIZABLE

隔离级别越低,越能支持高并发的数据库操作。

  隔离级别  脏读   不可重复读  幻读 

 READ UNCOMMITTED

read uncommitted

√  √  √  

  READ COMMITTED 

read committed

X√  √  

 REPEATABLE READ  默认

repeatable read

X√  

 SERIALIZABLE  

serializable

XX

                      PS:√  代表会出现问题   , X代表不会出现问题 = 解决问题

  (5)jdbc对事务的操作

          【1】准备表

-- 创建表
create table account(id int primary key auto_increment,uname varchar(10) not null,balance double check (balance >=0)
);
-- 准备数据
insert into account values(null,'张三',400);
insert into account values(null,'李四',400);-- 修改  代码中需要
update account set balance=balance+500 where uname='李四'
update account set balance=balance-500 where uname='张三'

        【2】Java 代码  【jdbc】

测试事务:

@Testpublic void test1() throws SQLException {DBHelper db=new DBHelper();Connection con=db.getcon();PreparedStatement ps=null;try {con.setAutoCommit(false);//取消jdbc自动提交ps = con.prepareStatement("update account set balance=banlance+500 where uname ='李四'");ps.execute();ps.execute("update account set balance=banlance-500 where uname ='张三'");con.commit();//提交System.out.println("转账成功");} catch (SQLException e) {System.out.println(e);}finally {System.out.println("转账失败,操作回滚!");con.rollback();//回滚db.closeAll(con,ps,null);}}

[PS:测试用的单元测试,如果有异常,可以改用 main方法运行]

工具类 DBHelper   ————注意调用的库名!!!

package mysql3;import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;/*** 工具类*/
public class DBHelper {/*** 获得数据源,获得连接对象** @return*/public Connection getcon() {Connection con = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/demodvd?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";String username = "root";String password = "root";con = DriverManager.getConnection(url, username, password);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}return con;}/*** 关闭资源** @param con* @param ps* @param rs*/public void closeAll(Connection con, PreparedStatement ps, ResultSet rs) {try {if (con != null) {con.close();}if (ps != null) {ps.close();}if (rs != null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增加,删除,修改 ---- 方法汇总** @param sql* @param arrs* @return*/public int update(String sql, Object... arrs) {Connection con = getcon();PreparedStatement ps = null;int count = 0;try {ps = con.prepareStatement(sql);for (int i = 0; i < arrs.length; i++) {ps.setObject((i + 1), arrs[i]);}count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}return count;}public List query(String sql, Class cla, Object... arrs) {List list = new ArrayList<>();Connection con = getcon();PreparedStatement ps = null;ResultSet rs = null;try {ps = con.prepareStatement(sql);for (int i = 0; i < arrs.length; i++) {ps.setObject((i + 1), arrs[i]);}rs = ps.executeQuery();while (rs.next()) {Object obj = cla.newInstance();Field[] fs = cla.getDeclaredFields();for (Field f : fs) {f.setAccessible(true);Object value = rs.getObject(f.getName());f.set(obj, rs.getObject(f.getName()));}list.add(obj);}} catch (SQLException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} finally {closeAll(con, ps, rs);}return list;}}


数据库对象

事务,视图,存储过程,函数,DCL(数据控制语言),索引,触发器

二,视图

(1)1,

视图(view)是一个从单张或多张基础数据表或其他视图中构建出来的虚拟表

同基础表一样,视图中也包含了一系列带有名称的列和行数据,但是数据库中只是存放视图的定义,也就是动态检索数据的查询语句,而并不存放视图中的数据,这些数据依旧存放于构建视图的基础表中,只有当用户使用视图时才去数据库请求相对应的数据,

即视图中的数据是在引用视图时动态生成的。因此视图中的数据依赖于构建视图的基础表,如果基本表中的数据发生了变化,视图中相应的数据也会跟着改变。

PS:视图本质上就是:一个查询语句,是一个虚拟的表,不存在的表,你查看视图,其实就是查看视图对应的sql语句

2,好处

             (1)简化用户操作

                          视图可以使用户将注意力集中在所关心地数据上,而不需要关心数据表的结构、与其他表的关联条件以及查询条件等。

            (2)对机密数据提供安全保护

                      有了视图,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,避免机密数据(如,敏感字段“salary”)出现在不应该看到这些数据的用户视图上。这样视图就自动提供了对机密数据的安全保护功能

3,jdbc操作

  • 创建视图   
-- 创建视图   多表create view v_eds
as
select e.*,d.dname,d.loc,s.*
from emp e inner join dept d on d.deptno=e.deptnoinner join salgrade s on s.losal<=e.sal and s.hisal>=e.sal-- 使用视图select * from v_eds where deptno=10============================================================================-- 创建视图     单表
create view v_emp
as
select empno,ename,job,deptno from emp;-- 使用视图
select * from v_emp where deptno=10
  • Java 代码  【jdbc】   (多表)
public static void main(String[] args) throws SQLException {DBHelper db = new DBHelper();Connection con = db.getcon();PreparedStatement ps = con.prepareStatement("select * from v_eds where deptno=?");ps.setInt(1, 0);ResultSet rs = ps.executeQuery();while (rs.next()) {System.out.println(rs.getString("ename")+ "\t" + rs.getString("sal")+ "\t" + rs.getString("dname")+ "\t" + rs.getString("grade"));}db.closeAll(con, ps, rs);}

三,存储过程

1,什么是存储过程

                存储过程就是数据库中保存(Stored)的一系列SQL命令(Procedure)的集合。也可以将其看作相互之间有关系的SQL命令组织在一起形成的一个小程序。

2,存储过程的优点

               (1) 提高执行性能。

                          存储过程执行效率之所高,在于普通的SQL语句,每次都会对语法分析,编译,执行,而存储过程只是在第一次执行语法分析,编译,执行,以后都是对结果进行调用。

              (2)可减轻网络负担。

                        使用存储过程,复杂的数据库操作也可以在数据库服务器中完成。只需要从客户端(或应用程序)传递给数据库必要的参数就行,比起需要多次传递SQL命令本身,这大大减轻了网络负担。

               (3)可将数据库的处理黑匣子化。

                         应用程序中完全不用考虑存储过程的内部详细处理,只需要知道调用哪个存储过程就可以了

3,jdbc操作

  • 创建函数
-- 创建函数 
create procedure proemp1(name varchar(10))
beginif name is null or name = "" thenselect * from emp;elseselect * from emp where ename like concat('%',name,'%');end if;    
end;-- 使用
call proemp1('A')
call proemp1(null)
  • Java 操作
 @Testpublic void test3() throws SQLException {mysql3.DBHelper db = new mysql3.DBHelper();Connection con = db.getcon();CallableStatement cs = con.prepareCall("{call proemp1(?)}");cs.setString(1, "A");ResultSet rs = cs.executeQuery();while (rs.next()) {System.out.println(rs.getInt("empno")+ "\t" + rs.getString("ename")+ "\t" + rs.getString("job")+ "\t" + rs.getInt("deptno"));}rs.close();cs.close();con.close();}

相关文章:

MySQL数据库:SQL语言入门 【3】(学习笔记)

目录 5&#xff0c;TCL —— 事务控制语言&#xff08;Transaction Control Language&#xff09; &#xff08;1&#xff09;事务的概念作用 &#xff08;2&#xff09;事务的特性 【1】原子性 【2】一致性 【3】隔离性 【4】持久性 &#xff08;3&#xff09;并发事务带来…...

uniapp 实现tabbar分类导航及滚动联动效果

思路&#xff1a;使用两个scroll-view&#xff0c;tabbar分类导航使用scrollleft移动&#xff0c;内容联动使用页面滚动onPageScroll监听滚动高度 效果图 <template><view class"content" ><view :class"[isSticky ? tab-sticky: ]">…...

华为数字化转型的本质为何是管理变革

随着全球经济的加速数字化转型&#xff0c;企业纷纷进入了数字化时代的大潮。华为作为数字化转型的领军者&#xff0c;已经成功实践了从传统企业向数字化企业的蜕变。对于企业而言&#xff0c;数字化转型不仅仅是新技术的应用&#xff0c;更是一场管理变革。在这场变革的背后&a…...

【数据库】深入解析慢 SQL 的识别与优化策略

文章目录 什么是慢 SQL&#xff1f;慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析&#xff1a;600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…...

Linux从入门到精通

远程连接linux操作系统 Linux的图形化界面并不稳定&#xff0c;因此往往使用命令行去接触Linux操作系统 远程连接到Linux操作系统需要借助一个叫做finalshell的软件&#xff0c;官方地址如下&#xff1a; finalshell官方下载 在linux的terminal终端中输入指令 ifconfig就可以…...

代码随想录算法训练营第四十四天|Day44 动态规划

1143.最长公共子序列 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ye4y1L7CQ https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 #define max(a, b) ((a) > (b) ? (a) : (b)) int longestCommonSu…...

C++初阶——优先队列

一、什么是优先队列 优先队列是一个容器适配器&#xff0c;存储于优先队列中的元素按照某种优先级自动排序。优先队列类似于堆&#xff0c;元素可以随时插入&#xff0c;但是只能弹出优先级最高的元素。默认是一个大根堆&#xff0c;也就是元素越大&#xff0c;优先级越高。 二…...

10月月报 | Apache DolphinScheduler进展总结

各位热爱 Apache DolphinScheduler 的小伙伴们&#xff0c;社区10月份月报更新啦&#xff01;这里将记录 DolphinScheduler 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 月度Merge之星 感谢以下小伙伴10月份为 Apache DolphinScheduler 所做的精彩贡献&#xff08;排…...

WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统

安装WSL命令 管理员打开PowerShell或Windows命令提示符&#xff0c;输入wsl --install&#xff0c;然后回车 注意&#xff1a;此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意&#xff1a;默认安装最新的Ubuntu发行版。 注意&#xff1a;默认安装路径是…...

《AI 之影》

《AI 之影》 城市的喧嚣如同一幅永不停息的画卷&#xff0c;在钢筋水泥的丛林中&#xff0c;人们匆忙地穿梭&#xff0c;追逐着各自的梦想与欲望。而在这看似平凡的都市之中&#xff0c;一场悄然的变革正在酝酿。 他叫佑介&#xff0c;一个孤独的城市漫步者。每天&#xff0c;他…...

QT5.14*解决QSslSocket::connectToHostEncrypted: TLS initialization faile

qDebug()<<"QSslSocket"<<QSslSocket::sslLibraryBuildVersionString();通过上述代码在QT控制台查看对应需要的SSL版本&#xff0c;QT5.14.*输出的内容为&#xff1a; OpenSSL 1.1.1d 10 Sep 2019从官方下载openssl安装包即可&#xff0c;在官网找了很…...

高效分支管理规范

一、目的 通过标准化的流程和最佳实践&#xff0c;确保代码组织清晰、版本控制高效、变更管理有序&#xff0c;从而提高软件开发的质量、效率和可维护性&#xff0c;支持团队协作和持续集成/持续部署流程&#xff0c;最终实现项目的长期成功和发展 二、分支命名规范 简洁明了…...

跟我学C++中级篇——RAII

一、什么是RAII Resource Acquisition Is Initialization&#xff0c;资源获取即初始化。C/C的开发者都知道&#xff0c;在这类语言的开发中&#xff0c;内存需要手动来控制。也就是说&#xff0c;释放和回收内存得开发者亲历亲为。从某种角度看&#xff0c;能够把控内存的细节…...

C语言第九周课——经典算法

目录 一、冒泡法排序 1.1原理 1.2代码实现&#xff08;以升序排序为例&#xff09; 1.3逻辑 1.4分析 二、二分法查找 2.1原理 2.2代码实现 2.3逻辑 2.4算法效率分析 三、素数判断 3.1原理 3.2代码实现 3.3逻辑 3.4分析 一、冒泡法排序 1.1原理 冒泡排序&…...

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…...

vue2项目中在线预览csv文件

简介 希望在项目中&#xff0c;在线预览.csv文件&#xff0c;本以为插件很多&#xff0c;结果都只是支持excel&#xff08;.xls、.xlsx&#xff09;一到.csv就歇菜。。。 关于文件预览 vue-office&#xff1a;文档、 查看在线演示demo&#xff0c;支持docx、.xlsx、pdf、ppt…...

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…...

PMP--一、二、三模、冲刺--分类--变更--技巧--特点

文章目录 一模二模三模冲刺14.敏捷--不确定性、风险和生命周期选择14.敏捷--特点--敏捷范围灵活&#xff0c;敏捷拥抱变更14.敏捷--阶段关口--在不同的组织、行业或工作类型中&#xff0c;阶段关口可能被称为阶段审查、阶段门、关键决策点和阶段入口或阶段出口。组织可以通过这…...

CSS Grid 布局实战:从入门到精通

文章目录 前言一、CSS Grid 布局概述1.1 什么是 CSS Grid 布局&#xff1f;1.2 主要特点 二、基本概念2.1 网格容器2.2 网格线2.3 网格轨道2.4 网格区域 三、常用属性3.1 定义网格结构3.2 控制网格项的位置3.3 控制网格间距3.4 自动填充和重复 四、实践案例4.1 项目结构4.2 HTM…...

git创建远程仓库,以gitee码云为例GitHub同理

git远程Remote服务端仓库构建的视频教程在这 Git建立服务端Remote远程仓库&#xff0c;gitee码云例&#xff0c;Github_哔哩哔哩_bilibili 1、登gitee码云/Github 登录 - Gitee.com https://github.com/ &#xff08;没账号的注册一下就行&#xff09; 点击如下图位置的创…...

Java爬虫(HttpURLConnection)详解

文章目录 Java爬虫&#xff08;HttpURLConnection&#xff09;详解一、引言二、准备工作1、环境配置2、理解HttpURLConnection 三、发送GET请求1、创建URL对象2、打开连接3、设置请求方法4、连接并读取响应5、处理返回的数据 四、发送POST请求1、设置输出2、发送请求体3、读取响…...

基于STM32的智能停车管理系统设计

引言 随着城市汽车保有量的增加&#xff0c;停车难问题日益严重&#xff0c;传统停车管理方式效率低下&#xff0c;无法满足现代化需求。为了解决这一问题&#xff0c;本项目基于STM32微控制器设计了一种智能停车管理系统。系统能够通过传感器实时监测停车位的使用情况&#x…...

【循环神经网络】

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类用于处理序列数据的神经网络&#xff0c;擅长处理具有时间依赖或顺序结构的数据。RNN通过循环连接的结构&#xff0c;使得当前时刻的输出可以受之前时刻信息的影响&#xff0c;因此被广泛应用于自然语…...

优选算法 - 4 ( 链表 哈希表 字符串 9000 字详解 )

一&#xff1a;链表 1.1 链表常用技巧和操作总结 1.2 两数相加 题目链接&#xff1a;两数相加 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …...

CTF-RE 从0到N: windows反调试-获取Process Environment Block(PEB)信息来检测调试

在Windows操作系统中&#xff0c;Process Environment Block (PEB&#xff0c;进程环境块) 是一个包含特定进程信息的数据结构。它可以被用于反调试中 如何获取PEB指针&#xff1f; 在Windows操作系统中&#xff0c;获取PEB指针的常见方法主要有以下几种。&#xff1a; 1. 使…...

STM32开发基础阶段复习

1.使用寄存器方式点亮LED灯的三个步骤是什么&#xff1f; 首先使能RCC_APB2ENR&#xff08;外设时钟使能寄存器&#xff09;对应的GPIO端口时钟,即给LED这个外设使能时钟。 配置对应GPIO端口&#xff0c;配置为通用推挽输出&#xff0c;输出速度可以选择最大。 将GPIO端口输…...

搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试

搜维尔科技&#xff1a;SenseGlove触觉反馈手套开箱场景测试 SenseGlove触觉反馈手套开箱场景测试...

在k8s上部署Crunchy Postgres for Kubernetes

目录 一、前言二、安装Crunchy Postgres for Kubernetes三、部署一个简单的postgres集群四、增加pgbouncer五、数据备份六、备份恢复七、postgres配置参数七、数据导入 一、前言 Crunchy Postgres可以帮助我们在k8s上快速部署一个高可用、具有自动备份和恢复功能的postgres集群…...

大模型(LLMs)进阶篇

大模型&#xff08;LLMs&#xff09;进阶篇 一、什么是生成式大模型&#xff1f; 生成式大模型&#xff08;一般简称大模型LLMs&#xff09;是指能用于创作新内容&#xff0c;例如文本、图片、音频以及视频的一类深度学习模型。相比普通深度学习模型&#xff0c;主要有两点不…...

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统&#xff1f; 近几年的新笔记本默认开启了raid on模式或vmd选项&#xff0c;安装过程中会遇到问题&#xff0c;新笔记本电脑重装自带的系统建议采用u盘方式安装&#xff0c;默认新笔记本有bitlocker加密机制&#xff0c;如果采用一键重装系统或硬盘方式安装…...