MySQL呕血汇总--从基础到毕业❤收藏篇❤
Posted 白大锅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL呕血汇总--从基础到毕业❤收藏篇❤相关的知识,希望对你有一定的参考价值。
mysql目录
- 前言
- 一、MYSQL基础
- 二、MYSQL高级进阶
- 三、MYSQL常见面试题
- 3.1.什么是索引?
- 3.2.索引的优点和缺点?
- 3.3.drop delete truncate 的区别?
- 3.4.主键,外键的区别?
- 3.5.如何开启从库的binlog功能?
- 3.6.请解释全备、增备、冷备、热备概念及企业实践经验?
- 3.7.开发有一堆数据发给DBA执行,DBA执行需要注意什么?
- 3.8.如何更批量更改数据库表的引擎?
- 3.9.网站打开慢,如果时数据库慢导致,如何排查并解决?
- 3.10.如何调整生产线中myslq数据库的字符集?
- 3.11.为mysql设置密码或者修改密码?
- 3.12.创建一innodb GBK表test,字段 id int(4)和name varchar(16)?
- 3.13.创建建表结构及表结构的sql语句?
- 3.14.插入一条数据“1,‘mingongge’”?
- 3.15.删除test表中的所有数据,并查看?
- 3.16.把id列设置为主键,在name字段上创建普通索引?
- 3.17.查看创建的索引及索引的类型等信息?
- 3.18.删除name,shouji列的索引?
- 3.19.查询手机号以137开头的,名字为zhao的记录(提前插入)?
- 3.20.收回mingongge库用户的select权限?
- 3.21.请解释关系型数据库的概念及主要特点?
- 3.22.请说出关系型数据库的典型产品、特点及应用场景?
- 3.23.请详细描述sql语句分类及对应代表性关键字?
- 3.24.请详细描述char(4)和varchar(4)的区别?
- 3.25.如何在线清理MySQL binlog?
- 3.26.Binlog工作模式有哪些?各什么特点,企业如何选择?
- 3.27.误操作执行了一个drop库SQL语句,如何完整恢复?
- 3.28.查看当前数据库的版本?
- 3.29.查看当前数据库的字符集?
- 3.30.MySQL如何实现双向互为主从复制,并说明应用场景?
- 3.31.mysql主从复制故障如何解决?
- 3.32.如何监控主从监控是否故障?
- 3.33.mysql数据库如何实现读写分离?
- 3.34.生产中一主多从从库宕机,如何手工恢复?
- 3.35.生产中一主多从主库宕机,如何手工恢复?
- 3.36.工作中遇到过哪些数据库故障,请描述一两个例子?
- 3.37.MySQL出现延迟有哪些原因,如何解决?
- 3.38.什么是数据库事务,事务有哪些特性?企业如何选择?
- 3.39.给出企业生产大型mysql集群架构可行备份方案?
- 3.40.企业生产mysql如何优化(请多角度描述)?
- 3.41.请描述MySQL里中文数据乱码的原理,如何防止乱码?
- 3.42.请解释非关系型数据库概念及主要特点?
- 3.43.请说出非关系型数据库的典型产品、特点及应用场景?
- 3.44.什么是MySQL多实例,如何配置mysql多实例?
- 3.45.如何加强MySQL安全,请给出可行的具体措施?
- 3.46.MySQL Sleep线程过多如何解决?
- 3.47.详述MySQL主从复制原理
- 3.48.MySQL如何实现双向互为主从复制,并说明应用场景?
- 四、继续进阶文档(修仙)
- 总结
前言
❤博主之前也是写过关于MYSQL的文章 这是属于工作杂记类型的 今天博主熬了一年没睡吐血总结 看完不会你找我 椰丝谋啦❤
一、MYSQL基础
1.安装
windows安装:https://www.cnblogs.com/tangyb/p/8971658.html
linux安装:https://blog.csdn.net/wwd0501/article/details/71171614
2.数据库介绍
2.1.什么是数据库?
存储数据的仓库,本质上就是存储数据的文件系统,方便我们管理数据。
2.2.实体(类)和表关系
一个实体对应一张表
一个对象(实例)对应一条记录
2.3.常见关系型数据库
- MYSQL:开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。
2. Oracle:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
3. DB2:IBM公司的数据库产品,收费的。常应用在银行系统中。
4. SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
5. SyBase:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
6. SQLite: 嵌入式的小型数据库,应用在手机端。
3.MYSQL基础操作❤重点❤
3.1.启动关闭
//启动mysql服务
mysqld --console
//关闭mysql服务
mysqladmin -uroot shutdown
3.2.DDL(数据定义语言,这些语句定义不同的数据段、数据库、表、列、索引等数据库对象。常用语句关键字主要包括create,drop,alter等)
由于DDL涉及表的定义、结构的修改,所以DDL较多由数据库管理员(DBA)使用
3.2.1.操作数据库
创建
1. 直接创建数据库
语法:
create database 数据库名;
实例:
create database web12;
2. 创建库并指定字符集
语法:
create database 数据库名 charset=字符集;
实例:
create database web12_1 charset=gbk;
查询
1. 查看所有数据库
语法:
show databases;
2. 查看建库语句
语法:
show create database 数据库名;
实例:
show create database web12;
修改
1. 修改数据库的字符集
语法:
alter database 数据库名 charset=字符集;
实例:
alter database web12_1 charset=utf8;
删除
1. 直接删除数据库
语法:
drop database 数据库名;
实例:
drop database web12_1;
使用数据库
1. 查看我在哪个数据库中?
语法:
select database();
2. 使用(切换)数据库
语法:
use 数据库名;
实例:
use web12;
3.2.2.操作表
创建
1. 创建表
语法:
create table 表名(
列名 数据类型,
列名 数据类型,
列名 数据类型
....
);
实例:
create table student(
id int,
name varchar(32),
birthday date
);
2. 常用数据类型
1)整型:
int
2)浮点型:
double
3)字符串:
varchar(长度)
长度范围:1~65535(中英文及特殊符号)
4)日期:
date(yyyy-MM-dd)
3. 快速创建(复制表)
语法:
create table 新表 like 旧表;
实例:
create table teacher like student;
查询
1. 查看库中所有表
语法:
show tables;
2. 查看建表语句
语法:
show create table 表名;
实例:
show create table teacher;
3. 查看表结构
语法:
desc 表名;
实体:
desc teacher;
修改
1. 添加一列
语法:
alter table 表名 add 列名 数据类型;
实例:
alter table teacher add jieshao varchar(66);
2. 修改列的数据类型
语法:
alter table 表名 modify 列名 新数据类型;
实例:
alter table teacher modify jieshao varchar(370);
3. 修改列名
语法:
alter table 表名 change 旧列名 新列名 新数据类型;
实例:
alter table teacher change jieshao intro varchar(888);
4. 删除一列
语法:
alter table 表名 drop 列名;
实例:
alter table teacher drop intro;
5. 修改表名
语法:
rename table 旧表名 to 新表名;
实例:
rename table teacher to tch;
alter table emp rename emp1;
6.修改字段排序
alter table emp add birth date after ename;
alter table emp modify age int(3) first;
删除
1. 直接删除表
语法:
drop table 表名;
实例:
drop table tch;
3.3.DML(数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用语句关键字主要包括 insert,delete,update和select等)
添加记录
1. 语法:
insert into 表名(列1,列2....) values(值1,值2);
insert into 表名 values(所有的值);
2. 注意
要求列名与值一一对应
字符类型可以使用单双引,推荐单引号
字符串可以设置所有类型,mysql底层进行隐式转换
3. 练习
insert into student(id,name,birthday) values(1,'刘强东','1964-7-1');
insert into student(id,name) values('2','杰克马');
insert into student values(3,'王健林','1960-8-3');
insert into student values(4,'撒贝宁',null);
4. 补充
insert into student values(5,'tom',null),(6,'jerry',null);
主从复制
1. 将一张表的数据快速复制到另一张表,要求:二张表结构相同
2. 步骤
1)克隆表
create table stu like student;
2)主从复制
insert into stu select * from student;
2)修改记录
1. 语法:
update 表名 set 列名1=新值1,列名2=新值2 .... [where 条件];
2. 注意
[] 中括号的内容可以省略
3. 练习
update stu set birthday='1967-1-1';
update student set birthday='1967-1-1' where id = 2;
3)删除记录
1. 语法:
delete from 表名 [where 条件];
2. 注意
[] 中括号的内容可以省略
3. 练习
delete from stu;
delete from student where id = 4;
4. 摧毁表【了解】
特点:将已有表删除,在重建一个新表
语法:
truncate table 表名;
实例:
truncate table student;
3.4.DQL单表查询❤重点❤
3.4.1.简单查询
语法:
1. 语法:
select * from 表名;
2. 对查询结果去重
select distinct 列名 from 表名;
注意:多字段去重要求内容完全一致
3. 在查询结果使用运算符,都会不影响表中原有的数据
4. null与其他数值进行运算,结果还是NULL
ifnull(列名,默认值) 函数
功能:判断如果该列有值就直接返回,如果为null就返回默认值
5. 别名
select 列名 [as] 列别名,.... from 表名 [as] 表别名;
实例:
-- 查询表中所有学生的信息
select * from student1;
-- 查询表中所有学生的姓名和对应的语文成绩
select name,chinese from student1;
-- 查询表中学生姓名(去重)
select distinct name from student1;
select distinct name,chinese from student1;
-- 在所有学生数学分数上加10分特长分
select name,math+10 from student1;
-- 统计每个学生的总分
select name,chinese+english+math from student1;
select ifnull(english,0) from student1;
select name,chinese+ifnull(english,0)+math from student1;
-- 使用别名表示学生总分
select name as 姓名,(chinese+ifnull(english,0)+math) as 总分 from student1;
-- 表别名
select stu1.name from student1 as stu1;
3.4.2.高级查询
语法(条件查询):
1. 语法:
select ... from 表名 where 条件;
2. 比较(关系)运算符
> < >= <= = !=
3. 逻辑运算符
and:条件同时满足
or:条件满足一个
not:条件取反
4. in关键字(集合)
select ... from 表名 where id in(1,3,5,7,9);
5. between关键字(范围)
select ... from 表名 where 列名 between 较小的值 and 较大的值;
6. null这哥们六亲不认
select ... from 表名 where 列名 is null; 查询为null的
select ... from 表名 where 列名 is not null;查询不为null的
7. like关键字(模糊)
select ... from 表名 where 列名 like '通配符字符串'
_ 单个任意字符
% 多个任意字符
实例:
# 关系运算符
-- 查询math分数大于80分的学生
SELECT * FROM student WHERE math > 80;
-- 查询english分数小于或等于80分的学生
SELECT * FROM student WHERE english <=80;
-- 查询age等于20岁的学生
SELECT * FROM student WHERE age = 20;
-- 查询age不等于20岁的学生
SELECT * FROM student WHERE age != 20;
# 逻辑运算符
-- 查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student WHERE age > 35 AND sex = '男';
-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student WHERE age >35 OR sex = '男';
-- 查询id是1或3或5的学生
SELECT * FROM student WHERE id = 1 OR id = 3 OR id = 5;
-- in关键字
-- 再次查询id是1或3或5的学生
SELECT * FROM student WHERE id IN (1,3,5,7,9);
-- 查询id不是1或3或5的学生
SELECT * FROM student WHERE id NOT IN (1,3,5,7,9);
-- 查询english成绩大于等于77,且小于等于87的学生
SELECT * FROM student WHERE english >=77 AND english <=87;
SELECT * FROM student WHERE english BETWEEN 77 AND 87;
-- 查询英语成绩为null的学生
SELECT * FROM student WHERE english IS NULL;
SELECT * FROM student WHERE english IS NOT NULL;
# like模糊匹配
-- 查询姓马的学生
SELECT * FROM student WHERE `name` LIKE '马%';
-- 查询姓名中包含'德'字的学生
SELECT * FROM student WHERE `name` LIKE '%德%';
-- 查询姓马,且姓名有三个字的学生
SELECT * FROM student WHERE `name` LIKE '马__';
3.4.3.排序
语法:
1. 语法:
select ... from 表名 order by 列名 [asc|desc],列名 [asc|desc];
asc:升序 (默认)
desc:降序
2. 注意:
后面排序字段在前面排序完成基础上在进行排序
实例:
# 排序
-- 查询所有数据,使用年龄降序排序
SELECT * FROM student ORDER BY age DESC;
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student ORDER BY age DESC,math DESC;
3.4.4.聚合查询
语法:
# 常用聚合函数
count(列名):统计个数
补充:对一列统计推荐使用 count(*)
sum(列名): 求和
avg(列名): 平均值
max(列名): 最大值
min(列名): 最小值
实例:
# 聚合函数
-- 查询学生总数(null值处理)
SELECT COUNT(id) FROM student;
SELECT COUNT(IFNULL(english,0)) FROM student;
SELECT COUNT(*) FROM student;
-- 查询年龄大于40的总数
SELECT * FROM student WHERE age > 40;
SELECT COUNT(*) FROM student WHERE age > 40;
-- 查询数学成绩总分
SELECT SUM(math) FROM student;
-- 查询数学成绩平均分
SELECT AVG(math) FROM student;
-- 查询数学成绩最高分
SELECT MAX(math) FROM student;
-- 查询数学成绩最低分
SELECT MIN(math) FROM student;
3.4.5.分组
语法:
1. 语法:
select 分组列名 from 表名 group by 分组列名 having 分组后条件;
2. 区别:
where:在分组前进行条件过滤,不能使用聚合函数
having:在分组后进行条件过滤,可以使用聚合函数
实例:
-- 查询男生和女各多少人
SELECT COUNT(*) FROM student WHERE sex = '男';
SELECT COUNT(*) FROM student WHERE sex = '女';
SELECT sex,COUNT(sex) FROM student GROUP BY sex;
-- 作业:按照地址分组,统计各个地区人数
SELECT address,COUNT(address) FROM student GROUP BY address;
-- 查询年龄大于25岁的人,按性别分组,统计每组的人数
-- 1.查询年龄大于25岁的人
SELECT * FROM student WHERE age > 25;
-- 2.按性别分组
SELECT sex FROM student WHERE age > 25 GROUP BY sex;
-- 3.统计每组的人数
SELECT sex,COUNT(sex) FROM student WHERE age > 25 GROUP BY sex;
-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
-- 错误 Invalid use of group function
SELECT sex,COUNT(sex) FROM student WHERE age > 25 AND COUNT(sex)>2 GROUP BY sex;
-- 正确
SELECT sex,COUNT(sex) FROM student WHERE age > 25 GROUP BY sex HAVING COUNT(sex)>2;
3.4.6.分页
语法:
1. 语法:
select ... from 表名 limit 开始索引,每页个数
2. 注意:
索引是从0开始的,默认值也为0
3. 索引公式:
索引= (当前页-1) × 每页个数
实例:
-- 查询学生表中数据,从第三条开始显示,显示6条
SELECT * FROM student LIMIT 2,6;
-- 查询学生表中数据,显示前6条
SELECT * FROM student LIMIT 0,6;
SELECT * FROM student LIMIT 6;
-- 模拟百度分页,一页显示5条
-- 第一页
SELECT * FROM student LIMIT 0,5;
-- 第二页
SELECT * FROM student LIMIT 5,5;
-- 第三页
SELECT * FROM student LIMIT 10,5;
3.5.MYSQL函数汇总
常用函数:
函数 | 功能 |
---|---|
CONCAT(s1,s2,s3…) | 连接s1到sn的字符串(任何字符串和null拼接都是null) |
insert(str,x,y,instr) | 将字符串str从x位置开始,y字符长的子串替换为字符串instr |
lower(str) | 将字符串str中所有字符变为小写 |
UPPER(str) | 大写 |
LEFT(str,x) | 返回字符串str最左边x个字符 |
RIGHT(str,x) | 返回字符串str最右边的x个字符 |
LPAD(str,n,pad) | 用字符串pad对str最左边进行填充,直到长度为n个字符串长度 |
PRPAD(str,n,pad) | 用字符串pad对str最右边进行填充,直到长度为n个字符串长度 |
LTRIM(str) | 去掉字符串str左侧的空格 |
RIGHT(str) | 去掉字符串str行尾的空格 |
REPEAT(str,x) | 返回str重复x次的结果 |
REPLACE(Str,a,b) | 用字符串b替换字符串str中所有出现的字符串a |
STRCMP(s1,s2) | 比较字符串s1和s2 |
TRIM(str) | 去掉行尾和行头的空格 |
SUBSTRING(str,x,y) | 返回字符串str x位置起y字符串长度的字串 |
数字函数:
函数 | 功能 |
---|---|
ABS(X) | 返回x的绝对值 |
CEIL(X) | 返回大于x的最小整数值 |
FLOOR(X) | 返回小于x的最大整数值 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0-1内的随机值 |
ROUND(x,y) | 返回参数x的四舍五入的有y位小数的值 |
TRUNCATE(x,y) | 返回数值x 以上是关于MySQL呕血汇总--从基础到毕业❤收藏篇❤的主要内容,如果未能解决你的问题,请参考以下文章 |