mysql命令

基础命令

 1 net start mysql:Windows系统启动MySQL服务。
 2 安装目录/mysql start:Linux系统启动MySQL服务。
 3 
 4 shutdown:后面的start换成这个,表示关闭MySQL服务。
 5 restart:换成restart表示重启MySQL服务。
 6 
 7 
 8 ps -ef | grep mysql:Linux查看MySQL后台进程的命令。
 9 kill -9 MySQL进程ID:强杀MySQL服务的命令。
10 mysql -h地址 -p端口 -u账号 -p:客户端连接MySQL服务(需要二次输入密码)。
11 show status;:查看MySQL运行状态。
12 SHOW VARIABLES like %xxx%;:查看指定的系统变量。
13 show processlist;:查看当前库中正在运行的所有客户端连接/工作线程。
14 show status like "Threads%";:查看当前数据库的工作线程系统。
15 help data types;:查看当前版本MySQL支持的所有数据类型。
16 help xxx:查看MySQL的帮助信息。
17 quit:退出当前数据库连接。

mysql库相关命令

show databases;:查看目前MySQL中拥有的所有库。
show engines;:查看当前数据库支持的所有存储引擎。
use 库名;:使用/进入指定的某个数据库。
show status;:查看当前数据库的状态信息。
show grants;:查看当前连接的权限信息。
show errors;:查看当前库中记录的错误信息。
show warnings:查看当前库抛出的所有警告信息。
show create database 库名;:查看创建某个库的SQL详细信息。
show create table 表名;:查看创建某张表的SQL详细信息。
show tables;:查看一个库中的所有表。
desc 表名;:查看一张表的字段结构。除开这种方式还有几种方式:

describe 表名;:查看一张表的字段结构。
show columns from 表名;:查看一张表的字段结构。
explain 表名;:查看一张表的字段结构。


create database 库名;:新建一个数据库,后面还可以指定编码格式和排序规则。
drop database 库名;:删除一个数据库。
ALTER DATABASE 库名 DEFAULT CHARACTER SET 编码格式 DEFAULT COLLATE 排序规则:修改数据库的编码格式、排序规则。

mysql表相关命令

CREATE TABLE `库名`.`表名`  (
    字段名称1 数据类型(精度限制) [字段选项],
    字段名称2 数据类型(精度限制) [字段选项]
) [表选项];


字段选项(可以不写,不选使用默认值):

NULL:表示该字段可以为空。
NOT NULL:表示改字段不允许为空。
DEFAULT 默认值:插入数据时若未对该字段赋值,则使用这个默认值。
AUTO_INCREMENT:是否将该字段声明为一个自增列。
PRIMARY KEY:将当前字段声明为表的主键。
UNIQUE KEY:为当前字段设置唯一约束,表示不允许重复。
CHARACTER SET 编码格式:指定该字段的编码格式,如utf8。
COLLATE 排序规则:指定该字段的排序规则(非数值类型生效)。
COMMENT 字段描述:为当前字段添加备注信息,类似于代码中的注释。


表选项(可以不写,不选使用默认值):

ENGINE = 存储引擎名称:指定表的存储引擎,如InnoDB、MyISAM等。
CHARACTER SET = 编码格式:指定表的编码格式,未指定使用库的编码格式。
COLLATE = 排序规则:指定表的排序规则,未指定则使用库的排序规则。
ROW_FORMAT = 格式:指定存储行数据的格式,如Compact、Redundant、Dynamic....。
AUTO_INCREMENT = n:设置自增列的步长,默认为1。
DATA DIRECTORY = 目录:指定表文件的存储路径。
INDEX DIRECTORY = 目录:指定索引文件的存储路径。
PARTITION BY ...:表分区选项,后续讲《MySQL表分区》再细聊。
COMMENT 表描述:表的注释信息,可以在这里添加一张表的备注。

  • show table status like 'zz_users'\G;:纵排输出一张表的状态信息。
  • alter table 表名 表选项;:修改一张表的结构,如alter table xxx engine=MyISAM
  • rename table 表名 to 新表名;:修改一张表的表名。
  • alter table 表名 字段操作;:修改一张表的字段结构,操作如下:
    • add column 字段名 数据类型:向已有的表结构添加一个字段。
    • add primary key(字段名):将某个字段声明为主键。
    • add foreing key 外键字段 表名.字段名:将一个字段设置为另一张表的外键。
    • add unique 索引名(字段名):为一个字段创建唯一索引。
    • add index 索引名(字段名):为一个字段创建普通索引。
    • drop column 字段名:在已有的表结构中删除一个字段。
    • modify column 字段名 字段选项:修改一个字段的字段选项。
    • change column 字段名 新字段名:修改一个字段的字段名称。
    • drop primary key:移除表中的主键。
    • drop index 索引名:删除表中的一个索引。
    • drop foreing key 外键:删除表中的一个外键。
  • drop table if exists 表名:如果一张表存在,则删除对应的表。
  • truncate table 表名:清空一张表的所有数据。
  • create table 表名 like 要复制的表名:复制一张表的结构,然后创建一张新表。
  • create table 表名 as select * from 要复制的表名:同时复制表结构和数据创建新表。

mysql忘记密码怎么办

①先停掉MySQL的后台服务:

  • Windows系统请执行:net stop mysql
  • Linux系统请执行:安装目录/mysql shutdownkill强杀进程也可以)

②进入到MySQL安装目录下的bin文件夹内,执行mysqld --skip-grant-tables去掉连接认证。

③因为上面关掉了连接认证,接着输入mysql敲下回车,进入mysql终端命令行。

④输入use mysql;,进入MySQL自身的系统数据库,然后输入show tables;查看所有表。

⑤查询MySQL中注册的所有用户:select user,host,password from user;

⑥使用update语句,更改root超级管理员的账号密码,如下:

update user set password=password('123') where user="root" and host="localhost";

插入数据

insert into 表名(字段名...) values(字段值...);:向指定的表中插入一条数据。
insert into 表名(字段名...) values(字段值...),(...)...;:向表中插入多条数据。
insert into 表名 set 字段名=字段值,...;:插入一条数据,但只插入某个字段的值。

删除数据

delete from 表名;:删除一张表的所有数据。
delete from 表名 where 条件;:根据条件删除一条或多条数据。
truncate table 表名:清空一张表的所有数据。

修改数据

update 表名 set 字段名=字段值,...;:修改表中所有记录的数据。
update 表名 set 字段名=字段值,... where 条件;:根据条件修改一条或多条记录的数据。
replace 表名(字段名1,...) values(字段值...),...;:批量修改对应主键记录的数据。

查询数据

select * from 表名;:查询一张表的所有数据。
select * from 表名 where 条件;:根据条件查询表中相应的数据。
select 字段1,字段2... from 表名 where 条件;:根据条件查询表中相应数据的指定字段。
select 函数(字段) from 表名;:对查询后的结果集,进行某个函数的特殊处理。

高级用法

-- 为查询出来的字段取别名
select 字段1 as 别名,... from 表名 where 条件;
select 字段1 别名,... from 表名;

-- 为查询出的表取别名
select * from 表名 as 别名;

-- 以多条件查询数据
select * from 表名 where 字段1=值1 and 字段2=值2 and ...; -- 所有条件都符合时才匹配
select * from 表名 where 字段1=值1 or 字段2=值2 or ...; -- 符合任意条件的数据都会返回
-- =符号,可以根据情况换为>、<、>=、<=、!=、between and、is null、not is null这些

-- 对查询后的结果集使用函数处理
select 函数(字段) from 表名 where 条件;

-- 对查询条件使用函数处理
select * from 表名 where 函数(条件);

-- 模糊查询
select * from 表名 where 字段 like "%字符"; -- 查询字段值以指定字符结尾的所有记录
select * from 表名 where 字段 like "字符%"; -- 查询字段值以指定字符开头的所有记录
select * from 表名 where 字段 like "%字符%"; -- 查询字段值包含指定字符的所有记录

-- 按照多值查询对应行记录
select * from 表名 where 字段 in (值1,值2,...);
-- 按照多值查询相反的行记录
select * from 表名 where 字段 not in (值1,值2,...);
-- 基于多个字段做多值查询
select * from 表名 where (字段1,字段2...) in ((值1,值2,...),(...),...);

-- 只需要查询结果中的前N条数据
select * from 表名 limit N;
-- 返回查询结果中 N~M 区间的数据
select * from 表名 limit N,M;

-- 联合多条SQL语句查询(union all表示不去重,union表示对查询结果去重)
select * from 表名 where 条件
union all 
select * from 表名 where 条件;

分组过滤、数据排序

-- 基于一个字段进行排序查询
select * from 表名 order by 字段名 asc; -- 按字段值正序返回结果集
select * from 表名 order by 字段名 desc; -- 按字段值倒序返回结果集
select * from 表名 order by 字段1 asc,字段2 desc; -- 按照多字段进行排序查询

-- 基于字段进行分组
select * from 表名 group by 字段1,字段2....;

-- 基于分组查询后的结果做条件过滤
select * from 表名 group by 字段1 having 条件;

查询语句中的各类关键字执行优先级为:from → where → select → group by → having → order by

子查询

-- 基于一条SQL语句的查询结果进一步做查询
select * from (select * from 表名 where 条件) as 别名 where 条件;

-- 将一条SQL语句的查询结果作为条件继续查询(只适用于子查询返回单值的情况)
select * from 表名 where 字段名 = (select 字段名 from 表名 where 条件);

-- 将一条SQL语句的查询结果作为条件继续查询(适用于子查询返回多值的情况)
select * from 表名 where 字段名 exists (select 字段名 from 表名 where 条件);
-- 上述的exists可以换为not exists,表示查询不包含相应条件的数据

-- 将一条SQL语句的多个查询结果,作为条件与多个字段进行范围查询
select * from 表名 where (字段1,字段2...) in (select 字段1,字段2... from 表名);

关联查询

-- 交叉连接:默认把前一张表的每一行数据与后一张表的所有数据做关联查询
select * from 表1,表2...; -- 这种方式默认采用交叉连接的方式
select * from 表1 cross join 表2; -- 显式声明采用交叉连接的方式

-- 内连接:只返回两张表条件都匹配的数据
-- 隐式的内连接写法
select * from 表1,表2... where 表1.字段 = 表2.字段 ...; 
-- 等值内连接
select * from 表1 别名1 inner join 表2 别名2 on 别名1.字段 = 别名2.字段;
-- 不等式内连接
select * from 表1 别名1 inner join 表2 别名2 on 别名1.字段 < 别名2.字段;

-- 左外连接:左表为主,右表为次,无论左表在右表是否匹配,都返回左表数据,缺失的右表数据显示NULL
select * from 表1 left join 表2 on 表1.字段 = 表2.字段;

-- 右外连接:和左连接相反,右表为主,左表为次,永远返回右表的所有数据
select * from 表1 right join 表2 on 表1.字段 = 表2.字段;

-- 全外连接:两张表没有主次之分,每次查询都会返回两张表的所有数据,不匹配的显示NULL
-- MySQL中不支持全连接语法,只能通过union all语句,将左、右连接查询拼接起来实现
select * from 表1 left join 表2 on 表1.字段 = 表2.字段
union all
select * from 表1 right join 表2 on 表1.字段 = 表2.字段;

-- 继续拼接查询两张以上的表
select * from 表1 left join 表2 on 表1.字段 = 表2.字段 left join 表3 on 表2.字段 = 表3.字段;
-- 通过隐式连接的方式,查询两张以上的表
select * from 表1,表2,表3... where 表1.字段 = 表2.字段 and 表1.字段 = 表3.字段...;
-- 通过子查询的方式,查询两张以上的表
select * from 
(表1 as 别名1 left join 表2 as 别名2 on 别名1.字段 = 别名2.字段) 
left join 
表3 as 别名3 on 别名1.字段 = 别名3.字段;
笛卡尔积问题就是指两张表的所有数据都做关联查询,一般连表查询都需要指定连接的条件,但如果不指定时,MySQL默认会将左表每一条数据挨个和右表所有数据关联一次,然后查询一次数据。比如左表有3条数据,右表有4条数据,笛卡尔积情况出现时,一共就会查询出3 x 4 = 12条数据。
mysql函数
数学函数
abs(X):返回X的绝对值,如传进-1,则返回1。
ln(X):返回X的自然相对数。
log(X,Y):返回以X的以Y为底的对数。
log10(X):返回以X基数为10的对数。
bin(X):返回X的二进制值。
oct(X):返回X的八进制值。
hex(X):返回X的十六进制值。
mod(X,Y):返回X除以Y的余数。
ceil(X) | ceiling(X):返回不小于X的最小整数,如传入1.23,则返回2。
round(X):返回X四舍五入的整数。
floop(X):返回X向下取整后的值,如传入2.34,会返回2。
greatest(X1,X2....,Xn):返回集合中的最大整数值。
least(X1,X2....,Xn):返回集合中的最小整数值。
rand(N):返回一个0~N``0~1之间的随机小数(不传参默认返回0~1之间的随机小数)。
sign(X):传入正数,返回1;传入负数,返回-1;传入0,返回0。
pow(X,Y) | power(X,Y):返回X的Y次方值。
pi():返回四舍五入后的圆周率,3.141593。
sin(X):返回X的正弦值。
asin(X):返回X的反正弦值。
cos(X):返回X的余弦值。
acos(X):返回X的反余弦值。
tan(X):返回X的正切值。
atan(X):返回X的反正切值。
cot(X):返回X的余切值。
radians(x):返回x由角度转化为弧度的值。
degrees(x):返回x由弧度转化为角度的值。
sqrt(X):返回X的平方根。
exp(e,X):返回e的x乘方的值。
truncate(X,N):返回小数X保留N位精准度的小数。
format(x,y):将x格式化位以逗号隔开的数字列表,y是结果的小数位数。
inet_aton(ip):将IP地址以数字的形式展现。
inet_ntoa(number):显示数字代表的IP地址。
......

字符串函数

ascii(C):返回字符C的ASCII码。
length(S):返回字符串的占位空间,传入“中国”,返回6,一个汉字占位3字节。
bit_length(S):返回字符串的比特长度。
concat(S1,S2,...):合并传入的多个字符串。
concat_wa(sep,S1,S2...):合并传入的多个字符串,每个字符串之间用sep间隔。
position(str,s) | locate(str,s):返回s在str中第一次出现的位置,没有则返回0。
find_in_set(S,list):返回字符串S在list列表中的位置。
insert(S1,start,end,S2):使用S2字符串替换掉S1字符串中start~end的内容。
lcase(S) | lower(S):将传入的字符串中所有大写字母转换为小写。
ucase(S) | upper(S):将传入的字符串中所有小写字母转换为大写。
left(S,index):从左侧开始截取字符串S的index个字符。
right(S,index):从右侧开始截取字符串S的index个字符。
trim(S):删除字符S左右两侧的空格。
rtrim(S):删除字符S右侧的空格。
replace(S,old,new):使用new新字符替换掉S字符串中的old字符。
repeat(str,count):将str字符串重复count次后返回。
substring(S,index,N):截取S字符串,从index位置开始,返回长度为N的字符串。
reverse(S):将传入的字符串反转,即传入Java,返回avaJ。
quote(str):用反斜杠转移str中的英文单引号。
strcmp(S1,S2):比较两个字符是否相同。
lpad(str,len,s):对str字符串左边填充len个s字符。
rpad(str,len,s):对str字符串右边填充len个s字符。
......

日期和时间函数

curdate() | current_date():返回当前系统的日期,如2022-10-21。
curtime() | current_time():返回当前系统的时间,如17:30:52。
now() | sysdate():返回当前系统的日期时间,如2022-10-21 17:30:59。
unix_timestamp():获取一个数值类型的unix时间戳,如1666348711。
from_unixtime():将unix_timestamp()获取的数值时间戳,格式化成日期格式。
month(date):获取date中的月份。
year(date):获取date中的年份。
hour(date):获取date中的小时。
minute(date):获取date中的分钟。
second(date):获取date中的秒数。
monthname(date):返回date中月份的英文名称。
dayname(date):获取日期date是星期几,如Friday。
dayofweek(date):获取date位于一周的索引位置,周日是1、周一是2...周六是7。
week(date):获取date是本年的第多少周。
quarter(date):获取date位于一年中的哪个季度(1~4)。
dayofyear(date):获取date是本年的第多少天。
dayofmonth(date):获取date是本月的第多少天。
time_to_sec(time):将传入的时间time转换为秒数,比如"01:00:00" = 3600s。
date_add(date,interval 时间 单位) | adddate(...):将date与给定的时间按单位相加。
date_sub(date,interval 时间 单位) | subdate(...):将date与给定的时间按单位相减。
addtime(date,time):将date加上指定的时间,如addtime(now(),"01:01:01")。
subtime(date,time):将date减去指定的时间。
datediff(date1,date2):计算两个日期之间的间隔天数。
last_day(date):获取date日期这个月的最后一天。
date_format(date,format):将一个日期格式化成指定格式,format可选项如下:

%a:工作日的英文缩写(Sun~Sat)。
%b:月份的英文缩写(Jan~Dec)。
%c:月份的数字格式(1~12)。
%M:月份的英文全称(January~December)。
%D:带有英文后缀的数字月份(1th、2st、3nd....)。
%d:一个月内的天数,双数形式(01、02、03....31)。
%e:一个月内的天数,单数形式(1、2、3、4....31)。
%f:微妙(000000~999999)。
%H:一天内的小时,24小时的周期(00、01、02...23)。
%h | %I:一天内的小时,12小时的周期(01、02、03...12)。
%i:一小时内的分钟(00~59)。
%j:一年中的天数(001~366)。
%k:以24小时制显示时间(00~23)。
%l:以12小时制显示时间(01~12)。
%m:月份的数字形式,双数形式(01~12)。
%p:一天内的时间段(上午AM、下午PM)。
%r:12小时制的时间(12:01:09 AM)。
%S | %s:秒数,双数形式(00~59)。
%T:24小时制的时间(23:18:22)。
%U:一年内的周(00~53)。


time_format(time,format):将一个时间格式化成指定格式。
str_to_date(str,format):将日期字符串,格式化成指定格式。
timestampdiff(unit,start,end):计算两个日期之间间隔的具体时间,unit是单位:

year:年。
quarter:季度。
month:月。
week:周。
day:天。
hour:小时。
minute:分钟。
second:秒数。
microsecond:微妙。


weekday(date):返回date位于一周内的索引(0是周一...6是周日)。

聚合函数

max(字段名):查询指定字段值中的最大值。
min(字段名):查询指定字段值中的最小值。
count(字段名):统计查询结果中的行数。
sum(字段名):求和指定字段的所有值。
avg(字段名):对指定字段的所有值,求出平均值。
group_concat(字段名):返回指定字段所有值组合成的结果,如下:
distinct(字段名):对于查询结果中的指定的字段去重。

控制流程函数

if(expr,r1,r2):expr是表达式,如果成立返回r1,否则返回r2。
ifnull(v,r):如果v不为null则返回v,否则返回r。
nullif(v1,v2):如果v1 == v2,则返回null,如果不相等则返回V1

-- if的用例
select if(user_id > 3,"√","×") from zz_users;

-- ifnull的用例
select ifnull(user_id,"×") from zz_users;

-- case语法1:
case <表达式>
when <值1> then <操作>
when <值2> then <操作>
...
else <操作>
end;
-- 用例:判断当前时间是星期几
select case weekday(now())
when 0 then '星期一'
when 1 then '星期二'
when 2 then '星期三'
when 3 then '星期四'
when 4 then '星期五'
when 5 then '星期六'
else '星期天'
end as "今天是星期几?";

-- case语法2:
case
when <条件1> then <命令>
when <条件2> then <命令>
...
else commands
end;
-- 用例:判断今天是星期几
select case
when weekday(now()) = 0 then '星期一'
when weekday(now()) = 1 then '星期二'
when weekday(now()) = 2 then '星期三'
when weekday(now()) = 3 then '星期四'
when weekday(now()) = 4 then '星期五'
when weekday(now()) = 5 then '星期六'
else '星期天'
end as "今天是星期几?";

加密函数

password(str):将str字符串以数据库密码的形式加密,一般用在设置DB用户密码上。
md5(str):对str字符串以MD5不可逆算法模式加密。
encode(str,key):通过key密钥对str字符串进行加密(对称加密算法)。
decode(str,key):通过key密钥对str字符串进行解密。
aes_encrypt(str,key):通过key密钥对str字符串,以AES算法进行加密。
aes_decrypt(str,key):通过key密钥对str字符串,以AES算法进行解密。
sha(str):计算str字符串的散列算法校验值。
encrypt(str,salt):使用salt盐值对str字符串进行加密。
decrypt(str,salt):使用salt盐值对str字符串进行解密。

系统函数

version():查询当前数据库的版本。
connection_id():返回当前数据库连接的ID。
database() | schema():返回当前连接位于哪个数据库,即use进入的库。
user():查询当前的登录的所有用户信息。
system_user():返回当前登录的所有系统用户信息。
session_user():查询所有连接的用户信息。
current_user():查询当前连接的用户信息。
charset(str):返回当前数据库的编码格式。
collation(str):返回当前数据库的字符排序规则。
benchmark(count,expr):将expr表达式重复运行count次。
found_rows():返回最后一个select查询语句检索的数据总行数。
cast(v as 类型):将v转换为指定的数据类型。

数值类型

tinyint:小整数类型,占位1Bytes,取值范围-128~127。
smallint:中整数类型,占位2Bytes,取值范围-32768~32767。
mediumint:中大整数类型,占位3Bytes,取值范围-8388608~8388607int | integer:常用整数类型,占位4Bytes,取值范围-2147483548~2147483647。
bigint:超大整数类型,占位8Bytes,取值范围-9223372036854775808~9223372036854775807float:单精度浮点数类型,占位4Bytes,取值范围-3.4E+38 ~ 3.4E+38double:双精度浮点数类型,占位8Bytes,取值范围-1.7E-308~1.7E+308。
decimal(m,d):小数类型,占位和取值范围都依赖m、d值决定,m是小数点后面的精度,d是小数点前面的标度。
bit(m):存储位值,可存储m个比特位,取值范围是1~64。

字符串类型

char:定长字符串类型,存储空间0~255Bytes。
varchar:变长字符串类型,存储空间0~65535Bytes。
tinyblob:二进制短字符串类型,存储空间0~255Bytes。
tinytext:短文本字符串类型,存储空间0~255Bytes。
blob:二进制长字符串类型,存储空间0~65535Bytes。
text:长文本字符串类型,存储空间0~65535Bytes。
mediumblob:二进制大字符串类型,存储空间0~16777215Bytes。
mediumtext:大文本字符串类型,存储空间0~16777215Bytes。
longblob:二进制超大字符串类型,存储空间0~4294967295Bytes。
longtext:超大文本字符串类型,存储空间0~4294967295Bytes。
binary(m):定长字符串类型,存储空间为M个字符。
varbinary(m):定长字符串类型,存储空间为M个字符+1个字节。

一般在为列指定数据类型时,都会varchar(255)这样写,其实中间的这个数字限制的并不是字节长度,而是字符数量,比如varchar(255),表示该列最大能存储255个字符。

时间日期类型

date:日期类型,占位3Bytes,格式为YYYY-MM-DD。
time:时间类型,占位3Bytes,格式为hh:mm:ss。
year:年份类型,占位1Bytes,格式为YYYY。
datetime:日期时间类型,占位8Bytes,格式为YYYY-MM-DD hh:mm:ss。
timestamp:时间戳类型,占位4Bytes,格式为YYYYMMDDhhmmss,最大可精确到微妙。

其他类型

json:MySQL5.7版本引入的,在此之前只能用字符串类型来存储json数据,需要通过函数辅助使用:

json_array(...):存储一个json数组的数据。
json_array_insert(字段,'$[下标]',"值"):在指定的json数组下标位置上插入数据。
json_object(...):存储一个json对象。
json_extract(字段,'$.键'):查询键为某个值的所有数据。
json_search(....):通过值查询键。
json_keys(字段):获取某个字段的所有json键。
json_set(字段,'$.键',"值"):更新某个键的json数据。
json_replace(...):替换某个json中的数据。
json_remove(字段,'$.键'):删除某个json数据。
.....:还有一些其他json类型的函数,这里不再说明,一般json类型用的较少。


enum(选项1,选项2...选项n):新增数据时只能从已有的选项中选择一个并插入。
set(选项1,选项2...选项n):新增数据时可以从已有的选项中选择多个并插入。
eometry、point、linestring、polygon:空间类型(接触不多)。

稍微解释一下enum、set类型,这两种类型就类似于平时的单选框和多选框,必须从已有的选项中选择,两者的区别在于:enum枚举类型只能选择一个选项,而set集合类型可以选择多个选项(其实用的比较少,多数情况下都是直接在客户端中处理)。

索引方面命令

-- 创建一个普通索引(方式①)
create index 索引名 ON 表名 (列名(索引键长度) [ASC|DESC]);
-- 创建一个普通索引(方式②)
alter table 表名 add index 索引名(列名(索引键长度) [ASC|DESC]);
-- 创建一个普通索引(方式③)
CREATE TABLE tableName(  
  columnName1 INT(8) NOT NULL,   
  columnName2 ....,
  .....,
  index [索引名称] (列名(长度))  
);
-- 后续其他类型的索引都可以通过这三种方式创建
-- 创建一个唯一索引
create unique 索引名 ON 表名 (列名(索引键长度) [ASC|DESC]);
-- 创建一个主键索引
alter table 表名 add primary key 索引名(列名);
-- 创建一个全文索引
create fulltext index 索引名 ON 表名(列名);
-- 创建一个前缀索引
create index 索引名 ON 表名 (列名(索引键长度));
-- 创建一个空间索引
alter table 表名 add spatial key 索引名(列名);
-- 创建一个联合索引
create index 索引名 ON 表名 (列名1(索引键长度),列名2,...列名n);

索引查看、使用与管理的命令

-- 查看一张表上的所有索引
show index from 表名;

-- 删除一张表上的某个索引
drop index 索引名 on 表名;

-- 强制指定一条SQL走某个索引查找数据
select * from 表名 force index(索引名) where .....;

-- 使用全文索引(自然搜索模式)
select * from 表名 where match(索引列) against('关键字');
-- 使用全文索引(布尔搜索模式)
select * from 表名 where match(索引列) against('布尔表达式' in boolean mode);
-- 使用全文索引(拓展搜索模式)
select * from 表名 where match(索引列) against('关键字' with query expansion);

-- 分析一条SQL是否命中了索引
explain select * from 表名 where 条件....;

 

事务与锁

start transaction; | begin; | begin work;:开启一个事务。
commit;:提交一个事务。
rollback;:回滚一个事务。
savepoint 事务点名称;:添加一个事务点。
rollback to 事务点名称;:回滚到指定名称的事务点。
release savepoint 事务点名称;:删除一个事务点。
select @@tx_isolation;:查询事务隔离级别(方式一)。
show variables like '%tx_isolation%';:查询事务隔离级别(方式二)。
set transaction isolation level 级别:设置当前连接的事务隔离级别。
set @@tx_isolation = "隔离级别";:设置当前会话的事务隔离级别。
set global transaction isolation level 级别;:设置全局的事务隔离级别,选项如下:

read uncommitted:读未提交级别。
read committed:读已提交级别。
repeatable-read:可重复读级别。
serializable:序列化级别。


show variables like 'autocommit';:查看自动提交事务机制是否开启。
set @@autocommit = 0|1|ON|OFF;:开启或关闭事务的自动提交。
select ... lock in share mode;:手动获取共享锁执行SQL语句。
select ... for share;:MySQL8.0之后优化版的共享锁写法。
select ... for update;:手动获取排他锁执行。
lock tables 表名 read;:获取表级别的共享锁。
lock tables 表名 write;:获取表级别的排他锁。
show open tables where in_use > 0;:查看目前数据库中正在使用的表锁。
flush tables with read lock;:获取全局锁。
unlock tables;:释放已获取的表锁/全局锁。
update 表名 set version=version+1 ... where... and version=version;:乐观锁模式执行。

其他详细信息:https://juejin.cn/post/7163148228420960263

作者:竹子爱熊猫
链接:https://juejin.cn/post/7163148228420960263
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2022-11-10 14:44  蹉~跎  阅读(66)  评论(0)    收藏  举报