
MySQL
欧皇小德子
这个作者很懒,什么都没留下…
展开
-
数据库 -> 简述MyISAM和InnoDB的区别
简述MyISAM和InnoDB的区别MyISAM:不⽀持事务,但是每次查询都是原⼦的;⽀持表级锁,即每次操作是对整个表加锁;⼀个MYISAM表有三个⽂件:索引⽂件、表结构⽂件、数据⽂件;采⽤⾮聚集索引,索引⽂件的数据域存储指向数据⽂件的指针。InnoDb:⽀持ACID的事务,⽀持事务的四种隔离级别;⽀持⾏级锁及外键约束:因此可以⽀持写并发;⼀个InnoDb引擎存储在⼀个⽂件空间(共享表空间,表⼤⼩不受操作系统控制,⼀个表可能分布在多个⽂件⾥)也有可能为多原创 2022-03-15 23:43:45 · 998 阅读 · 0 评论 -
数据库 -> 什么是MVCC
什么是MVCC事务在并发环境下会带来脏读、脏写、不可重复读等诸多问题为了解决这些问题,保证事务的ACID四大特性,出现了诸多隔离级别去解决这些问题MySQL默认采用的隔离级别是可重复读。那么MySQL是怎么划分出4个隔离级别的?答案是通过MVCC(Multi-Version Concurrency Control)机制。多版本并发控制:是一种利用版本号来控制事务读取数据的它类似于的CAS、AQS这类乐观锁机制主要是利用undolog和read view来控制实现这里面就不细致讲了原创 2022-03-15 21:57:40 · 832 阅读 · 0 评论 -
数据库 -> ACID靠什么保证的?
ACID靠什么保证的?原子性原子性是由 undolog 日志来保存的,它记录了需要回滚的日志信息。事务回滚时,撤销已经执行成功的 SQL 语句,什么意思?我们做增、删、改这样一些 SQL 操作,它之前已经保留好一个历史版本数据了,而这个历史版本数据会存在于 undolog 中我们写一条insert,就会记录一条delete所以当你进行回滚的时候,它会找到你对应的一个历史版本数据然后进行回写,把之前成功执行的 SQL 语句给你撤销掉,这个时候就完成了最基本的一个回滚操作,这是原子性对原创 2022-03-15 21:57:09 · 1606 阅读 · 1 评论 -
数据库 -> JDBC实现
JDBC实现JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问JDBC API,并支持SQL语言。利用JDBC可以将JAVA代码连接到oracle、DB2、SQLServer、MYSQL等数据库,从而实现对数据库中的数据操作的目的。JDBC的主要功能如下:(1)建立与数据库或者其他数据源的链接(2)向数据库发送SQL命令(3)处理数据库的返回结果JDBC中常用类和接口连接到数据库(Connection)建立操作指令(Stat原创 2022-03-15 21:33:47 · 265 阅读 · 0 评论 -
数据库 -> 事务的基本特性和隔离级别
事务的基本特性和隔离级别事务基本特性ACID分别是:原⼦性指的是⼀个事务中的操作要么全部成功,要么全部失败。⼀致性指的是数据库总是从⼀个⼀致性的状态转换到另外⼀个⼀致性的状态。隔离性指的是⼀个事务的修改在最终提交前,对其他事务是不可⻅的。持久性指的是⼀旦事务提交,所做的修改就会永久保存到数据库中。隔离性有4个隔离级别● read uncommit 读未提交,可能会读到其他事务未提交的数据,也叫做脏读。● read commit 读已提交,两次读取结果不⼀致,叫做不可重复读。●原创 2022-03-15 00:35:52 · 327 阅读 · 0 评论 -
数据库 -> 对慢查询都怎么优化?
对慢查询都怎么优化?检查慢日志是否开启SHOW VARIABLES LIKE '%slow%';开启慢查询日志方法一: 临时有效/* 开启慢日志 */mysql> set global slow_query_log=on;Query OK, 0 rows affected (0.08 sec)/* 设置慢查询时间阈值 -> sql查询数据超过了就打印日志 */mysql> set global long_query_time=3600;Query OK, 0原创 2022-03-15 00:28:54 · 1291 阅读 · 0 评论 -
数据库 -> 索引设计的原则?
索引设计的原则?查询更快、占⽤空间更⼩ -> 主键: 整型 + 自增适合索引的列是出现在where⼦句中的列,或者连接⼦句中指定的列要选择最常作为访问条件的列作为主键,提高查询的效率不要过度索引。索引需要额外的磁盘空间,在修改表内容的时候,索引会进⾏维护,索引列越多,这个时间就会越⻓,**尽可能选择较短的数据类型,**可以有效地减少索引的磁盘占用。多表查询有外键的列要建⽴索引更新频繁字段不适合创建索引选择唯一性索引...原创 2022-03-14 23:26:41 · 501 阅读 · 0 评论 -
数据库 -> Mysql索引的数据结构,各⾃优劣
Mysql索引的数据结构,各⾃优劣InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝⼤多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余⼤部分场景,建议选择BTree索引。B+树:B+树是⼀个平衡的多叉树,一个节点可以有多个数据内容,这样就不会出现二叉树那样数据庞大的时候,树的高度比较高的情况,查询的次数就会少B+树叶子节点间有指针相互链接,并且会维护了索引的顺序的,所以有顺序、有相邻的引用,这样在执行范围查找的原创 2022-03-14 22:03:13 · 1748 阅读 · 0 评论 -
数据库 -> 表索引为什么使用主键+整型+自增
表索引为什么使用主键+整型+自增主键不用多说,查询效率问题整型+自增现在的MySQL是InnoDB的数据引擎,底层是B+树InnoDB必须有主键,因为整个B+树都是靠这索引来维护的,没有索引整个表就建不起来当然我们不主动加主键索引,InnoDB也会默认自己加上的让InnoDB自己加主键就会更加影响效率,要么它选择一个字段做索引,要么多加一个字段做索引它放在都要一个那我们为什么不自己定,这样也还会有上面其他效率问题B+树底层也是用二分法来对树进行一层一层的查找的那么索引使用整原创 2022-03-14 21:25:02 · 410 阅读 · 0 评论 -
数据库 -> Mysql聚簇和⾮聚簇索引的区别
Mysql聚簇和⾮聚簇索引的区别因为英文翻译为中文的原因有叫聚簇和⾮聚簇的也叫聚集和⾮聚集的,用聚集可能好理解一点聚集索引: 就是聚集了索引和数据的data数据放在一个xx.myd的文件里面索引是放在xx.myi的文件里面如果有一个数据引擎,将索引和数据放在一个文件里面的,就是聚集索引了InnoDB就是这样的一个数据引擎,它会把表里面的数据和索引放在一个文件里面它必须会有一个主键,就算我们没有指定,它也会帮我们创建的因为它需要一个索引,用索引存数据到索引的位置⾮聚集索引:原创 2022-03-14 21:13:14 · 453 阅读 · 0 评论 -
数据库 -> 索引的基本原理
索引的基本原理索引的本质 -> 索引的本质是一种排好序的数据结构,目的在于提高查询效率。MySQL 中最常用的索引的数据结构是 B+ 树索引的基本原理也就是B+ 树的基本原理一个树节点可以存放多个数据红黑树是不可以一个节点存多个数据的,B+ 树的高度比红黑树低树的叶子节点是排好序的,跟链表一样排序有前后引用的B树是没有排序的,B树不好进行范围查询B+ 有排序,做范围查找的是否就可以根据链表一样的结构向前或向后查询基本原理就是通过B+树的结构优点查询数据原创 2022-03-14 20:49:56 · 917 阅读 · 0 评论 -
MySQL -> 命令练习
cmd:"登陆":-u用户名 -p密码mysql -uroot -p123456"显示所有数据库":需要;database+s--表示复数,多个数据库show databases;"进入一个数据库":use 数据库名--可以不用;use rod;"显示现在已经进入数据库中所有的表":show tables;"显示指定数据库中所有的表":show tables from rod;"查询数据库-现在的位置在哪个数据库":查询用select,使用了类似方法的();select databa原创 2020-10-27 12:44:07 · 143 阅读 · 0 评论 -
MySQL -> 笔记--蓝奏云
蓝奏云地址:https://rod.lanzous.com/b0dkdzl8b原创 2020-10-27 12:54:36 · 688 阅读 · 0 评论 -
MySQL -> DQL:SQL执行顺序,优先级
sql执行顺序:先执行'from'关键字后面的语句,明确数据的来源,它是从哪张表取来的。接着执行'where'关键字后面的语句,对数据进行筛选。再接着执行'group by'后面的语句,对数据进行分组分类。然后执行'select'后面的语句,也就是对处理好的数据,具体要取哪一部分。最后执行'order by'后面的语句,对最终的结果进行排序,'limit' 页面查询。...原创 2020-11-04 17:53:48 · 1786 阅读 · 1 评论 -
MySQL -> DQL:基础查询 简单的查询语句(select),去重(distinct),连接(concat),判断是否为null(ifnull)
“查询表中具体字段”:select 具体字段比如name from 表;“查询表中所有字段”: * 代表所有的select * from 表;“查询常量”:select 110;“查询常数并起个名字”:AS:作为,当做#另起的字段名字:nameselect 100 as name;“查询表达式100+100”:可以进行简单的计算select 100+100;"查询表达式并起个名字":select 100+100 as 和“查询多个数据并新起名字”:格式: 表达式 as原创 2020-11-04 18:25:52 · 1005 阅读 · 0 评论 -
MySQL -> DQL:条件查询:where;条件运算符,逻辑运算符
“条件运算符”:where:条件运算符 > < = ! != <>不等于 用and连接其他条件#计算结果是0 则表示没有成立的条件#计算结果非0 则按规定条件返回 select * from 表 where 钱>100;“逻辑运算符”:where:逻辑运算符 && || !,MySQL中用and和,or或,not非 替换select * from 表 where 钱>100 and 钱<500;select * from 表 where原创 2020-11-04 18:34:56 · 669 阅读 · 0 评论 -
MySQL -> DQL:条件查询之模糊查询:like;between and;in;is null
like:像# % 表示随便多少个字符;# _ 表示一个字符;# \ 转义字符;加了\就不表示原来的意思,如n是字符n,\n变成换行;假设$是代表钱,\$代表字符$,不再表示钱;select * from 表 where name字段 like '%罗%';"第二个字符为德的所有数据": _代替第一个字符;同理有 ___A%:这里有3个_,代表第四个字符是A的数据select * from 表 where name字段 like '_德%';"字段中间有_的数据(特殊字符)":例如原创 2020-11-04 18:51:54 · 604 阅读 · 0 评论 -
MySQL -> DQL:排序查询:order by,asc升序,desc降序
“给 钱 排序”:order by:顺序# desc:降序(大到小,高到低,后到先);# asc升序(小到大,低到高,先到后);# 默认asc升序小到大;asc可以不写默认select * from 表 order by 钱 asc;#默认asc升序小到大select * from 表 order by 钱 ;#默认升序可以不写ascselect * from 表 order by 钱 desc ;#降序大到小“按姓名长度和id编号排序”:select lenth(姓名)原创 2020-11-04 21:06:07 · 696 阅读 · 0 评论 -
MySQL -> DQL:字符函数:upper,lower,concat,substr,instr,length,trim,replace,lpad,rpad
“改变大小写函数”:upper:上(大写);lower:下(小写)select upper('aaaa');# AAAAselect lower('AAAA');# aaaa“连接函数”:concat:连接select concat('aaa','_','bbb');# aaa_bbbselect concat(upper('aaa'),'_',lower('BBB'));# AAA_bbb“选择一段子串”:substr:子串–sub:附属品;string:字符串;substr:附属字符串原创 2020-11-04 21:18:33 · 448 阅读 · 0 评论 -
MySQL -> DQL:数字函数:round,truncate,mod,ceil,floor
“四舍五入”:round:圆-代表四舍五入;第二个参数代表保留小数点后几位select round(1.55);# 2select round(1.22);# 1select round(1.55,1);# 1.6“截断数字”:truncate:截断;第二个参数代表保留小数点后几位select truncate(1.55,1);# 1.5select truncate(1.555,2);# 1.55“求余”:mod:取余;±正负符号看被取余的数的符号,(10,-3)看10为正select原创 2020-11-04 21:25:13 · 231 阅读 · 0 评论 -
MySQL -> DQL:日期函数:now,curdate,str_to_date,date_format,datediff
“显示日期时间”:now:现在select now();# 2020-10-30 16:18:49select TIME(NOW());# 18:11:50SELECT YEAR(NOW());# 2020SELECT MONTH(NOW());# 10SELECT DAY(NOW());# 30“当前的日期”:current:当前,data:日期SELECT CURDATE();# 当前日期SELECT CURTIME();# 当前时间SELECT CURRENT_USER;# 当前用原创 2020-11-04 22:07:36 · 316 阅读 · 0 评论 -
MySQL -> DQL:流程控制函数:if,case when then esle end
“if()”:if(判断语句,真则返回x,假则返回y);类型与三元运算符true返回x,false返回yselect if(10>0,'他是对的','他是错的');# 他是对的“case函数”:方式一:类似swich-caseselect name,case agewhen 10 then '当age=10时,做什么事'when 11 then '当age=11时,做什么事'else 'age=其他时,做什么事'end AS 新列from 表;“case函数”:方式二:类似if嵌原创 2020-11-04 22:14:15 · 179 阅读 · 0 评论 -
MySQL -> DQL:分组函数:sum,avg,min,max,count;分组查询:group by
# 格式:select 分组函数,需要分组的字段 from 表 group by 需要分组的字段;“查询不同部门的平均工资”: group by:分组select avg(工资),部门from 表group by 部门order by avg(工资) desc;# 理解sql执行的顺序,先是from表,有where就where,再group部门分组,# 分好了以后再select后面字段,最后order by排序# 分组后查询任何一个字段都会按照分组后的组查询,查询的依旧是from中的原创 2020-11-05 10:13:26 · 270 阅读 · 0 评论 -
MySQL -> DQL:SQL92语法:连接查询:连接两个表格进行查询(内连接)
表Aname boyid柳岩 8苍老师 9Angelababy 3热巴 2周冬雨 9周芷若 1岳灵珊 9小昭 1双儿 9王语嫣 4夏雪 9赵敏 1表Bid boyname 1 张无忌 2 鹿晗 3 黄晓明 4 段誉 等值连接:“查询两个表中的数据,数据互相有关系”:使用where给定连接条件# 如果不使用where :A表中的每个数据都会匹配B中的数据,一共会出现A*B行原创 2020-11-05 12:13:27 · 1197 阅读 · 0 评论 -
MySQL -> DQL:SQL99:内连接(inner join on),外连接(left/right outer join on),交叉连接(cross)
“SQL92连接两个表:内连接”# 内连接不区分主从表select *from 表1,表2where 表1.字段 = 表2.字段;# 两表重叠部分“SQL99连接两个表:内连接”select *from 表1inner join 表2on 表1.字段 = 表2.字段;# 两表重叠部分,其中inner可以省略where '正常的筛选条件;'SQL99外连接:left/right outer join on外连接包括内连接:外连接=内连接+没有交集的部分(有些数据在从表中有对应的原创 2020-11-05 12:41:39 · 516 阅读 · 0 评论 -
MySQL -> DQL:子查询:跟在where后面的子查询
跟在where后面的子查询:“查询工资大于平均工资的员工name”:子查询返回一个单行单列的数据;><="查询工资大于平均工资的员工name"# 正常思路:可惜:where后面不能使用分组函数SELECT salary,last_nameFROM employeesWHERE salary > AVG(salary);# 错误写法# 正确的写法:使用子查询,子查询返回一个单号单列的数据# salary字段中每个数据都会与返回的avg比较,满足筛选条件的就显示查询SELE原创 2020-11-05 13:23:01 · 1451 阅读 · 0 评论 -
MySQL -> DQL:select后面的子查询,from后面的子查询
子查询:select后面的查询:只能跟一行一列的子查询如count“查询所有部门的员工个数”:"查询所有部门的员工个数":# 以前的写法:使用inner内连接两个表,分组部门select 部门表.部门,count(*)from 员工表inner join 部门表on 员工表.部门id = 部门表.部门idgroup by 部门表.部门# 子查询:select后面只能跟一行一列的,不能出现多个数据,如子查询查询的是一列数据select 部门,( select count(*) fro原创 2020-11-07 16:52:47 · 2490 阅读 · 0 评论 -
MySQL -> DQL:相关子查询(exists),分页查询(limit),联合查询(union)
相关子查询:exists判断存不存在,返回值1或者0"查询存在的id":存在就返回1,没有任何数据就返回0select exists( select id from 表);"查询员工id,条件必须存在id为100的员工":存在就返回1,输出(这里输出是输出所有id,不是id只是100的,exists只是返回1或0,不会筛选掉id!=100的数据)没有任何数据就返回0,啥也不输出(这就真不输出了,只要数据中没有id=100的,就什么也不输出)select idfrom 表where ex原创 2020-11-07 17:07:13 · 493 阅读 · 0 评论 -
MySQL -> DML:插入(insert into)
插入一个字段:insert into表id boyname 1 张无忌 2 鹿晗 3 黄晓明 4 段誉 "插入一个字段,规规矩矩的插入":insert into 表 (id,boyname) values (10,'name'); "不按照顺序插入":没有任何问题,正确的写法insert into 表 (boyname,id) values ('name',10); "插入两个但是只给一个赋值":-报错,不可以这样,写了就要有对应的数据insert into 表原创 2020-11-07 19:43:31 · 748 阅读 · 0 评论 -
MySQL -> DML:修改(update)
update: update 表 set 列=新值 where 筛选条件"将表中id=1的name修改为aaa":update 表 set name='aaa'where id=1;"将表中name有王字的name修改为aaa,age改为10":update 表 set name='aaa',age=10where name like '%王%';“修改多表的记录”"AB表连接,修改表记录":内连接update 表A ainner join 表B b ON a.id = b.id原创 2020-11-07 20:07:43 · 208 阅读 · 0 评论 -
MySQL -> DML:删除(delete),(truncate table)
删除delete:dalete from 表 where 列=记录;dalete from 表 where id=1;delete from 表 where name like '%2';多表删除:"name=xx时删除A中的记录":delete afrom 表A ainner/left/right join 表B bon a.id = b.idwhere name='xx';"name=xx时删除A,B中的记录":delete a,bfrom 表A ainner/left/r原创 2020-11-07 20:56:05 · 426 阅读 · 0 评论 -
MySQL -> DDL:数据库创建(create),修改(alter),删除(drop)
数据库创建:createcreate database 数据库名;数据库修改:alteralter database 数据库名 character set utf8;数据库删除:dropdrop database 数据库名原创 2020-11-07 21:12:43 · 407 阅读 · 0 评论 -
MySQL -> DDL:数据库表的创建(create),修改(alter add/drop/modify/change/rename column),复制表(like,select子查询方式)
创建表:create table 表 (字段 字段类型(长度 约束))# 可以加 if not exists 表用来判断存不存在表,不存在就创建# if exists,存在就创建,但是没用,存在再创建就会报错,删除的时候可以用,存在就删除create table 表 ( id int(10), name varchar(100), age int(10))修改表:add/drop/modify/change/rename"添加表字段":add columnalter table原创 2020-11-07 22:48:12 · 916 阅读 · 0 评论 -
MySQL -> DDL:数据类型(int,float,doublevarchar,enum,set,datetime)
整形:tinyint,smallint,int,bigintcreate table 表 ( id int, # 默认长度11,长度是个数,不是0-11 id bigint)insert into 表 values(1,1)字符型:char,varcharcreate table 表 ( name char(10), # 默认长度是1,长度10就会开辟10的空间,如果用不完会浪费 name2 varchar(10) # 没有默认长度,长度10是最大值,你写2个字符的,他只会开辟2个字符的原创 2020-11-08 12:52:06 · 414 阅读 · 0 评论 -
MySQL -> DDL:约束(primary,not null,default,unique),标识列(auto_increment:自增长)
主键:primary-非空,唯一(不重复)非空:not null-不能设置为null默认:default唯一:unique-可以为null,但是不能重复外键:foreign key(字段) references 外表(字段)# 约束就直接加在列的后面create table 表 ( id int primary key,# 主键:不能为空,不能重复 name varchar(20) not null,# 非空 age int(10) default 18, zuowei int(10)原创 2020-11-08 19:30:08 · 678 阅读 · 0 评论 -
MySQL -> TCL:事务步骤(transaction),脏读,不可重复读,幻读,查看隔离级别,设置隔离级别
# 开启事务1.set autocommite=0;2.start transaction;# 这个是可选的,写1就可以开启# 具体执行的sqlupdate 表 set name='1' where id=1;insert into 表(id) value(1);# 关闭事务,提交事务,1,2选一个1.commit; # 提交,完成事务的流程2.rollback; # 回滚,程序出现异常,相当于不提交,又回到开启事务之前,执行的sql等于没执行read uncommitted # 可以读原创 2020-11-08 21:52:32 · 168 阅读 · 0 评论 -
MySQL -> TCL:创建视图(view),调用视图,修改视图(or replace,alter),删除视图(drop),查看视图(desc)
视图就是一个包装好的子查询,相当于方法,使用的时候调视图名字就行创建视图:create view 自定义视图名 as 查询语句,or replace# 方式一create view 视图1asselect id,namefrom 表where id=10;# 方式二create or replace 视图1as查询语句;调用视图:视图相当于表,当做表使用# 视图就相当于一个表,当做子查询的简化版使用select * from 视图1join 表 on 视图1.id =原创 2020-11-09 16:08:44 · 1956 阅读 · 0 评论 -
MySQL -> 显示查看设置变量,全局,会话,用户,局部
显示会话(session),全局变量(global variables)show session variables;# 会话变量,当前连接有效,session可以省略show variables like '%xx%';# 部分会话变量show global variables;# 全局变量show global variables like '%xx%';# 部分全局变量查看全局,会话变量:select @@global.autocommit;# 查看全局变量自动提交变量select原创 2020-11-09 20:51:12 · 865 阅读 · 0 评论 -
MySQL -> 存储过程,创建(create procedure),调用(call),查询(select),删除(drop procedure),查看信息(show)
创建存储过程:create procedure 存储名字(参数列表)begin 存储过程体;end参数列表:in,out,inoutin 字段名 字段类型 # in:输出的,需要外边传值,默认是inout 字段名 字段类型 # out:输出的,可以返回值inout 字段名 字段类型 # inout:即可以输出又可以输入delimiter 分隔符 # 存储过程结尾加delimiter重新设置调用存储:call 存贮名字(实参列表);例子:in创建# 设置分隔符d原创 2020-11-09 22:14:28 · 2154 阅读 · 0 评论 -
MySQL -> 函数创建(create function),调用(select),查看函数结构(show create function),删除(drop function)
函数创建:create function无参数的# 函数的特点,必须有返回值,且返回值只能有一个,返回的时候注意不要返回多行,会赋值不了# 格式:create function 函数名(参数列表) returns 返回类型"定义一个函数,返回表的总行数":delimiter $create function mmp() returns varchar(22)# 只写返回类型就行begin declare 局部变量 int default 0;# 定义一个局部变量 默认是0 select c原创 2020-11-10 16:08:21 · 5258 阅读 · 0 评论