day23_mysql

今日内容

零、 复习昨日
一、函数[了解,会用]
二、事务[重点,理解,面试]
三、数据库范式

零、 复习昨日

见晨考

一、函数

  • 字符串函数
  • 数学函数
  • 日期函数
  • 日期-字符串转换函数
  • 流程函数

1.1 字符串函数

函数解释
CONCAT (string2 [,... ]) 连接字串
LENGTH (string )string长度
REPLACE (str ,search_str ,replace_str )在str中用replace_str替换search_str
SUBSTRING (str , position [,length ])从str的position开始,取length个字符
LTRIM (string2 )
RTRIM (string2 ) trim
去除前端空格或后端空格
-- 今天讲的这些函数,可以应用在CRUD中都行
-- =========== 字符串函数 ============
-- concat(str1,....) 连接字符串 【重要】
select concat('a','1','b','2') from dual;
select concat('a','1','b','2'),sid,sname from stu;
select concat(sid,sname),sid,sname from stu;
select concat('',sname),sid,sname from stu;
select concat('我叫',sname,',今年',age,'明年',age+1,'岁') from stu;

-- left(string2,length) 从 string2 中的左边起取 length 个字符
select left('java',2)
select left(sname,1) from stu; -- 取出姓氏

-- length 获得长度 , utf8中,一个中文三个字节
select length(sname),sname from stu;
select length('abc');

-- 替换
-- REPLACE (str ,search_str ,replace_str ) 在 str 中用 replace_str 替换 search_str
select replace('java','av','AV');
select replace(sname,'三','叁') from stu;

-- SUBSTRING (str , position [,length ] 截取
select substring('java',2); -- 从第2位,取到末尾
select substring('java',2,2); -- 从第2位,取2个
-- 取出stu表中姓名,姓,名
select sname 姓名 ,left(sname,1),substring(sname,2)from stu;
-- 插入时截取部分数据插入
insert into stu (sname) value('java');
insert into stu (sname) value(substring('java',2,2));
-- 更新时取部分数据更新
update stu set sname = left('史密斯',1) where sid = 1011

-- ltrim rtrim trim 虑空
select ltrim(' java '),rtrim(' java '),trim(' java ');
select length(' java '),length(ltrim(' java ')),length(rtrim(' java ')),length(trim(' java '));
-- 插入时使用虑空
insert into pet(id,nick,weight)
values(64,trim(' jerry '),1)

2.2 数学函数

函数解释
CEILING (number2 )向上取整
FLOOR (number2 )向下取整
FORMAT (number,decimal_places ) 保留小数位数,格式化format(x,y),对x保留y位小数,会四舍五入
RAND([seed]) RAND([seed]),seed是种子,可不写.写了随机数固定
ROUND(x,[d])将x四舍五入,d是保留的位数,可不写
TRUNCATE(X,D)截取
-- =========== 数学函数 ============
select abs(-1);
select ceiling(1.1),floor(1.1);
-- 数字格式化 fromat(x,d) x是原始数据,d是保留的小数位数(会四舍五入)
select format(100,1);
select format(100.15,1);
select format(100.14,1);

select avg(score) from stu;
select format(avg(score),1) from stu;

-- 数字格式化truncate(x,d) x是原始数据,d是保留的小数位数(不会四舍五入)
select truncate(100.9,0);
select truncate(100.19,1);
select truncate(100.11,1);

-- 四舍五入 round(x[,d]) x是必填,原始数据
select round(100.91); -- 默认是将小数四舍五入后变整数
select round(100.91,1); -- 参数2是保留小数位数
select round(100.99,1); 
select round(100.999,2); 

-- 随机数 rand() 0-1之间的小数
select rand();
select ceiling(rand() * 30);
insert into tb_1 (age) values (ceiling(rand() * 30))

2.3 日期函数【重要】

函数解释
SYSDATE()当前时间
CURRENT_DATE ( )当前日期
CURRENT_TIME ( )当前时间
CURRENT_TIMESTAMP ( )当前时间戳
DATE (datetime )返回datetime的日期部分
DATEDIFF (date1 ,date2 )两个日期差
NOW ( )当前时间
**`YEARMONTH
-- =========== 日期函数 ============
-- 获得当前日期时间
select now(); -- now() 当前日期和时间
select sysdate(); -- sysdate()当前系统日期和时间
select current_date(); -- 获得当前日期
select current_time();-- 获得时分秒
select current_timestamp();-- 获得当前时间戳
update tb_order set order_time = now() where oid = 1;

-- 单独获得年,月,日
select year(now());
select year('1970-01-01');
select year(order_time) from tb_order
select month('1970-01-01');
select day('1970-01-01');
-- 查询2023年的订单
select * from tb_order where year(order_time) = 2000
-- 当月生日人数
select count(*) from t10 where month(birthday) = month(now())

2.4 日期字符串转换函数【重要】

函数解释说明
date_format(日期,模板)(8版本已经移除)日期 --> 字符串格式化
str_to_date(字符串,模板)字符串 --> 日期解析

常见的模板:

  • %Y-%m-%d 2000-01-02
  • %Y年%m月%d日 2000年02月02日

%Y:代表4位的年份

%y:代表2为的年份

%m:代表月, 格式为(01……12)

%c:代表月, 格式为(1……12)

%d:代表月份中的天数,格式为(00……31)

%e:代表月份中的天数, 格式为(0……31)

%H:代表小时,格式为(00……23)

%k:代表 小时,格式为(0……23)

%h: 代表小时,格式为(01……12)

%I: 代表小时,格式为(01……12)

%l :代表小时,格式为(1……12)

%i: 代表分钟, 格式为(00……59)

%r:代表 时间,格式为12 小时(hh:mm:ss [AP]M)

%T:代表 时间,格式为24 小时(hh:mm:ss)

%S:代表 秒,格式为(00……59)

%s:代表 秒,格式为(00……59)

-- =========== 日期/字符串转换函数 ============
/*
 日期 --> 字符串  date_format(date,'%Y-%m-%d')
 字符串 --> 日期 str_to_date('datestr','%Y-%m-%d') 
 ---------------------
 日期模板
 %Y年 %m月 %d日
 %H时 %i分钟 %S秒
*/
select date_format(now(),'%Y年%m月%d日')
select str_to_date('2022年11月18日','%Y年%m月%d日')

insert into t10 (id,birthday) value (1,str_to_date('2020-01-01','%Y-%m-%d'))

2.5 流程函数【重要!!】

函数解释
IF(expr1,expr2,expr3)如果expr1为真,则返回expr2,否则返回expr3,相对于是三目运算
IFNULL(expr1,expr2)如果 expr1不是NULL,则返回expr1,否则返回expr2; 一般用来替换NULL值,因为NULL值是不能参加运算的
CASE WHEN [expr1] THEN [result1]… ELSE [default] END如果expr是真, 返回result1,否则返回default
-- inst(string,substring) 查找substring在string中的位置,找不到返回0
select if(instr('java','big') > 0,'存在','不存在');
-- 查询学生姓名,已经是否名字含三
select 
	sname,
	if(instr(sname,'三') > 0,'是','否') 
		as 是否含三
from stu;
-- ================== 流程函数 ================
select if(1>0,'真','false') from dual;

-- 获得所有人的平均分
select sum(score) / count(sid) from stu;
select avg(if(score is null,0,score)) from stu;
-- 查询学生学号,成绩,以及是否及格(>=60)
select sid , score , if(score >= 60,'及格','不及格') 是否及格 from stu;
-- 查询学生学号,成绩,假如没有成绩显示缺考
select sid , if(score is null,'缺考',score) from stu;

-- 计算年龄大于50的人数
select count(sid) from stu where age > 50
select count(if(age < 50,null,sid)) from stu

-- 查询学生学号,成绩,假如没有成绩显示缺考
select sid , ifnull(score,'缺考') from stu;
-- 范围判断
-- CASE WHEN [expr1] THEN [result1]… ELSE [default] END	如果expr是真, 返回result1,否则返回default
-- 查询学生id,姓名,成绩,及等级(60以下不及格,60-70,及格,71-80,中等,81-90良好,91-100优秀)
select sid,sname,score,case
when score < 60 then '不及格'
when score <= 70 then '及格'
when score <= 80 then '中等'
when score <= 90 then '良好'
else '优秀'
end as 等级
from stu

二、事务[面试]

事务 transaction tx

2.1 介绍

什么是事务?

事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。(一组操作同时成功,或同时失败)


场景:

银行转账操作,A账号要给B账户转钱. A原有1000块,B原有1000块.A转账给B 100元

A的钱要减少,B的钱要增多

update A set money = money - 100 where id = a

-- 服务器出现异常,导致后面的sql没有执行

update B set money = money + 100 where id = b

2.2 mysql中事务

  • 目前使用的mysql支持事务操作
  • mysql中的事务是每个sql语句都是单独事务,且自动提交事务的
    • 通过命令查询当前事务的提交方式 SHOW VARIABLES like ‘autocommit’
    • 通过命令设置自动提交关闭 set autocommit = off / 或者= 0 关
    • set autocommit = on / 或者= 1 开
  • 事务的操作
    • 开启事务 start transaction 或者 begin
    • 提交事务 commit
    • 回滚事务 rollback

2.3 演示事务

准备数据

CREATE TABLE `account` (
 `id` int(50) NOT NULL,
 `name` varchar(50) NOT NULL,
 `money` int(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO account VALUES(1,'张三',1000);
INSERT INTO account VALUES(2,'李四',1000);
-- =============================================
-- 开启事务
start transaction;
-- 开始转账
update account set money = money - 100 where id = 1
-- 出大事了,后面执行不了
update account set money = money + 100 where id = 2
-- 如果一切正常,提交事务
commit;
-- 服务器出现异常,要回滚
rollback;
-- 查询当前事务提交方式
SHOW VARIABLES  like 'autocommit';
-- 手动控制事务,自动提交关闭
set autocommit = off;

-- ============= java 伪代码 ==================
try{
 conn.setAutocommit(false); -- 自动提交,开启手动事务
 conn.execute("update ....")
 System.out.print(1/0)
 conn.execute("update ....")
 conn.commit();   -- 提交
}catch(Exception e) { -- 如果有异常
 conn.rollback();  -- 回滚
}

-- 后面学框架,只需要配置一下就ok

2.4 事务特性

事务的特性(ACID)

  • 原子性(Atomicity):指事务的整个操作是一个整体,要么都成功,要么都失败
  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致 性状态。转账前和转账后的总金额不变。
  • 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一 个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永 久性的,接下来即使数据库发生故障也不应该对其有任何影响。

image-20230508161105254

2.5 事务的隔离机制

数据库有不同的隔离机制/隔离级别

  1. 读未提交-READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。

  2. 读已提交-READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。

    (oracle 默认的)

  3. **可重复读-**REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。

    (mysql 默认),行锁

  4. **串行化-**SERIALIZABLE: 避免赃读、不可重复读、虚读。

    串行化,其实是表锁

查看当前数据库的隔离级别: SELECT @@TX_ISOLATION;

更改当前的事务隔离级别:

SET [glogal | session] TRANSACTION ISOLATION LEVEL 四个级别之一。

赃读:指一个事务读取了另一个事务未提交的数据。

对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段.  之后, 若 T2 回滚, T1读取的内容就是临时且无效的.  

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。(update)

  对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段.  之后, T1再次读取同一个字段, 值就不同了.  

虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。 (insert)

对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中  插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行

总结

1 什么是事务
2 mysql事务怎么操作(开启,提交,回滚)
3 事务什么特点(ACID)
4 什么是事务隔离(能解释)
5 有哪些级别,简单解释
6 mysql默认什么级别

三、数据库设计三范式

第一范式:要求数据表中的字段(列)不可再分(原子性)

image-20221119111716760

第二范式:不存在非关键字段对关键字段的部分依赖

ps: 主要是针对联合主键,非主键不能只依赖联合主键的一部分

  • 联合主键,即多个列组成的主键

image-20221119112344955

image-20221119112416639

第三范式:不存在非关键字段之间的传递依赖

image-20230317174509549

四、E-R图

ER图 Entry-relationship 实体关系图

  • 属性是椭圆
  • 实体是矩形
  • 关联是实线
  • 关联关系是菱形

image-20230508174249029

数据库还有索引,视图、触发器、存储过程、存储函数、权限控制,用户管理等知识

还有很重要的SQL优化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】单链表基本操作的实现

【单链表的头插和尾插】//无头结点 #include<stdio.h> #include<stdlib.h> typedef struct LNode {int date;struct LNode *next; }LNode,*LinkList; LinkList great_LinkList(LinkList L)//头部插入 {LinkList s;int x,j1;scanf("%d",&x);while(x…

如何使用 Github Action 管理 Issue

本文作者为 360 奇舞团前端开发工程师 Daryl 前言 很多小伙伴打开 github 上的仓库都只使用Code查看代码&#xff0c;或者只是把 github 当成一个代码仓库&#xff0c;但是 github 还提供了很多好用的功能。 其中&#xff0c;GitHub Action就是一个很好用的功能&#xff0c;本文…

基于 Amazon EKS 搭建开源向量数据库 Milvus

一、前言 生成式 AI&#xff08;Generative AI&#xff09;的火爆引发了广泛的关注&#xff0c;也彻底点燃了向量数据库&#xff08;Vector Database&#xff09;市场&#xff0c;众多的向量数据库产品开始真正出圈&#xff0c;走进大众的视野。 根据 IDC 的预测&#xff0c;…

python采集小破站视频弹幕

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用]: Python 3.8 Pycharm模块使用]: import requests 数据请求 import jieba 分词 import wordcloud 词云 import re 正则通过爬虫程序采集数据 分析数…

微信小程序渲染的富文本里面除了img标签外什么都没有,该如何设置img的大小

微信小程序富文本渲染&#xff1a; <rich-text nodes"{{content}}"style"{{style}}" ></rich-text> content是接口得到的值 let cont object.contentlet a cont.replace(/<img/gi,<img style"max-width:94%;height:auto;margi…

Kafka快速入门

文章目录 Kafka快速入门1、相关概念介绍前言1.1 基本介绍1.2 常见消息队列的比较1.3 Kafka常见相关概念介绍 2、安装Kafka3、初体验前期准备编码测试配置介绍 bug记录 Kafka快速入门 1、相关概念介绍 前言 在当今信息爆炸的时代&#xff0c;实时数据处理已经成为许多应用程序和…

python科研绘图:P-P图与Q-Q图

目录 什么是P-P图与Q-Q图 分位数 百分位数 Q-Q图步骤与原理 Shapiro-Wilk检验 绘制Q-Q图 绘制P-P图 什么是P-P图与Q-Q图 P-P图和Q-Q图都是用于检验样本的概率分布是否服从某种理论分布。 P-P图的原理是检验实际累积概率分布与理论累积概率分布是否吻合。若吻合&#xf…

HPC 工作负载管理 —— IBM Spectrum LSF Suite

全面的工作负载管理解决方案&#xff0c;通过增强用户和管理员体验以及实现规模性能来简化 HPC。 IBM Spectrum LSF Suites 是面向分布式高性能计算 (HPC) 的工作负载管理平台和作业调度程序。基于 Terraform 的自动化现已可用&#xff0c;该功能可在 IBM Cloud 上为基于 IBM …

c语言:解决数组元素右旋问题,时间复杂度O(N)

题目&#xff1a; 给一个数组&#xff0c;如【1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7】,k3。 要求得到新数组【5&#xff0c;6&#xff0c;7&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4】。 方法一&#xff0c;思路和…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

EtherCAT从站EEPROM组成信息详解(2):字8-15产品标识区

0 工具准备 1.EtherCAT从站EEPROM数据&#xff08;本文使用DE3E-556步进电机驱动器&#xff09;1 字8-字15产品标识区 1.1 产品标识区组成规范 对于不同厂家和型号的从站&#xff0c;主站是如何区分它们的呢&#xff1f;这就要提起SII的字8-字15区域存储的产品标识&#xff…

计算机视觉:人脸识别与检测

目录 前言 识别检测方法 本文方法 项目解析 完整代码及效果展示 前言 人脸识别作为一种生物特征识别技术&#xff0c;具有非侵扰性、非接触性、友好性和便捷性等优点。人脸识别通用的流程主要包括人脸检测、人脸裁剪、人脸校正、特征提取和人脸识别。人脸检测是从获取的图…

电磁场与电磁波part1--矢量分析

目录 1、方向导数 2、散度定理&#xff08;高斯定理&#xff09; 3、散度与旋度的比较 4、旋度定理&#xff08;斯托克斯定理&#xff09; 5、关于点乘、叉乘、梯度、散度、旋度的计算 ~~~~~~~~~~~~~~~~~~~~~~~~ 确认过眼神&#xff0c;是我看不懂的 ~~~~~~~~~~~~~~~~…

5. HTML中常用标签

5. html常用标签 5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>…

【C++ std::max_element std::min_element std::minmax_element】

一 、std::max_element 寻找范围 [first, last) 中的最大元素。 (1) 用 operator< 比较元素。 (3) 用给定的二元比较函数 comp 比较元素。 (2),(4) 同 (1,3) &#xff0c;但按照 policy 执行。这些重载仅若 std::is_execution_policy_v<std::decay_t > (C20 前)std:…

【C++】泛型编程 ④ ( 函数模板 与 普通函数 调用规则 | 类型自动转换 | 类型自动转换 + 显式指定泛型类型 )

文章目录 一、普通函数 与 函数模板 的调用规则 - 类型自动转换1、函数模板和重载函数2、类型自动转换3、代码示例 - 类型自动转换 二、普通函数 与 函数模板 的调用规则 - 类型自动转换 显式指定泛型类型1、类型自动转换 显式指定泛型类型2、代码示例 - 类型自动转换 显式指…

string的简单操作

目录 string的接口说明 构造 constructor operator 迭代器操作 begin( )和end( ) rbegin( ) 和 rend( ) 范围for和迭代器的关系 范围for 迭代器 容量 size lengtn max_size resize capacity reserve clear empty string类的元素访问 operator[ ] at fro…

构造函数和初始化列表的关系和区别【详解】

构造函数和初始化列表关系和区别&#xff0c;以及为什么有初始化列表&#xff0c;和它的好处 一、构造函数和初始化列表的关系和区别二、为什么有初始化列表三、使用初始化列表的好处 一、构造函数和初始化列表的关系和区别 百度百科这样定义初始化列表&#xff1a;与其他函数…

基于STM32的LoRaWAN无线通信网络设计与实现

LoRaWAN (Long Range Wide Area Network) 是一种低功耗的无线通信技术&#xff0c;用于构建广域物联网。本篇文章将介绍基于STM32微控制器的LoRaWAN无线通信网络的设计与实现&#xff0c;并提供相应的代码示例。 概述 LoRaWAN的无线通信技术采用低功耗长距离传输&#xff0c;…

STM32 独立看门狗

目录 1.独立看门狗介绍 2.独立看门狗本质 3.独立看门狗框图​编辑 4.独立看门狗时钟 5.预分频寄存器&#xff08;IWDG_PR)​编辑 6.重装载寄存器&#xff08;IWDG_RLR) 7.键寄存器&#xff08;IWDG_KR) 8.独立看门狗实验和代码示例 9.独立看门狗和窗口看门狗的异同点 …