Mysql运维操作指令复习
2026/7/23 17:16:20 网站建设 项目流程

☛ 运维之数据库

数据库运维,最常用的莫过于4大技能:增删改查,另外才用更高级的操作;

一、Mysql之查:

1)查数据库:show databases;
2) 查表:show tabless;
3)查表结构:desc tablesname;
4)单表查询所有;select * from student;
5) 单表查询某字段:select s_name from student;
6)单表查询条件限制查询:select s_name from student where s_id<5;
7)单表查询自定字段列值后重命令显示(一般该字段名字长,不便显示):

selects_name as 名字 from student;

8)

1.2、高阶SQL语句

1、排序

① 按单字段排序:asc 升序[默认] ,desc 降序

语法:
select 显示用字段 from 表名 where 判断用字段>=Number order by 以哪个字段做排序 desc;

举例:select id from user where point>=200 order by point desc;

② 多字段排序:order by 以后的参数 使用","分割,优先是按先后循序而定

语法:select 字段1 from 表名 order by 字段2 desc,字段3 desc;

举例:select id from user order by point desc,id desc;

注意:先根据字段1进行降序排序,在进行字段2的降序排序,第一个字段只有在出现相同数值的时候第二字段才有意义。

2、条件判断

① or/and:and表示需要同时满足,or表示只需要满足其中之一

语法:select * from 表名 xx >20 and xx<=10;

举例:select id from user where point > 100 and point <= 500;

② 嵌套/多条件

语法:select * from 表名 where xx > 10 or (xx > 15 and xx < 50);

举例:select id from user where point > 100 or (point > 150 and point < 500);

3、重复记录

① 查询不重复记录:使用distinct参数

语法:select distinct 字段 from 表名;

示例:select distinct id from user;

② 指定多字段去重:distinct必须放在最开头,distinct只能使用需要去重的字段进行操作,指定多个字段去重的话,必须要满足这几个字段同时出现重复值时才会被过滤

语法:select distinct 字段 from 表名 where 字段 in (select distinct 字段 from 表名);

举例:select id,name from user where point in (select distinct point from user);

4、排序

③ 对结果进行分组

使用group by语句来实现对 SQL 查询出来的结果进行分组,group by 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(count) 、求和(sum) 、求平均数(avg) 、最大值(max) 、最小值(min),group by 分组的时候可以按一个或多个字段对结果进行分组处理

语法:select count(字段) from * where 表名 group by 字段;

举例:select count(name),point from user where point>=300 group by point;

对user表进行分组,筛选范围/条件是point大于等于300的name,point相同的会默认分在一组

④ 结合排序语法

语法:select count(字段) from * where 表名 group by 字段 order by count(字段) desc;

举例:select count(id),name from user group by point;

selectcount(id),name from user group by point order by count(id)asc;
5、有限输出内容

⑤ 限制条目结果

默认sql’查询的结果集返回的是所有匹配的记录,我们使用limit语句就可限制返回结果条目,其中位置偏移量第一条是0,第二条是1,以此类推。

语法:select * from 表名 limit number;
select * from 表名 order by 字段 desc limit number; //结合order by排序

举例:select * from user limit 2,3; //limit 2 限制结果为前2条记录;limit 2, 3 从第2行开始,查询3条记录 起始值为第0行;limit 2 offset 3 查询 2条记录,从第3行开始 起始值为第0行

select * from user order by id desc limit 2,3;

6、子查询

⑥ 子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句;子查询语句是先于主查询语句被执行,其结果作为主查询的条件返回给主查询进行进一步的查询过滤,子语句可以与主语句所查询的表相同,也可以是不同的表

示例1:select name,score from info where id in (select id from info where score>80); //子查询不仅可以在select语句中使用,在insert、update、delete中也同样使用,支持多次嵌套,还可以使用not in表示对结果集过滤

⑦ 子查询:exists

语法:
select count(*) as number from 表名 where exists(
select id from 表名 where 字段=‘值’
)

// exists 用来进行布尔值判断,后面跟内查询语句,是否成立where 之后跟条件判断加exists之后的条件是否成立,如果成立,则正常执行count为计数 sum为求和 使用sum求和结合exists,如子查询结果集不成立输出null/

⑧ 子查询-别名

eg1:先查询表字段[看作一个结果集],然后将结果集作为一张表用于主查询进一步筛选

语法:select 别名.字段 from (select 字段 from 表) 别名;

举例:select a.id from (select id,name from info)a;

select * from 表名,此为标准格式,而以上的查询语句,"表名"的位置其实是一个结果集,mysql并不能识别;
此时给与结果集设置一个别名,并且以select a.id,name from a;的方式查询,将此结果集视为一张表就可以正常查询出数据了。

eg2:当表中有命名过长的字段时,可以通过设置别名来缩短语句中书写长名称;

用例:select 字段 AS 别名 from 表名;

eg3:使用AS后可以用别名代替字段名,其中AS语句是可选的,其后的别名主要是为表内列或者表提供临时的名称,一般在查询过程中使用,而库内实际的表名或字段不会改变的;多用于对复杂的表或多表联合查询的场景,别名可以有效缩短查询语句书写。

示例:select a.name as 姓名,a.point as 点数 from user as a;

⑨ 去加条件查询,使用IN语句,限定范围

语法:select 字段 from 表名 where 字段 in (‘值1’,‘值2’…);

举例:select name from user where money in (100,200);

7、模糊查询

⑩ 通配符:主要用于替换字符串的部分字符,通过部分字符的匹配将相关结果查询出来,其中:
%:百分号表示零个或以后多个字符
_下划线:表示单个字符

示例:select * from info where name like ‘F_i%k’; //查询F后任意单个字符i后零个或多个任意字符k

1.3、MySQL集群状态

1、主从查询:

主库:show master status\G;
备库:show slave status\G;

2个输出中位置一致;Slave_SQL_Running=Yesslave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。

2、确认主从同步故障日志:
mysql> show variables like “log_error”;

1.4、多表联合查询

MySQL多表连接查询是一种为将多张表中的数据联合起来合并展示的查询方式,通常用于要查询的字段分布在多张关联表中,需要跨多张表查询的情况。MySQL多表连接查询可以通过多种方式实现,例如:INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN(交叉连接)等语句。

连接类型连接方式说明
内连接join等同于inner join用于获取两个表中字段匹配关系的记录,即两个表的交集部分
外连接left join 或left outer join(等同于left join)获取左表所有记录,即使右表没有对应匹配的记录,右表中没有匹配的记录则填充NULL,即左表优先原则
外连接right join 或right outer join(等同于right join)与LEFT JOIN相反,用于获取右表所有记录,即使左表没有对应匹配的记录,左表中没有匹配的记录则填充NULL。
外连接join union或union并集去重
外连接union all不会去掉结果集中的重复行
交叉
连接
cross join获取两个表中所有记录的排列组合,也就是两个表的笛卡尔积

1)内连接示例(一种场景:求交集

内连接查询:内连接查询是最常见的连接查询,它可以查询两张或两张以上的表

内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
其中,on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id);当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。

//语法(旧):select 字段1,字段2... from 表1,表2...[where 条件];如果不加条件直接进行查询:select * from tab_a,tab_b,则会出现结果为 笛卡尔乘积的结论; //笛卡尔乘积公式:A表中数据条数 * B表中数据条数=笛卡尔乘积.selecta.*,b.* from tab_a a,tab_b b wherea.id=b.id;#上述语句:使用逗号(,)来分隔表或列,该语句使用了老式的 JOIN 语法,这被称为隐式或交叉 JOIN,它在没有指定 JOIN 类型时默认为 CROSS JOIN(笛卡尔积:积会导致大量无用数据)。如果 tab_a 和 tab_b 表中的 id 列是用来关联两个表的外键或主键,并且想要执行一个内连接(INNER JOIN),使用显式的 INNER JOIN 语法会更为清晰和现代selecta.*, b.* from tab_a a innerjointab_b b on a.id=b.id;#推荐selecta.*, b.* from tab_a ajointab_b b on a.id=b.id;#注:不指定join类型,默认情况下是 INNER JOIN;selecta.*, b.* from tab_a ajointab_b b where a.id=b.id;#[on过滤条件 ] [ where查询条件 ;on从语法上可省略,但如果省略它,将查询的是多表的笛卡尔积(交叉连接结果);#多join嵌套;连续使用多个 JOIN 来连接多个表时,实际上是在执行一系列嵌套的连接操作,即递进交集,最小交集,多表的共同部分且满足过滤条件SELECT * FROM 表1 JOIN 表2 ON 条件过滤1 JOIN 表3 ON 条件过滤2;#得出的结果是: 表1 和 表2 的连接结果与 表3 的连接结果的交集。也就是说,只有当记录同时存在于所有三个表中(符合所有连接条件),这些记录才会出现在最终的结果集中。
2)外连接示例(六种场景)

以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL。

//1、左(外)连接: 左连接left join: 左外连接(左连接), 以左表为主表;左表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留;若不能匹配,右表的字段都置NULL。 基本语法: from 左表 leftjoin右表 on 左表.字段=右表.字段;语法:select * from 表1 leftjoin表2 on 连接条件[where条件查询]#表1查询结果是所有数据,表2查询结果是与表1重合部分的数据,没有则填null全显示左表eg1:select a.*, b.* from tablea a left[outer]jointableb b on a.id=b.id;#得到的是A的所有数据,和满足某一条件的B的数据eg2:select a.id aid,a.age,b.id bid,b.name from tablea a leftjointableb b on a.id=b.id Where b.id is null#表a的数据全部显示,匹配表b的数据也显示,且同时过滤表b的id为空的数据,这种场景下得到的是A中的所有数据减去"与B满足同一条件 的数据",然后得到的A剩余数据;//2、右(外)连接: right join: 右外连接(右连接), 以右表为主表,右表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留;若不能匹配,左表的字段都置NULL。 基本语法: from 左表 rightjoin右表 on 左表.字段=右表.字段;语法:select * from 表1 rightjoin表2 on连接条件[where条件查询]; eg1:select a.id aid,a.age,b.id bid,b.name from tablea a rightjointableb b on a.id=b.id;#表b的数据全部显示,表a匹配表b的数据也显示,不匹配的填充null;即显示的是B的所有数据,和满足某一条件的A的数据;eg2:select a.id aid,a.age,b.id bid,b.name from tablea a rightjointableb b on a.id=b.id where a.id is null;#将得到的是B中的所有数据减去 "与A满足同一条件 的数据“,然后得到的B剩余数据;//全连接:求并集,使用 leftjoinunion right join;union过后,重复的记录会合并(select a.id aid,a.age,b.id bid,b.name from tablea a leftjointableb b on a.id=b.id)union(select a.id aid,a.age,b.id bid,b.name from tablea a rightjointableb b on a.id=b.id)#得到的是满足某一条件的公共记录,和各表独有的记录,即各表独立部分+互相交集部分(去重)//全连接剥离交集部分:(leftjoin+ is null) union (right join+is null)(select a.id aid,a.age,b.id bid,b.name from tablea a leftjointableb b on a.id=b.id where b.id is null)#A-Bunion(select a.id aid,a.age,b.id bid,b.name from tablea a rightjointableb b on a.id=b.id#B-Awhere a.id is null)#得到的是A,B中不满足某一条件的记录之和,即最后得到的是A+B-AB;//查询id小于3和名字为“英语”的课程select* from course where id<3unionselect* from course wherename='英语';

:.on在内连接中可省略,外连接不可省略;如上一般内连接都需要加上on限定条件,如果不加会被解释为交叉连接;on在内连接中执行效果和外连接执行效果不同,比如:left join…on查询不能过滤掉左表中的数据,而内连接on查询可以过滤掉全局数据。外连接中on和where也不同:on筛选笛卡尔积过滤条件,where筛选具体业务

3)交叉连接 (cross join)

示例:select a.id aid,a.age,b.id bid,b.name from tablea a cross join tableb b;#得到A,B记录的排列组合,即笛卡儿积
加条件:select a.id aid,a.age,b.id bid,b.name from tablea across join tableb b where a.id = b.id;#此时等同于内连接的效果

:一般cross join后面加上where条件,但是用cross join+on也是被解释为cross join+where;

4)自连接

示例:select * from 表名 as t1,表名 as t2 where t1.id=t2.id [, ...];

5)联合查询

它查询的结果是将多个select语句查询结果合并到一块;因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。可以使用union和union all关键字进行操作。联合查询中,order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;

#基本语法,union选项有两个:all:表示无论重复都输出;distinct: 去重(整个重复)(默认的)select语句1 union[union 选项]select语句2 union|[union 选项]select语句n //eg1:联合查询只要求字段一样, 跟数据类型和查询字段的顺序无关selectid,addrid from addr union allselectid,addrid from student;//order byselect*from student wheresex="woman"unionselect*from student wheresex="man"order by score;#order by不能直接出现在union的子句中,但是可以出现在子句的子句中select*from(select *from student wheresex="woman"order by score)student unionselect*from(select *from student wheresex="man"order by score)student;

联合查询的意义:

查询同一张表:但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序
多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

6)子查询

使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较; 如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。

#查询成绩大于80的学生的所有信息,先在子查询中查出成绩大于80的结果集,然后将原成绩表中的成绩与结果集进行比较,如果存在,就输出这条学生的记录select* from student where score in(select score from student where score>80);#带比较运算符的子查询#如果可以确认子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。#经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)#查询奖学金等级为1的学生信息select* from student where score>(select score from scholarship wherehanmei=1);#带exists的子查询:exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后,exists返回的结果只有0和1.#如果存在成绩大于90的人则列出整个表的记录select* from student where exists(select *from student where score>90);#带any关键字的子查询:any关键字表示满足其中的任意一个条件,使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。select* from student where addrid<any(select addrid from addr);#带all关键字的子查询:all和any刚好是相反的,all关键字表示满足所有结果,使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句。select* from student where addrid>all(select addrid from addr);

二、mysql之改

1)创建表,使用 AS作为连接语句,参照另一个表

语法:create table 表名 as select * from 表名

举例:create table user_new as select * from user;

注意:
1.创建一个新的表 定义了表结构 插入表数据
2.但是约束没有复制过来,但是如果原表设置了主键那么Defaut默认为0;

2)创建视图:
视图可看作是一个临时结果集的虚拟表,是sql的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ] ; 创建视图需要create view 权限,并且对于查询涉及的列有select权限;使用create or replace 或者 alter修改视图,那么还需要改视图的drop权限。

用法:create view v_xxx as select * from 表名 where 字段>=Number; //Mysql视图的定义在from关键字后面不能包含子查询;

show create view 视图名; //显示视图创建情况

drop view 视图名[,视图名…]; //删除视图

rename table 视图名 to 新视图名; //重命名视图

3)修改视图

用法:alter view 视图名 as select 语句或alter view 视图名 as select 视图; //修改了视图,对基表数据有影响

注意:如果视图中的每一行都与物理表一一对应,就可以对视图进行更新,删除,添加等操作;如view的行是由多个物理表多行经计算得到的结果,则view就不可以更新。

4)修改表:

用法:update 表名 set 字段=‘xx’ where 字段=‘xx’; //修改原表数据,该原数据后就自动映射到对应的视图中

NULL可用来表示数据表中字段列中缺失的值,即表中该字段没有值;如果在创建表时,限制某些字段不为空,则可以使用NOT NULL关键字来占位;在向表内插入记录或者更新记录时,如果该字段没有NOT NULL并且没有值这时候新纪录的该字段将被保存为NULL,需要注意的是,NULL值与数字0或者空白的字段是不同的,值为NULL的字段表示没有值,在SQL语句中,使用IS NULL可以判断表内的某个字段是不是NULL值,相反用IS NOT NULL可以判断不是NULL值;而0值是0而不是无,区别是:空值0长度为0,不占用空间,而null值长度为null,占用空间。使用count()计算时,NULL会忽略,空值会加入计算。

update 表名 set 字段=‘’ from 字段=值; //将某表的某字段值配置为空

select * from 表名 where 字段 is null; //查询为null的值
select * from 表名 where 字段 is not null; //查询不为null的值

三、MySQL之增

3.1、创建数据库

CREATE TABLE IF NOT EXISTS dept(d_id int not null auto_increment PRIMARY KEY, d_name VARCHAR(50)not null COMMENT'部门名称')ENGINE=INNODB DEFAULT charset utf8;#添加部门数据INSERT INTO`dept`VALUES('1','教学部');INSERT INTO`dept`VALUES('2','销售部');INSERT INTO`dept`VALUES('3','市场部');INSERT INTO`dept`VALUES('4','人事部');INSERT INTO`dept`VALUES('5','鼓励部');-- 创建人员 DROP TABLE IF EXISTS`person`;CREATE TABLE`person`(`id`int(11)NOT NULL AUTO_INCREMENT,`name`varchar(50)NOT NULL,`age`tinyint(4)DEFAULT'0',`sex`enum('男','女','人妖')NOT NULL DEFAULT'人妖',`salary`decimal(10,2)NOT NULL DEFAULT'250.00',`hire_date`dateNOT NULL,`dept_id`int(11)DEFAULT NULL, PRIMARY KEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=13DEFAULTCHARSET=utf8;-- 添加人员数据 -- 教学部 INSERT INTO`person`VALUES('1','alex','28','人妖','53000.00','2010-06-21','1');INSERT INTO`person`VALUES('2','wupeiqi','23','男','8000.00','2011-02-21','1');INSERT INTO`person`VALUES('3','egon','30','男','6500.00','2015-06-21','1');INSERT INTO`person`VALUES('4','jingnvshen','18','女','6680.00','2014-06-21','1');-- 销售部 INSERT INTO`person`VALUES('5','歪歪','20','女','3000.00','2015-02-21','2');INSERT INTO`person`VALUES('6','星星','20','女','2000.00','2018-01-30','2');INSERT INTO`person`VALUES('7','格格','20','女','2000.00','2018-02-27','2');INSERT INTO`person`VALUES('8','周周','20','女','2000.00','2015-06-21','2');-- 市场部 INSERT INTO`person`VALUES('9','月月','21','女','4000.00','2014-07-21','3');INSERT INTO`person`VALUES('10','安琪','22','女','4000.00','2015-07-15','3');-- 人事部 INSERT INTO`person`VALUES('11','周明月','17','女','5000.00','2014-06-21','4');-- 鼓励部 INSERT INTO`person`VALUES('12','苍老师','33','女','1000000.00','2018-02-21', null);

四、MySQL之删

五、MySQL之用户管理

5.1、创建用户,授权

GRANT REPLICATION SLAVE,REPLICATION CLIENT on.to slaveuser@‘192.168.15.%’ IDENTIFIED BY ‘123456’;

GRANT REPLICATION SLAVE,REPLICATION CLIENT on.to slaveuser@‘localhost’ IDENTIFIED BY 123456’;

六、MySQL之索引

七、MySQL之视图

八、MySQL之事务

九、MySQL之引擎

十、MySQL 联合查询

…………未完,待整理

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询