当前位置:网站首页>MySQL数据库(四)事务和函数

MySQL数据库(四)事务和函数

2022-07-06 09:25:00 手可摘鑫晨

1,事务

概念:就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。

特点:一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会失败,数据库数据就会回滚到该事务开始之前的状态。
限制:MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务。

2,事务的原则

(1)原子性 
        意味着数据库中的事务执行是作为原子粒度。即不可再分,整个语句要么执行,要么不执行。
(2)一致性
        即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
(3)隔离性
        事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
(4)持久性
        意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会
被回滚。

3,实现事务的方法

        COMMIT 提交一个事务给数据库。
        START TRANSACTION 开始一个事务,标记事务的起始点。
        ROLLBACK 将事务回滚,数据回到本次事务的初始状态。
        SET AUTOCOMMIT 使用该语句来改变自动提交模式,等于0时关闭自动提交模式,等于1时开启自动提交模式。默认为1,使用事务时为0。

4,实现事务的步骤

(1)SET AUTOCOMMIT = 0;              关闭MySQL自动提交
(2)START TRANSACTION;                 开启一个事务,标记事务的起始点
(3)COMMIT;                                         向数据库提交事务
(4)ROLLBACK;                                 将事务回滚,所有的数据库操作被取消
(5)SET AUTOCOMMIT = 1;              开启MySQL自动提交
-- 事务的操作
-- 1,关闭自动提交
SET autocommit = 0;

-- 2,开启事务
START TRANSACTION;

-- 3,执行一组SQL语句
update bank set bmoney = bmoney-1000 where bname='马智';
update bank set bmoney = bmoney+1000 where bname='刘鑫淼';

-- 4,结束事务
-- 4.1 提交
COMMIT;

-- 4.2 回滚
ROLLBACK;

SET autocommit = 1;

5,MySQL的四种隔离级别

(1)Read Uncommitted(读取未提交内容)也称“脏读”

(2)Read Committed(读取提交内容 也叫做不可重复读)

(3)Repeatable Read(可重读)新增对应“幻读”

(4)Serializable(可串行化)

-- 查看当前隔离级别
select @@global.transaction_isolation,@@transaction_isolation;

 6,MySQL函数

函数名返回值
curdate()
返回当前的日期
curtime()返回当前的时间
now()
返回当前的日期和时间
date_format(date,fmt)
依照指定的fmt格式格式化日期date值
year(date)
返回日期date的年份(1000~9999)
month(date)
返回date的月份值(1~12)
day(date)返回date的日
# 函数
-- 必须出现在SQL语句中,不能单独出现

-- 日期函数
SELECT CURDATE();

SELECT CURTIME();

SELECT NOW();

SELECT DAYOFWEEK(NOW()) - 1 星期;

-- 请查询当月过生日的学生
SELECT * FROM student WHERE MONTH(birthday)  = MONTH(NOW());

-- 格式化日期
SELECT DATE_FORMAT(NOW(),'%Y-%c-%d');

7,计算日期的差值

-- 时间差(天数)
SELECT DATEDIFF(NOW(),'2022-5-1');
-- 时间差计算日期
-- + 多长时间以后的日期  - 多长时间以前的日期
SELECT NOW() + INTERVAL 14 DAY;
SELECT * FROM student WHERE MONTH(birthday)  = MONTH(NOW());

8,常用的字符串函数

函数名返回值
concat(s1,s2...sn)
将s1,s2...,sn连接成字符串
concat_ws(sep,s1,s2...sn)
将s1,s2...,sn连接成字符串,并用sep 字符间隔
-- 字符串函数
SELECT CONCAT('hello','你好');
SELECT CONCAT_WS('!','hello','你好');

8,常用数学函数

函数名返回值
ceiling(x)
返回大于x的最小整数值
floor(x)
返回小于x的最大整数值
round(x,y)
返回参数x的四舍五入的有y位小数的值
truncate(x,y)
返回数字x截短为y位小数的结果
-- 向上取整
SELECT CEILING(68.15);

-- 向下取整
SELECT FLOOR(68.15);

-- 四舍五入
SELECT ROUND(68.55,1);

-- 截断
SELECT TRUNCATE(68.55,1);
-- 聚合函数
SELECT ssex,COUNT(*),GROUP_CONCAT(sname) FROM student GROUP BY ssex;

9,慢查询

概念:MySQL默认10秒内没有响应SQL结果,则为慢查询。

# 慢查询

select count(*) from emp;
select count(1) from emp;
select count(eid) from emp;

show create table emp;

CREATE TABLE `emp` (
  `eid` bigint(20) DEFAULT NULL,
  `ename` varchar(10) DEFAULT NULL,
  `esex` varchar(5) DEFAULT NULL,
  `ebirthday` datetime DEFAULT NULL,
  `ehisday` datetime DEFAULT NULL,
  `job` varchar(15) DEFAULT NULL,
  `emoney` decimal(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


-- 查看连接数
show status like 'connections'; 

-- 慢查询的状态  OFF 关闭  ON 开启
Show variables like '%slow_query%';

-- 开启慢查询
set global slow_query_log='ON';

set global log_output='TABLE';

-- 慢查询的次数
show status like 'slow_queries';

select * From mysql.slow_log ;

select convert(sql_text using utf8) sql_text from mysql.slow_log

ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。

explain select eid,ename,esex,ebirthday,ehisday,job ,emoney 
from emp where eid = 20000;

10,索引

概念:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

特点:

(1)高效性:利用索引可以提高数据库的查询效率。

(2)完整性:用户可以加速表和表之间的连接, 实现表与表之间的参照完整性。

(3)唯一性 :索引可以确保所查的数据的唯一性。

(4)特殊能力 :通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统性能。

缺点:

(1)虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、

UPDATE和DELETE。
(2)因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘
空间的索引文件。
(3)如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

11,索引的分类

(1)主键索引        在数据库关系图中为表定义一个主键将自动创建主键索引。

(2)唯一索引        不允许具有索引值相同的行,从而禁止重复的索引或键值。      

(3)常规索引        最基本的索引类型,没有唯一性之类的限制。

(4)全文索引        搜索引擎的关键技术,用于检索文本信息,可以是词语或者段落。

alter table emp add primary key (eid);

explain select eid,ename,esex,ebirthday,ehisday,job ,emoney 
from emp where eid = 44040;

explain select * from emp where ename = '韦崔'

-- 添加常规索引
alter table emp add index(ename);
create table wenzhang(
	wid int PRIMARY KEY auto_increment,
	title varchar(20),  
	content text, 
	zuozhe varchar(20), 
	FULLTEXT(title,content,zuozhe) with parser ngram
);

insert into wenzhang(title,content,zuozhe) 
values
('西安往事','这是一个古老的城市,在这个城市中有很多的人,工厂,建筑物','老薛'),
('山西往事','这是一个古老的城市,这里有很多的人,工厂,建筑','老许'),
('地球往事','这是一个古老的星球,这里有很多的人','老刘在西安'),
('银河往事','这是一个系,打算在这个系之外造一个西安','小彭');

-- 是一种模糊查询
select * from wenzhang where match(title,content,zuozhe) AGAINST('西安');
select * from wenzhang where match(title,content) AGAINST('西安');
alter table wenzhang add fulltext(title,content) with parser ngram;


-- 查看索引
show index from student;
  cardinality / count(*) 越接近1 越好 越接近0 越差

show index from emp;



 

原网站

版权声明
本文为[手可摘鑫晨]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_61562689/article/details/125214372