Hz零基础学习MySql(基础篇1)

1)interactive_timeout:
参数含义:服务器关闭交互式连接前等待活动的秒数(交互式连接超时时间mysql工具、mysqldump等)
默认值28800秒。关闭闲置工具连接的等待时间。
(2)wait_timeout:
参数含义:服务器关闭非交互连接之前等待活动的秒数(连接mysql api程序,jdbc连接数据库等) 
默认值28800秒。关闭闲置api、连接池的等待时间。

MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在
连接到MySQL Server处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有
大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL 
Server的连接上限数,这会报'too many connections'的错误。

执行.sql脚本文件

方式1:
mysql –u用户名 –p密码 –D数据库 <[sql脚本文件路径全名]

案例:
mysql -uroot -psoftroad -Dtsumitate_mwt_it < ./insert_voucher_status.sql

方式2:
进入mysql的控制台后,使用source命令执行

mysql>source [sql脚本文件的路径全名]

案例:
mysql> source ./insert_voucher_status.sql;

char或者varchar长度问题

MySql version4 之前按字节;

MySql version5 之后按字符。

MySql的Char类型问题


1.CHAR固定长度,长度可以是0到255之间的任何值。例如, CHAR(30)最多可容纳30个字符。

2.CHAR 存储值时,将在它们的右边填充空格以达到指定的长度。

3.当CHAR被检索值时,末尾的空格被删除,除非 PAD_CHAR_TO_FULL_LENGTH启用SQL模式。


创建一张表
create table aa_char_test(
 char_text char(6)
)

插入模拟数据
insert into aa_char_test(char_text) values('AB'),('AB '),(' AB'),(' AB ')

查询数据
select 
CHAR_LENGTH(char_text) as '长度',
char_text as '内容'
from aa_char_test

长度 内容
2	 AB
2	 AB
3	  AB
3	  AB

由此可以验证,当CHAR被检索值时,末尾的空格被删除。

注意:当我们插入空字符串,它的长度为0,是一个长度为0的空字符串。
insert into aa_char_test(char_text) values('      ')
长度 内容
0	''(''不存在 为了方便读者阅读添加)


--------------------------------------------------------------------------------
设置sql_mode
如果 PAD_CHAR_TO_FULL_LENGTH启用,CHAR检索时将不会从列值中删除末尾空格。

SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

长度 内容
6	'      '(''不存在 为了方便读者阅读添加)      

MySql数据类型DATETIME

DATETIME 8字节  范围:1000-01-01 00:00:00/9999-12-31 23:59:59
格式:YYYY-MM-DD HH:MM:SS 


注意:MySql的DATETIME类型只能精确到秒,如果存在毫秒会进行四舍五入保存。

创建一张表:
CREATE TABLE `aa_time` (
  `at_datetime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

插入数据:
insert into aa_time(at_datetime) VALUES('2021-01-26 12:12:13.56788')

查询数据
2021-01-26 12:12:14 毫秒位四舍五入了。

---------------------------------------------------------------------
如何要储存带毫秒的可是设置DATETIME长度,最大是6保存6位毫秒数。

创建表:
CREATE TABLE `aa_time` (
  `at_datetime` datetime(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
插入数据:
insert into aa_time(at_datetime) VALUES('2021-01-26 12:12:13.123456')
查询数据
2021-01-26 12:12:13.123456

MySql临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,
Mysql会自动删除表并释放所有空间。
临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。


连接1

-- 创建临时表ttt_ls
CREATE TEMPORARY TABLE ttt_ls (
  name_ls varchar(20)
);
-- 给临时表插入数据
insert INTO ttt_ls(name_ls) VALUES('张三')
-- 查询临时表数据
select * from  ttt_ls

name_ls

张三


连接2

select * from  ttt_ls

报错:Table 'tsumitate_mwt.ttt_ls' doesn't exist

因为临时表只对当前连接有用。

MySQL 在Windows 下不区分大小写,但在 Linux下默认是区分大小写。
Linux下MySql默认是要区分表名大小写的。
MySql是否区分大小写设置是由参数lower_case_table_names决定的。

1)lower_case_table_names = 0 区分大小写(即对表名大小写敏感),默认是这种设置。

2)lower_case_table_names = 1 不区分大小写(即对表名大小写不敏感)。这样设置后,表名在硬盘
上以小写保存,MySQL将所有表名转换为小写存储和查找表上。该行为也适合数据库名和表的别名。也就是
说,mysql设置为不分区大小写后,创建库或表时,不管创建时使用大写字母,创建成功后,都是强制以小
写保存!


设置:

在[mysqld]节点下,加入一行: lower_case_table_names=1。

重启MySql
service mysql restart
Mysql的binary关键字


where子句的字符串比较是不区分大小写的,但是可以使用binary关键字设定where子句区分大小写。


--区分大小写
select * from t_user where binary name = 'Zb'

--不区分大小写
select * from t_user where name = 'Zb'
1.MySql查询所有表:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名'
AND  TABLE_TYPE ='BASE TABLE'

MySql查询建表语句:
show create table `表名`     

2.MySql查询所有视图:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名'
AND  TABLE_TYPE ='VIEW'

MySql查询视图创建语句:
show create view `视图名`     

3.MySql查询所有函数:
SELECT name from mysql.proc where db= 'ifms' and type='function'

mysql查询函数定义语句:
SHOW CREATE FUNCTION `函数名`   

4.MySql查询所有存储过程:
SELECT name from mysql.proc where db= 'ifms' and type='procedure'

mysql查询procedure定义语句:
SHOW CREATE procedure `存储过程名`

5.MySql查询所有触发器:
SELECT * FROM information_schema.`TRIGGERS`

mysql查询触发器定义语句:
select * from information_schema.triggers where TRIGGER_NAME='触发器名';

 1.MySql各个版本

1.MySql版本

https://dev.mysql.com/


MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。 
MySQL Enterprise Edition 企业版本,需付费,购买了之后可以电话支持 
MySQL Cluster 集群版,开源免费。可将几个MySQL Server封装成一个Server。 

2、库表概念

1.库

是数据仓库的意思,存储着一定数据结构的数据,一个数据库中可能包含着若干个表.

2.表

每一张表是由行和列组成,每记录一条数据,数据表就增加一行。列是由字段名 与字段数据属性组成,
我们称之列为字段,每一个字段有着多个属性。

3、操作语句

1.DDL 数据定义语言 (Data Definition Language) 用于库和表的创建、修改、删除。  
2.DML 数据操纵语言(Data Manipulation Language) 用于添加、删除、修改、查询数据库记录,并检查
数据完整性 
3.DQL 数据查询语言(Data Query Language)   数据进行查询 
4.DCL 数据控制语言(Data Control Language) 定义用户的访问权限和安全级别。

4、DDL库操作

1.创建数据库ldd

create database ldd;

2.查看当前在哪个库下

select database();

3.进入ldd库

use ldd;

4.删除ldd库

drop database ldd;

5.创建库时添加条件判断

create database if not exists ldd2;

6.创建库时设置字符集

create database if not exists ldd3 default character set uft8mb4;

7.查看某个库的字符集

show create database ldd3;

8.查看当前mysql使用的字符集

show variables like 'character%';

9.修改库的字符集

alter database ldd3 default character set gbk;

5、Mysql数据类型

1.整数型
     
类型      大小      范围(有符号)               范围(无符号unsigned)    用途     
TINYINT   1 字节    (-128,127)                (0,255)                 小整数值
SMALLINT  2 字节    (-32768,32767)            (0,65535)               大整数值
MEDIUMINT 3 字节    (-8388608,8388607)        (0,16777215)            大整数值
INT       4 字节    (-2147483648,2147483647)  (0,4294967295)          大整数值
BIGINT    8 字节   (-9223372036854775808‬,9223372036854775807) (0,18446744073709551615) 极大整数值



2.浮点型 

FLOAT(m,d)  4 字节    单精度浮点型  备注:m代表总个数,d代表小数位个数 
DOUBLE(m,d) 8 字节    双精度浮点型  备注:m代表总个数,d代表小数位个数
 
3.定点型 

DECIMAL(m,d)    依赖于M和D的值    备注:m代表总个数,d代表小数位个数

4.字符串类型  
类型          大小               用途 
CHAR          0-255字节         定长字符串 
VARCHAR       0-65535字节       变长字符串 
TINYTEXT      0-255字节         短文本字符串 
TEXT          0-65535字节       长文本数据 
MEDIUMTEXT    0-16777215字节    中等长度文本数据 
LONGTEXT      0-4294967295字节  极大文本数据

char的优缺点:存取速度比varchar更快,但是比varchar更占用空间
varchar的优缺点:比char省空间。但是存取速度没有char快

5.时间型 
数据类型    字节数            格式                    备注 
date        3                yyyy-MM-dd              存储日期值 
time        3                HH:mm:ss                存储时分秒 
year        1                yyyy                    存储年 
datetime    8                yyyy-MM-dd HH:mm:ss     存储日期+时间 
timestamp   4                yyyy-MM-dd HH:mm:ss     存储日期+时间,可作时间戳
 
 

6、DDL表操作

1.创建表

create table if not exists 表名(
   
  字段名 类型 约束条件 说明,
  字段名 类型 约束条件 说明,
  字段名 类型 约束条件 说明,
  字段名 类型 约束条件 说明,
  ...
)default character set 字符集;


2.约束条件

primary key     ----主键
comment         ----说明解释 
not null        ----不为空 
default         ----默认值 
unsigned        ----无符号(即正数) 
auto_increment  ----自增 
zerofill        ----自动填充 
unique key      ----唯一值

3.案列

create table if not exists stu(
  id tinyint(5) zerofill unsigned auto_increment unique key not null comment '学号',
  name varchar(20) not null comment '姓名',
  sex tinyint not null default 1 comment '0 女 1 男'
) default character set utf8;




-- tinyint(5) 设定长度 使用了zerofill 自动填充 前面会自动补0
+-------+------+-----+
| id    | name | sex |
+-------+------+-----+
| 00001 | 张三 |   1 |
| 00002 | 王五 |   0 |
+-------+------+-----+


注意:以下方式也可以创建表

-- 创建stu2表 复制stu的结构
create table stu2 as select * from stu where 1=2;

-- 创建stu3表 复制stu的结构和数据
create table stu3 as select * from stu;

-- 创建stu4表 复制stu的结构。使用上述as复制表,会忽略auto_increment约束条件,所有建议复制表结
构使用like方式

create table stu4 like stu;

7、查看表基本信息

1.查看库中所有表

show tables;

2.查看表结构

desc 表名;

3.查看创建表的SQL语句

show create table 表名;

-- 这种方式只能到DOS窗口运行
show create table  表名\G   

8、DDL表操作

1.修改表名

rename table 旧表名 to 新表名;

rename table stu4 to user;


2.表中新增字段


alter table 表名 add 字段名 类型 约束条件;

alter table user add addr varchar(50) not null comment '地址';


3.表中最前面添加字段

alter table 表名 add 字段名 类型 约束条件 first;

alter table user add job varchar(20) default '你好' comment 'job' first;

4.表中某个字段后添加新字段

alter table 表名 add 字段名 类型 约束条件 after 目标字段名;

alter table user add phone char(11) not null after id;

5.修改字段类型

alter table 表名 modify 字段名 类型 约束条件;

alter table user modify phone varchar(20) not null;

6.修改字段名

alter table 表名 change 旧名称 新名称 类型 约束条件;

alter table user change phone telephone char(11) not null;

7.删除列

alter table 表名 drop 列名;

alter table user drop telephone;

8.修改表的字符集

alter table 表名 character set 字符集;

alter table user character set  utf8mb4;

9.删除表
drop table 表名;

drop table 表名 if exists;


9、DML表数据新增

1.普通插入

insert into 表名(字段1,字段2,...) values('值1','值2',...);

insert into 表名 values('对应表的所有字段值');


2.蠕虫复制


insert into 表1 select * from 表2;

insert into 表1(字段1,字段2) select 字段1,字段2 from 表2;

3.批量插入

insert into 表1 values('值'),('值'),('值')...

10、DML表数据修改删除

1.更新数据

update 表名 set 字段名1=值1 where 字段名=值;
update 表名 set 字段名1=值1,字段名2=值2 where 字段名=值;

2.删除数据

delete from 表名 where 字段名=值;

truncate table 表名; 
delete from 表名; 
drop table 表名;


注意:

delete:会把删除数据的操作,记录事务日志中保存,以便进行进行回滚操作。不会释放表空间,不会清空计
数器值。
truncate:不会记录删除表中数据的操作,会将表占用的空间恢复到最初,清空计数器的值。
drop:直接删除整个表,释放表占用的空间。

11、字符编码

1.字符编码

show variables like 'character%'; 

+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8mb4                                |
| character_set_connection | utf8mb4                                |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8mb4                                |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | C:\mysql-5.7.20-winx64\share\charsets\ |
+--------------------------+----------------------------------------+


character_set_client:客户端请求数据的字符集 
character_set_connection:客户端与服务器连接的字符集 
character_set_database:数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将默认使用配置上的字符集 
character_set_results:返回给客户端的字符集(从数据库读取到的数据是什么编码的) character_set_server:为服务器安装时指定的默认字符集设定。 
character_set_system:系统字符集(修改不了的,就是utf8) 
character_sets_dir:mysql字符集文件的保存路径


注意:

临时修改字符集: 

set names 字符集;

永久修改字符集:

修改配置文件my.cnf里边的

[client] 

default-character-set=字符集 作用于外部的显示


[mysqld] 

character_set_server=字符集 作用于内部,会作用于创建库表时默认字符集



12、DQL

1.between

--between包含两边

select 字段 from table where 字段 between 范围1 and 范围2;


2.聚合函数

count(*)
sum()
max()
min()
avg()

3.other

distinct 字段

distinct(字段)

4.group by  having  order by 


where  ->   group by  -> having  ->  order by  -> limit
5.exists子查询


exists子查询后面是一个受限的select查询。
exists子查询,如果exists后的内层查询能查出数据,则返回 TRUE 表示存在;为空则返回 FLASE则不存在。


exists
not exists

-- dept主表 每次将d.deptnu作为条件查询 返回true则显示此条记录

SELECT
	d.*
FROM
	dept d
WHERE
	EXISTS (
		SELECT
			e.*
		FROM
			employee e
		WHERE
			d.deptnu = e.deptnu
	)
6.左外连接右外连接

左连接称之为左外连接 右连接称之为右外连接 这俩个连接都是属于外连接。


左连接关键字:left join 表名 on 条件 / left outer 表名 join on 条件 

右连接关键字:right join 表名 on 条件/ right outer 表名 join on 条件

左连接说明: left join 是left outer join的简写,左(外)连接,左表(a_table)的记录将会全部表示出
来, 而右表 (b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。  


右连接说明:right join是right outer join的简写,与左(外)连接相反,右(外)连接,左表(a_table)只会
显示符合 搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。



SELECT
	d.dname,
	e.*
FROM
	dept d
LEFT JOIN employee e ON d.deptnu = e.deptnu
7.内连接

内连接:获取两个表中字段匹配关系的记录 

主要语法:INNER JOIN 表名 ON 条件;


8.联合查询

union 去除重复

union all 不去重复


union查询的注意事项:

(1)两个select语句的查询结果的“字段数”必须一致;
(2)通常,也应该让两个查询语句的字段类型具有一致性;
(3)也可以联合更多的查询结果;
(4)用到order by排序时,需要加上limit(加上最大条数就行),需要对子句用括号括起来


13、DCL限制root用户指定ip登录

1.限制root用户指定ip登录

-- mysql自带库

use  mysql;


--修改root登录Host

update user set host='指定ip' where user='root';

--刷新权限

flush privileges;

14、修改root密码

1.方式1

进入mysql

set password for 用户@ip = password('密码');

set password for root@localhost = password('admin');


2.方式2

使用mysqladmin命令,无需进去mysql服务

mysqladmin -u用户 -p旧密码 password  回车


mysqladmin -uroot -padmin password

New password: 密码

Confirm new password: 确认密码

3.方式3

update更新user表

update mysql.user set authentication_string=password('密码') where user='用户' and
host='ip';

update mysql.user set authentication_string=password('admin') where user='root' and
host='localhost';

15、忘记密码处理

1.修改配置文件

linux修改my.cnf

windows修改my.ini


第一步:修改配置文件
在[mysqlId]下面添加上

skip-grant-tables  --跳过权限认证的意思


第二步:重启mysql服务

第三步:mysql -uroot -p 无需密码进入

第四步:修改密码

16、创建用户

1.创建用户语法

create user '用户名'@'ip' identified by 'password';

username:你将创建的用户名
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程
主机登陆可以使用通配符%
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器


2.删除用户

drop user '用户名'@'ip';

delete from mysql.user where user = '用户名';


3.查看权限

show grants for '用户名'@'ip';

+-----------------------------------------+
| Grants for ldd@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'ldd'@'localhost' |
+-----------------------------------------+

17、权限设置与回收

1.设置权限

授权语法:

--对现有用户进行授权

grant 权限1,权限2... on 数据库对象 to '用户';
 
flush privileges;

grant all privileges on *.* to 'ldd';    --对现有用户ldd授权所有库所有权限

flush privileges;

grant select,update,insert on Hz.* to 'hzUser'; --对现有用户hzUser授权Hz库下所有表的查、修
、插权限。

flush privileges;

grant select on Hz.user to 'hzadmin'; --对现有用户hzadmin授权Hz库下user表的查询权限。

flush privileges;

--创建用户并授权权限

grant 权限1,权限2... on 数据库对象 to '用户'@'ip' identified by 'password';

grant all privileges on *.* to 'pig'@'%' identified by '123456'; --创建配置用户并授权所有库所有表权限


flush privileges;

2.回收权限

回收语法:

revoke 权限1、权限2... on  数据库对象 from '用户'@'ip';


revoke all privileges on *.* from 'ldd'@'%';  --回收用户ldd所有库所有表权限

flush privileges;

revoke insert on Hz.* from 'hzUser'@'%';  --回收用户hzUser,Hz库下所有表的插入权限

flush privileges;




注意:
grant all privileges on *.* to 'mwt_travelQ';
mwt_travelQ用户不存在,通过权限设置一个不存在用户,会自动创建该用户并且该用户的密码
是空串。如果需要使用此用户访问数据库,需要修改下该用户的密码





18、事务

1.事务

一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务.


注意:
1.在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
2.事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
3.事务用来管理 insert,update,delete 语句。
4.在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。

--查询提交模式
show session variables like 'autocommit';

2.手动开启事务

BEGIN 或 START TRANSACTION 显式地开启一个事务

ROLLBACK 事务回滚

COMMIT 事务确认

3.临时修改事务自动提交

SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交

4.永久修改事务自动提交

修改配置文件
windows  my.ini
linux    my.cnf

在[mysqld]下面加上:
autocommit=1 
记得重启服务才会生效 


5.查看autocommit状态

OFF(0):表示关闭 
ON (1):表示开启

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+

6.查看所有引擎

show engines;

7.设置表引擎

alter table 表名 engine = '引擎名称';
事务必须满足4个条件(ACID):

原子性(Atomicity,或称不可分割性)
一致性(Consistency)
隔离性(Isolation,又称独立性)
持久性(Durability)。

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环
节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行
过一样。

一致性:在事务执行完毕后,数据的变化符合我们预设的规则,而达到一个预期的结果。

隔离性:指一个事务在执行操作的时候,不能被其他事务干扰。就是一个事务内部操作的数据对并发的其他事
务是隔离的,并发执行的各个事务之间不能相互干扰。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提
交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。



查询MySql事务隔离级别

select @@tx_isolation;

@@tx_isolation
REPEATABLE-READ--可重复读

19、视图

1.视图

视图(view)是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据
字典中的。 通过视图,可以展现基表(用来创建视图的表叫做基表base table)的部分数据,说白了视图的数
据就是来自于基表

优点:

1.简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤
好的复合条件 的结果集。

2.安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,
但是通过视图就 可以简单的实现。

3.数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修
改列名,则 可以通过修改视图来解决,不会造成对访问者的影响。  

4.不占用空间:视图是逻辑上的表,不占用内存空间

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率

缺点:

 1.性能差:sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所
定义,那么,即 使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的
时间。
 
2.修改限制:当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于
简单的试图来 说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。





创建视图
1.create view <视图名称> as select 语句;    

2.create view <视图名称> (字段) as select 语句;    

更新视图(视图存在进行更新视图,比如更新视图中的某些视图字段等等)
1.create or replace view <视图名称> as select 语句;




修改视图
alter view <视图名称> as select 语句;

删除视图
drop view <视图名称> ;



/*
视图的ALGORITHM
ALGORITHM = MERGE/TEMPTABLE/UNDEFINED

MERGE:当使用视图时,会把查询视图的语句和创建视图的语句合并起来,形成一条语句,最后再从基表
中查询

TEMPTABLE:当使用视图时,会把创建视图的语句的查询结果当成一张临时表,再从临时表中进行筛选

UNDEFINED:未定义,自动,让系统帮你选
*/

CREATE ALGORITHM=UNDEFINED VIEW <视图名称> AS SELECT 语句;



补充:
CREATE ALGORITHM=UNDEFINED DEFINER=`mwt_travelQ`@`%` SQL SECURITY DEFINER VIEW 
<视图> AS SELECT 语句

DEFINER=`mwt_travelQ`@`%`:指定视图创建者;
SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式;
任意用户X访问此VIEW时,能否成功取决于X是否有调用该VIEW的权限,以及definer(DEFINER=`mwt_travelQ`@`%`)是否有view中的SELECT的权限。


SQL SECURITY DEFINER

DEFINER 表示按定义者拥有的权限来执行
INVOKER 表示用调用者的权限来执行。默认情况下,系统指定为DEFINER 

注意:
SQL SECURITY 优先级高

20、触发器

1.触发器

触发器就是监视某种情况,并触发某种操作

2.创建触发器

-- 自定义语句的结束符号

delimiter // 

create trigger 触发器名称 after/before insert/update/delete on 表名

for each row

begin

sql语句;

end

//

3.说明

after/before:可以设置为事件发生前或后 

insert/update/delete:它们可以在执行insert、update或delete的过程中触发 

for each row:每行执行一次动作


4.删除触发器

drop trigger 触发器名称;
1.触发器案列


员工迟到一次扣薪资


--创建迟到表

create table if not exists work_time(

id int not null comment '迟到员工编号',

name varchar(20) not null comment '迟到员工姓名',

sal int not null comment '扣除薪资'

)default character set utf8mb4;


--创建触发器
delimiter //

create trigger t_work after insert on work_time

for each row

begin

update employee set sal = sal - new.sal where empno = new.id;

end 

//

-- 插入work_time记录,便会执行触发器update更新语句,扣除薪资

delimiter ;

insert into work_time  values(1001,'小乔',1000);


注意:

new:指的是事件发生before或者after保存的新数据
mysql触发器new old:

"NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)
新和旧

的列名属于创建了过渡变量("transition variables")。

对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及
OLD同时使用。下面是一个UPDATE中同时使用NEW和OLD的例子。


CREATE TRIGGER tr1  
BEFORE UPDATE ON t22   
FOR EACH ROW   
BEGIN   
SET @old = OLD.s1;   
SET @new = NEW.s1;   
END; 
现在如果t21表中的s1列的值是55,那么执行了"UPDATE t21 SET s1 = s1 + 1"之后@old的值会变成55,

而@new的值将会变成56。

触发器的执行间隔:FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。

21、存储过程

1.存储过程

存储过程就是把复杂的一系列操作,封装成一个过程。类似于shell,python脚本等。

优点:

1.复杂操作,调用简单

2.速度快

缺点:

1.封装复杂

2.没有灵活性




2.创建存储过程语法:

delimiter  //

create procedure 名称(参数...)

begin

过程体;

过程体;

end

//

3.参数说明

参数:in|out|inout 参数名称 类型(长度)        

in:表示调用者向过程传入值(传入值可以是字面量或变量)        

out:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)        

inout:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)


4.参数说明

外部参数传入

set @变量名 = 值;

存储体声明变量

declare 变量名 类型(长度) default 默认值;

调用存储过程

call 名称(@变量名)

删除存储过程

drop procedure 名称

查看创建存储过程命令

show create procedure 名称;
1.案列


mysql> delimiter //
mysql> create procedure my_pro(in n int)
    -> begin
    -> select * from employee limit 0,n;
    -> end
    -> //
Query OK, 0 rows affected

mysql> set @n = 3;
    -> //
Query OK, 0 rows affected

mysql> call my_pro(@n);
    -> //
+-------+--------+--------+------+------------+-------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal   | deptnu |
+-------+--------+--------+------+------------+-------+--------+
|  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 7000  |     20 |
|  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000 |     30 |
|  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500 |     30 |
+-------+--------+--------+------+------------+-------+--------+
3 rows in set

Query OK, 0 rows affected

mysql> delimiter ;
2,案列


mysql> delimiter //
mysql> create procedure my_pro()
    -> begin
    -> declare n int(11) default 5;
    -> select * from employee limit n;
    -> end
    -> //
Query OK, 0 rows affected

mysql> delimiter ;
mysql> call my_pro;
+-------+--------+--------+------+------------+-------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal   | deptnu |
+-------+--------+--------+------+------------+-------+--------+
|  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 7000  |     20 |
|  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000 |     30 |
|  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500 |     30 |
|  1004 | 猪八戒 | 经理   | 1009 | 2001-04-02 | 29750 |     20 |
|  1005 | 后裔   | 销售员 | 1006 | 2011-09-28 | 12500 |     30 |
+-------+--------+--------+------+------------+-------+--------+
5 rows in set

Query OK, 0 rows affected

22、存储引擎

1.什么是数据库存储引擎?

数据库引擎是数据库底层软件组件,不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用
不同的数据库 引擎,可以获得特定的功能。


2.查询数据库引擎

show engines;

3.查看表数据库引擎

show create table 表名;

4.查看当前库所有表的引擎

show table status;

5.创建表并设置存储引擎

create table if not exists 表名(
   ...
   ...
   ...   
) engine = 存储引擎 default character set utf8mb4;


6.修改表的存储引擎

alter table 表名 engine = 存储引擎;

7.修改默认存储引擎

windows  my.ini

linux    my.cnf

[mysqld]下面 
    
default-storage-engine=MyIsAM     

记得保存后重启服务
MyISAM与InnoDB的区别

MySql5.5之前默认的存储引擎--MyISAM
MySql5.5之后默认的存储引擎--InnoDB


1.事务

InnoDB支持事务,MyISAM不支持。

2.外键

InnoDB支持外键,而MyISAM不支持。

3.具体行数

InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。

MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件);

4.锁

MyISAM支持表级锁。

InnoDB支持行级锁,在sql语句执行时索引失效时,使用表级锁。

5.主键

InnoDB表必须有主键(用户没有指定的话会自己生产一个用户不可见的主键)。

Myisam不支持主外键。


6.存储

Innodb:frm是表定义文件,ibd是数据文件

Myisam:frm是表定义文件,myd是数据文件,myi是索引文件


23、索引

1.索引

索引保存了数据库表中记录的引用指针。可以通过索引快速找到某列或某行的数据值。
索引底层是根据B-tree数据结构实现的,采用的这个折半查找法(二分查找法),减少全表
的扫描提高查询效率。


折半查找法:依赖的数据必须是有序的。




优点:

1.加快数据的检索速度
2.保证数据的完整性和准确性


缺点:

索引需要占用物理空间
对表中数据修改时,索引也需要跟着动态维护,降低了数据的维护速度


2.索引类别

index  普通索引

unique 唯一索引

primary key 主键索引

foreign key 外键索引

fulltext 全文索引

组合索引


3.查看某张表使用的索引

SHOW INDEX FROM table_name\G

24、普通索引和唯一索引

1.普通索引

普通索引(index)顾名思义就是各类索引中最为普通的索引,主要任务就是提高查询速度。其特点是允许出现
相同的索引 内容,允许空(null)值


2.唯一索引

(unique)顾名思义就是不可以出现相同的索引内容,但是可以为空(null)值


3.创建表时创建索引

mysql> create table if not exists sy1(
    -> id tinyint not null comment 'id',
    -> name varchar(20) not null,
    -> index(name), -- 定义普通索引
    -> unique(id)   -- 定义唯一索引
    -> )engine = InnoDB default character set utf8mb4;


注意:假如没有指定索引名称时,会以默认的字段名为索引名称

4.直接为表添加索引

alter table 表名 add 索引类型  [索引名称|可选] (字段姓名);

alter table sy2 add index id_index (id);

alter table sy2 add unique name_unique (name);



5.删除索引

drop index 索引名 on 表名;

drop index id_index on sy2;

alter table 表名 drop index 索引名;

alter table sy2 drop index name_unique;

25、主键索引

1.主键索引

把主键添加索引就是主键索引,它是一种特殊的唯一索引,不允许有空值,而且是唯一索引(unique是允许为空值
的)。指定 为“PRIMARY KEY”


注意:

每一张表只能拥有一个主键


2.创建主键


--创建表的时候创建表

mysql> create table if not exists sy3(
    -> id tinyint not null comment '',
    -> name varchar(20) not null,
    -> primary key(id)  --指定主键
    -> )engine=InnoDB default character set utf8mb4;

--直接为表添加主键索引

alter table 表名 add primary key (字段名);

alter table sy3  add primary key (id);


3.删除主键

alter table 表名 drop primary key;

alter table sy3 drop primary key;


注意:在有自增的情况下,必须先删除自增,才可以删除主键

删除自增:alter table 表名 change 字段 字段 类型 约束条件;

26、全文索引

1.全文检索

全文索引是将存储在数据库中的文章或者句子等任意内容信息查找出来的索引,单位是词。全文索引也是目前搜索引擎 使用的一种关键技术。指定为 fulltex


2.创建表时设置全文检索

create table if not exists 表名(

...
...

name varchar(100) not null comment '',

fulltext(name)

)engine = MyISAM default character set utf8mb4;

3.通过alter 添加

alter tale 表名 add fulltext (字段名);

4.删除全文检索

alter table 表名 drop index 索引名

--  全文检索单位是以词为准
5. 使用全文检索

-- *通配符  使用通配符*时,只能放在词的后边,不能放前边

select * from 表名 where match(字段名) against('检索内容*' in boolean mode)


注意:

1、一般情况下创建全文索引的字段数据类型为 char、varchar、text 。其它字段类型不可以
2、全文索引不针对非常频繁的词做索引。比如is,no,not,you,me,yes这些,我们称之为停止词
3、对英文检索时忽略大小写
4、对中文支持不友好

27、外键

1.外键

通过一列或多列,使两张表进行关联,保证表与表之间数据的完整性和准确性。


2.创建表时创建外键


mysql> create table if not exists wj_two(
    -> id int(11) not null comment '',
    -> name varchar(20) not null comment '',
    -> foreign key(id) references wj_one(id)   --创建外键
    -> )engine = InnoDB default character set utf8mb4;


3.alter创建外键

alter table 表名 add foreign key(字段) references 表(字段);

4.删除外键约束

alter table 表名 drop foreign key 外键约束名;

alter table wj_three drop foreign key wj_three_ibfk_1;

5.注意

(1)俩个表,主键跟外键的字段类型一定要相同
(2)要使用外键约束表的引擎一定得是InnoDB引擎,MyISAM是不起作用的

28、联合索引

1.联合索引

联合索引又称组合索引或者复合索引,是建立在俩列或者多列以上的索引。


2.创建表创建联合索引

mysql> create table if not exists lhsy_two(
    -> id int(11) not null comment '',
    -> name varchar(20) not null comment '',
    -> index(id,name) --联合索引
    -> )engine = InnoDB default character set utf8mb4;

3.alter创建联合索引

alter table 表名 add index [索引名] (字段1,字段2,字段3);

alter table test add index lhsy_ndy (username,servnumber,password);

4.删除索引

alter table 表名 drop index 索引名

5.为什么要使用联合索引,而不使用多个单列索引?

联合索引的效率远远高于单列索引

6.联合索引的最左原则 

add index lhsy_ndy (username,servnumber,password);

使用联合索引查询时,一定要加上最左侧的字段条件(username),否则将不会使用联合索引。

注意:

  索引并非越多越好,过多的索引会增加数据的维护速度还有磁盘空间的浪费。
  当表的数据量很大的时候,可以考虑建立索引。
  表中经常查数据的字段,可以考虑建立索引。
  想要保证表中数据的唯一性,可以考虑建立唯一索引。
  想要保证俩张表中的数据的完整性跟准确性,可以考虑建立外键约束。
  经常对多列数据进行查询时,可以考虑建立联合索引。

29、慢查询日志与问题定义

1.慢查询日志

通过慢查询日志,可以查看比较耗时的SQL语句。


2.查看慢查询日志是否开启

show variables like 'slow%';

slow_query_log = OFF 关闭状态
slow_query_log = ON  开启状态

+---------------------+---------------------------------------+
| Variable_name       | Value                                 |
+---------------------+---------------------------------------+
| slow_launch_time    | 2                                     |
| slow_query_log      | OFF                                   |
| slow_query_log_file | C:\MySQLData\DESKTOP-NSD3UGJ-slow.log |
+---------------------+---------------------------------------+

3.开启慢查询日志

--开启
set global slow_query_log = on;
--关闭
set global slow_query_log = off;

+---------------------+---------------------------------------+
| Variable_name       | Value                                 |
+---------------------+---------------------------------------+
| slow_launch_time    | 2                                     |
| slow_query_log      | ON                                    |
| slow_query_log_file | C:\MySQLData\DESKTOP-NSD3UGJ-slow.log |
+---------------------+---------------------------------------+

4.查看慢查询时间临界值

show variables like '%long%';

-- long_query_time  默认是10秒,超过10秒都算慢查询

+----------------------------------------------------------+-----------+
| Variable_name                                            | Value     |
+----------------------------------------------------------+-----------+
| long_query_time                                          | 10.000000 |
| performance_schema_events_stages_history_long_size       | 10000     |
| performance_schema_events_statements_history_long_size   | 10000     |
| performance_schema_events_transactions_history_long_size | 10000     |
| performance_schema_events_waits_history_long_size        | 10000     |
+----------------------------------------------------------+-----------+

5.设置慢查询时间标准

set long_query_time=0.001;

6.指定慢查询日志的存储路径及文件(默认和数据文件放一起)

-- slow_query_log_file 查询mysql数据文件存储的位置
show variables like '%datadir%' 
-- 查询慢查询日志存储位置
show variables like '%slow_query_log_file%'

7.log_queries_not_using_indexes 是否记录未使用索引的SQL
-- 通过查询 默认是关闭的
show variables like '%log_queries_not_using_indexes%'

8.log_output 日志存放的地方

show variables like '%log_output%'

日志可以存储成文件FILE 也可以直接插入TABLE表中。
通过查询得出默认值为FILE,这个值建议使用默认值,不建议修改成TABLE。
如果值是TABLE,日志将会插入自带的mysql库中show_log表中。


9.查询慢查询日志,日志中记录了符合慢查询时间标准的记录

直接进入所在位置查询文件内容

-- 用户名 、用户的IP信息、线程ID号
# User@Host: root[root] @ localhost [::1]  Id:    32
-- 执行花费的时间【单位:毫秒】
# Query_time: 0.001694  
-- 执行获得锁的时间
#Lock_time: 0.000658
-- 获得的结果行数 
#Rows_sent: 304
-- 扫描的数据行数  
#Rows_examined: 304
-- SQL开始执行时间戳 
#SET timestamp=1586265232;
-- 执行的SQL 
#select * from a01_wlry; 




注意;

重启mysql服务会让在交互界面设置的慢查询恢复到默认
永久生效的设置方法:修改配置文件 windows my.ini  linux my.cnf

[mysqld] 
slow_query_log = 1  --设置为1表示开启
long_query_time = 0.1  --设置超过0.1秒 为慢查询SQL
slow_query_log_file = 自定义慢日志.log

最后必须重启服务才能生效!



慢查询日志中会记录所有符合规则的语句,不单单是查询语句。

30、SQL语句执行过程解析

1.explain

--查询SQL语句执行

mysql> explain select * from employee\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: employee
   partitions: NULL
         type: ALL
possible_keys: NULL   --可能使用的索引
          key: NULL   --使用的索引
      key_len: NULL
          ref: NULL
         rows: 14     --扫描的行数
     filtered: 100.00
        Extra: NULL


select_type查询的类型,主要是用于区别 普通查询、联合查询、子查询等的复杂查询.

SIMPLE:简单的 select 查询,查询中不包含子查询或者UNION

PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为

SUBQUERY:在SELECT或WHERE列表中包含了子查询

DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生)MySQL会递归执行这些子查询, 把结果放在
临时表里。

UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外
层SELECT将被标记为:DERIVED

UNION RESULT:从UNION表获取结果的SELECT


type显示的是访问类型,是较为重要的一个指标.

结果值从最好到最坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery 
> index_subquery > range > index > ALL 

system :表只有一行记录(等于系统表),平时不会出现,这个也可以忽略不计.

const表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,
所以很快如将主键置于where列表中,MySQL就能将该查询转换为一个常量.

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

ref:非唯一性索引扫描,返回匹配某个单独值的所有行

range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引一般就是在你的where
语句中出现了between、<、>、in等的查询


ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

index: Full Index Scan,index与ALL区别为index类型只遍历索引树

key_len:
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度
越短越好.key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义
计算而得,不是通过表内检索出的


2.查看性能详情是否开启

show variables like '%profiling%';

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| have_profiling         | YES   |
| profiling              | OFF   |
| profiling_history_size | 15    |
+------------------------+-------+

3.开启性能详情

set profiling = on;

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| have_profiling         | YES   |
| profiling              | ON    |
| profiling_history_size | 15    |
+------------------------+-------+

4.查询性能记录

mysql> show profiles;

+----------+------------+-----------------------------------+
| Query_ID | Duration   | Query                             |
+----------+------------+-----------------------------------+
|        1 | 0.01346875 | show variables like '%profiling%' |
|        2 | 0.00046000 | select * from employee            |
+----------+------------+-----------------------------------+

5.查看语句执行性能详情

mysql> show profile for query 2;

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000111 |
| checking permissions | 0.000011 |
| Opening tables       | 0.000031 |
| init                 | 0.000029 |
| System lock          | 0.000014 |
| optimizing           | 0.000004 |
| statistics           | 0.000016 |
| preparing            | 0.000013 |
| executing            | 0.000003 |
| Sending data         | 0.000145 |
| end                  | 0.000004 |
| query end            | 0.000007 |
| closing tables       | 0.000006 |
| freeing items        | 0.000058 |
| cleaning up          | 0.000009 |
+----------------------+----------+

--status详情
https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

31、SQL语句优化注意点

1.尽量精准查询

尽量避免使用 select * ,而是精准查询具体列

2.尽量避免使用or

如果查询条件某个字段存在索引,而另外的字段不存在索引,那么使用or关键查询,将不会使用索引。


mysql> explain select * from employee where empno = 01001 or ename = '小乔'\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: employee
   partitions: NULL
         type: ALL
possible_keys: PRIMARY,empno  --可能会使用到主键索引
          key: NULL           --实际没有使用到,因为使用了or ename不存在索引
      key_len: NULL
          ref: NULL
         rows: 14
     filtered: 16.43
        Extra: Using where
1 row in set, 1 warning (0.00 sec)


如果查询条件中字段都存在索引 那么使用or关键字查询,也会使用索引。

alter table employee add index (ename);


mysql> explain select * from employee where empno = 01001 or ename = '小乔'\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: employee
   partitions: NULL
         type: index_merge
possible_keys: PRIMARY,empno,ename
          key: PRIMARY,ename
      key_len: 4,83
          ref: NULL
         rows: 2
     filtered: 100.00
        Extra: Using union(PRIMARY,ename); Using where

3.模糊查询%放到前面会使索引失效

--放到后面使用索引

mysql> explain select * from employee where ename like '小%'\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: employee
   partitions: NULL
         type: range
possible_keys: ename  --可能使用的索引
          key: ename  --使用索引
      key_len: 83
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using index condition

--放到前面将不使用索引

mysql> explain select * from employee where ename like '%小'\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: employee
   partitions: NULL
         type: ALL
possible_keys: NULL  --可能使用的索引
          key: NULL  --实际使用的索引
      key_len: NULL
          ref: NULL
         rows: 14
     filtered: 11.11
        Extra: Using where




4.判断字段为null的时候,一定写 is null 会使用索引(如果该字段存在索引),不要使用 = null 不会
使用索引。

5.group by 分组时不会使用索引,全表扫描的。

6.group by 分组默认会进行排序,禁止排序可以提高效率。

group by order by null;

7.select * from t where b >= 101 和 select * from t where b > 100

不要使用 >= 会进行2次全表扫描。  

8.尽量避免在where字句中使用 != 或 <>,会放弃使用索引进行全表扫描。

9.尽量避免使用in,not in ,会放弃使用索引 进行全表扫描。



32、mysql数据安全之备份

1.数据库的备份类型:
 
(1)完全备份:对整个数据库的数据进行备份
(2)部分备份:对部分数据进行备份(可以是一张表也可以是多张表)
      增量备份:是以上一次备份为基础来备份变更数据的,节约空间
      差异备份:是以第一次完全备份的基础来备份变更备份的,浪费空间


2.数据库备份的方式:

(1)逻辑备份:直接生成sql语句保存起来,在恢复数据的时候执行备份的sql语句来实现数据的恢复
(2)物理备份:直接拷贝相关的物理数据

区别:逻辑备份效率低,节约磁盘空间。物理备份效率高,占用磁盘空间。

3.数据库备份的场景:

(1)热备份:备份时,数据库的读写操作不会受到影响
(2)温备份:备份时,数据库的读操作可以进行,但是写操作不能执行
(3)冷备份:备份时,不能进行任何操作

33、mysqldump备份数据

1.mysqldump

mysqldump是Mysql服务自带命令工具

mysqldump -u用户名 -hip地址 -p 需要备份的库名 表名 > 备份存储路劲


2.备份单库中所有表的数据和结构

mysqldump -uroot -hlocalhost -p ldd2  > C:/mysqlDataTwo/ldd2.sql

3.备份单库中某些表的数据和结构

--备份ldd2库中 employee,a01_wlry 表数据和结构

mysqldump -uroot -p ldd2 employee a01_wlry > C:/mysqlDataTwo/ldd2_employee_a01_wlry.sql

4.备份单库中所有表的数据和结构,并保存创建库的语句

mysqldump -uroot -hlocalhost -p  --databases ldd2  > C:/mysqlDataTwo/ldd2_ku.sql

5.备份多库中所有表的数据和结构,并保存创建库的语句

--备份ldd2 mini_app 库

mysqldump -uroot -hlocalhost -p  --databases ldd2  mini_app > C:/mysqlDataTwo/ldd2_mini_app_ku.sql

6.备份全部库

mysqldump -uroot -p --all-databases > C:/mysqlDataTwo/all_ku.sql

34、数据恢复

1.恢复数据

--备份数据没有使用--databases ,备份数据文件里没有创建库的语句,需要指定库。
--若库不存在,请先创建库并指定库

mysql -uroot -hip地址 -p 库名 < sql文件

mysql -uroot -p ldd2 < C:/mysqlDataTwo/ldd2_employee_a01_wlry.sql

--若备份数据存在创建库语句,则不需要指定库名

mysql -uroot -p < C:/mysqlDataTwo/ldd2_ku.sql

35、物理备份

1.查看数据库源文件位置

show variables like 'datadir%';

+---------------+---------------+
| Variable_name | Value         |
+---------------+---------------+
| datadir       | C:\MySQLData\ |
+---------------+---------------+

查看配置文件

windows my.ini
Linux   my.cnf


2.MyISAM表源文件

 db.opt:创建库的时候生成,主要存储着当前库的默认字符集和字符校验规则

.frm :记录着表结构信息的文件

.MYI:记录着索引的文件

.MYD :记录着表的数据

3.InnoDB表源文件:InnoDB有着共享表空间跟独立表空间的概念。

db.opt:创建库的时候生成,主要存储着当前库的默认字符集和字符校验规则

.frm :记录着表结构信息的文件

.ibd :独立表空间,里边记录这个表的数据和索引


4.物理备份

MyISAM:

直接拷贝数据文件

InnoDB:

直接拷贝数据文件,并且同时拷贝

ib_logfile0
ib_logfile1
ibdata1

36、二进制日志mysqlbinlog备份数据

1.二进制日志

二进制日志就是记录着mysql数据库中的一些增删改写入性操作,不包括查询。

2.二进制日志有哪些功能:

二进制日志有着数据复制和数据恢复的功能

--log_bin     OFF;关闭
--log_bin     ON; 开启                    

show variables like 'log_bin%';

+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
+---------------------------------+-------+

3.开启二进制

修改配置文件,重启mysql服务

windows my.ini
linux   my.cnf

[mysqld] 

--二进制文件路劲  文件会自动生成在C:\mysqlDataTwo下名字为log_bin.index log_bin.000001

log-bin=C:\mysqlDataTwo\log_bin

server-id=1


mysql> show variables like 'log_bin%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

+---------------------------------+-------------------------------+
| Variable_name                   | Value                         |
+---------------------------------+-------------------------------+
| log_bin                         | ON                            |
| log_bin_basename                | C:\mysqlDataTwo\log_bin       |
| log_bin_index                   | C:\mysqlDataTwo\log_bin.index |
| log_bin_trust_function_creators | OFF                           |
| log_bin_use_v1_row_events       | OFF                           |
+---------------------------------+-------------------------------+

4.查看所有binlog日志列表

--File_size 大小上限为1G,超过会自动生成一个新的log_bin.000002 文件依此类推
mysql> show master logs;

+----------------+-----------+
| Log_name       | File_size |
+----------------+-----------+
| log_bin.000001 |       154 |
+----------------+-----------+

5.手动刷新一个新的二进制日志文件

flush logs;

mysql> show master logs;

+----------------+-----------+
| Log_name       | File_size |
+----------------+-----------+
| log_bin.000001 |       199 |
| log_bin.000002 |       154 |
+----------------+-----------+

6.重置,清空二进制日志文件

mysql> reset logs;



7.使用mysqldump备份数据时,加上-F选项可以重新生成一个新的二进制日志文件

mysqldump -uroot -p XD user -F  > C:\mysqlDataTwo\user_bak.sql

---------------------------------------------------------------------------------------------------------------------------------------

37、Mysq关闭等待的锁操作


-- 查看等待的锁
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

-- 关闭具体锁  传入id
kill 11562;

38、Order by多列排序

多列排序:

ORDER BY 多列的时候,先按照第一个column name排序,在按照第二个column name排序...


SELECT
  a.a_id,
  a.a_name,
  a.a_age
FROM
	aaa_test_one a
order by a.a_age desc,a.a_id desc


a_id a_name a_age
 4	  赵六	 25
 1	  张三	 25
 2	  李四	 24
 3	  王五	 23

解释:
先按照a_age降序排列,在a_age降序基础上再按照a_id降序排列。

39、Limit分页

limit 分页

默认下标是从0开始的。



SELECT
	*
FROM
	aaa_test_one a
limit 0,2


1	张三	25
2	李四	24

解释:
表示从下标0的位置开始,取2条数据。(包含下标位置,也就是从第一行开始 跟Java数组一样,下标
都是从0开始的)



SELECT
	*
FROM
	aaa_test_one a
limit 1,2

2	李四	24
3	王五	23

解释:
从下标为1的位置开始,也就是第二行开始(包含下标位置)。所以返回的是2、3。



SELECT
	*
FROM
	aaa_test_one a
limit 2

解释:
不写起始下标 默认是0


40、正则条件匹配

模糊匹配% _简单略过。

使用REGEXP、NOT REGEXP关键字进行正则匹配。


SELECT
	*
FROM
	aaa_test_one a
where a.a_name  REGEXP '^[张]'


1	张三	25

解释:
匹配a_name字段以'张'开头的记录


SELECT
	*
FROM
	aaa_test_one a
where a.a_name  NOT REGEXP '^[张]'


2	李四	24
3	王五	23
4	赵六	25


解释:
匹配a_name字段不以'张'开头的记录

41、BETWEEN

BETWEEN范围匹配

SELECT
	*
FROM
	aaa_test_one a
where a.a_id BETWEEN 1 and 4

1	张三	25
2	李四	24
3	王五	23
4	赵六	25


解释:
筛选a_id在1~4范围的记录。(包含起始值1和4)

SELECT
	*
FROM
	aaa_test_one a
where a.a_id NOT BETWEEN 1 and 1

2	李四	24
3	王五	23
4	赵六	25

解释:
筛选a_id不在1~1范围的记录。(包含起始值1和1)



注意:
MsSql数据库BETWEEN关键字包含起始范围值。



在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。

42、CHECK约束

CHECK 约束用于限制列中的值的范围。

create table if not exists aaa_test_three(
e_id int comment 'e_id',
e_name varchar(10), 
CHECK(e_id >10)
)engine=INNODB character set utf8;


解释:aaa_test_three表新增记录是,e_id的值必须大于10,否则就新增记录失败。


注意:MySql8.0+实现了CHECK, 我自己本地5.7.9测试发现CHECK无效,会被忽略。

43、AUTO_INCREMENT

MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。

默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。

要让 AUTO_INCREMENT 序列以其他的值起始,请使用下面的 SQL 语法:

ALTER TABLE 表名 AUTO_INCREMENT=100



alter table aaa_test_one auto_increment=999;

insert into aaa_test_one(a_name,a_age) 
values('张大炮',26)

select * from aaa_test_one a where a.a_name = '张大炮'

a_id  a_name    a_age
 999   张大炮	 26

44、EXISTS 

EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。

select 
a.a_id,
a.a_name,
a.a_age
from aaa_test_one a


1	张三	25
2	李四	24
3	王五	23
4	赵六	25
999	张大炮	26


select 
a.a_id,
a.a_name,
a.a_age
from aaa_test_one a
where  EXISTS 
(select * from aaa_test_two t where t.t_id = a.a_id)


1	张三	25
2	李四	24
3	王五	23
4	赵六	25



select 
a.a_id,
a.a_name,
a.a_age
from aaa_test_one a
where NOT EXISTS 
(select * from aaa_test_two t where t.t_id = a.a_id)

999	张大炮	26


45、常用函数 

SELECT 
  a.a_name
FROM
  aaa_test_one a 
WHERE
	a.a_id = 1000

sizong


SELECT
-- UCASE转换为大写
	UCASE(a.a_name)
FROM
	aaa_test_one a
WHERE
	a.a_id = 1000

SIZONG

-- LCASE转换为小写
SELECT
	LCASE(a.a_name)
FROM
	aaa_test_one a
WHERE
	a.a_id = 1000

sizong


-- MID函数用于从文本字段中提取字符 起始位置1 截取字符数2。
SELECT
	MID(a.a_name,1,2)
FROM
	aaa_test_one a
WHERE
	a.a_id = 1000

si

解释:
MID(column_name,start[,length])
column_name	必需。要提取字符的字段。
start	必需。规定开始位置(起始值是 1)。
length	可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。



-- LEN() 函数返回文本字段中值的长度。MySQL 中函数为 LENGTH():
SELECT
	LENGTH(a.a_name)
FROM
	aaa_test_one a
WHERE
	a.a_id = 1000

6



ROUND(X): 返回参数X的四舍五入的一个整数。

select ROUND(-1.23);
-> -1
select ROUND(-1.58);
-> -2
select ROUND(1.58);
-> 2

ROUND(X,D): 返回参数X的四舍五入的有 D 位小数的一个数字。如果D为0,结果将没有小数点或小数部分。

select ROUND(1.298, 1);
-> 1.3
select ROUND(1.298, 0);
-> 1




-- NOW() 函数返回当前系统的日期和时间。
select NOW()



-- DATE_FORMAT() 函数格式日期
select DATE_FORMAT(NOW(),'%Y-%m-%d')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 如果你是零基础入门MySQL,以下是一些基本的操作指南: 1. 首先,你需要登录MySQL,使用以下命令: mysql -u 用户名 -p 输入密码后就可以登录成功。 2. 选择要使用的数据库,使用以下命令: use 数据库名 这样你就可以在该数据库中进行操作。 3. 创建表格,使用以下命令: CREATE TABLE 表名 ( 列名1 数据类型, 列名2 数据类型, ... ); 4. 插入数据到表格中,使用以下命令: INSERT INTO 表名 (列名1, 列名2, 列名3, ...) VALUES (值1, 值2, 值3, ...); 例如,插入一条数据到runoob_tbl表中: INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 PHP", "菜鸟教程", NOW()); 5. 查询表格中的数据,使用以下命令: SELECT 列名1, 列名2, ... FROM 表名; 例如,查询runoob_tbl表中的所有数据: SELECT * FROM runoob_tbl; 这样就可以得到表格中的所有数据。 希望这些信息对你有所帮助。如果你有更具体的问题,可以继续提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL零基础入门教程(一)](https://blog.csdn.net/weixin_44006731/article/details/128616775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值