1,事务
概念:就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。
2,事务的原则
3,实现事务的方法
4,实现事务的步骤
-- 事务的操作
-- 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、
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;