Mysql基础与高级

哔哩哔哩:尚硅谷

Mysql基础

启动与停止mysql

注意:管理员身份进入cmd

1
2
3
net stop MySql

net start MySql

mysql服务器端的登录与退出

方式一:Mysql自带的客户端
仅限于root用户

方式二:通过windows自带的客户端

登录

1
2
3
4
5
6
7
# 非本机
mysql [-h主机名 -P端口号] -u用户名 -p密码
# 本机
mysql -h localhost -P 3306 -u root -p[******](无空格)
mysql -u root -p

exit / ctrl + c

mysql常见命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看当前所有数据库
show databases;
# 打开指定库
use 库名;
# 查看当前库所有表
show tables;
# 查看其他库所有表
show tables from 库名;
# 建表
create table 表名(
列名 列类型,
列名 列类型,
……
);
# 查看表结构
desc 表名;
# 查看服务器版本
方式一:登录到mysql服务器
select version();
方式二:没有登录到mysql服务器
mysql --version/ mysql -V

MySql语法规范

  • 不区分大小写,建议关键字大写,表名,列名小写
  • 每条命令用最好用分号结尾
  • 每条可以根据需要,进行换行缩进
  • 注释
    • 单行注释:# 注释文字
    • 单行注释:– 注释文字
    • 多行注释: /*注释文字*/

026

使用函数concat()实现多个字符串拼接

027

DESC 表名 : 查看表的结构

IFNULL(A,B)函数:如果查询字段A为NULL,则返回B,否则保持A不变。

028

<>:等同于不等于!=

&& || ! / and or not

like

between and

in

is null / is not null

029

最好使用<>代替!=

030

模糊查询

1
SELECT * FROM employees WHERE last_name LIKE '%a%';
  • LIKE关键字:

    • 一般和通配符搭配使用:

      • %可以匹配任意多个字符(零个或多个字符)

      • 可以判断字符型或数值型

      • _任意单个字符

      • 转义使用 \

      • SELECT * FROM employees WHERE last_name LIKE '_$_' ESCAPE '$'; // 声明$为转义字符。
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10

        * BETWEEN AND

        * 包含临界值
        * 两个临界值不能交换顺序

        * IN

        * ```sql
        WHERE job_id in ('a','b','c');
    • 判断某字段是否属于in列表中的某一项。

    • IN列表的类型必须一致或兼容。

    • IN不支持通配符

  • IS NULL

    • 等于运算符不能判断NULL值。
  • 安全等于<=>

    • 可以判断NULL,普通类型值。
  • 字符型和日期型常量值必须用’’括起来。

031

ISNULL 返回 1 / 原本值:判断某字段是否为NULL,如果是,则返回1,否则返回0。

045

字符函数,utf-8中,一个汉字占3字节,一个英文字母占一字节。GBK字符集中,一个汉字占两个字节。

获取使用字符集的情况:

1
SHOW VARIBALES LIKE '%char%';
  • LENGTH():获取参数值字节数。

  • CONCAT():拼接字符。

  • UPPER / LOWER:转换大小写。

  • SUBSTRING / SUBSTR

    1
    2
    3
    4
    5
    # 注意:索引从1开始
    #截取从指定索引处后面所有字符
    SELECT SUBSTR('雨过天晴云破除',5); // 返回云破除
    #截取从指定索引处指定字符长度的字符
    SELECT SUBSTR('雨过天晴云破除',1,4); //雨过天晴
  • INSTR:返回子串第一次出现的索引,如果找不到,返回0。

  • TRIM:去掉前后空格。

    • 去掉前后指定字符:

      1
      2
      #去掉前后的a
      SELECT TRIM('a' FROM 'aaaaaaaaa小aaa七aaaaaaaa');
  • LPAD / RPAD:

    1
    2
    # 用指定的字符实现左填充指定字符长度
    SELECT LPAD('白纵生',10,'*')AS out_put;
  • REPLACE:用指定的字符串替换目标字符串。

046

数学函数:

  • ROUND:四舍五入(绝对值)

    1
    2
    # 保留几位小数。
    SELECT ROUND(1.595,2);
  • CEIL:向上取整,返回大于等于该参数的最小整数(负数也是)。

  • FLOOR:向下取整,返回小于等于该参数的最大整数(负数也是)。

  • TRUNCATE:截断。

    1
    SELECT TRUNCATE(1.65,1); #小数点后保留1位。
  • MOD:取余。(等价于%)

  • RAND():获取随机数,返回0-1之间的小数

047

日期函数

#now:返回当前系统日期 + 时间

1
SELECT NOW();

#CURDATE :返回当前系统日期,不包含时间。

1
SELECT CURDATE();

#CURTIME:返回当前系统时间,不包含日期。

1
SELECT CURTIME();

#可以获取指定部分的年、月、日、时、分、秒

1
2
3
SELECT YEAR(NOW()) AS 年;
SELECT YEAR(hiredate) ASFROM employee;
SELECT MONTHNAME(NOW()) AS 月;

#str_to_date:将日期格式的字符串转换为指定格式的日期(解析)。

1
STR_TO-DATE('9-13-2021','%m-%d-%Y'); //2021-9-13
格式符 功能
%Y 4位的年份
%y 2位的年份
%m 月份(01,02……,12)
%c 月份(1,2,3……12)
%d 日(01,02,……)
%H 小时(24小时制)
%h 小时(12小时制)
%i 分钟(00,01,……,59)
%s 秒(00,01,……,59)

#date_format:将日期转换为字符。

1
DATE_FORMAT('2018/6/6','%Y年%m月%d日');

048

其他函数

1
2
3
4
5
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
SELECT PASSWORD('张加林'); #加密
SELECT MD5('张加林'); MD5#加密

049

流程控制函数

if函数:if else的效果

1
2
SELECT IF(expression1,expression2,expression3);
# 判断1的真假,如果真,返回2,否则返回3

050

case函数的使用1:switch case的效果

1
2
3
4
5
6
7
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
……
else 要显示的值n,或语句n
end
#千万注意,没有';'!!!!!

case函数的使用2:类似于 多重if

1
2
3
4
5
6
case
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
……
else 要显示的值n或语句n
end

首字符排序不同于完整的字符排序

051

分组函数:用作统计使用,又被称为聚合函数或统计函数或组函数。

SUM

AVG:忽略NULL

MAX:忽略NULL

MIN:忽略NULL

COUNT:注意!计算非空行数,NULL字段不会被计算进去(忽略NULL)。

COUNT(*)统计行数

058

DATEDIFF(a,b):求a,b两天之间的天数差。

071

进行多表连接时,为表起别名后,原名称失效,必须使用别名。

073

非等值连接

例子:

1
2
3
SELECT salary,grade_level
FROM employees AS A,jod_grades g
WHERE salary BETWEEN g.'lowest_sal' AND g.'highest_sal';
1
2
3
SELECT salary,grade_level
FROM employees AS e,job_grades g
WHERE e.salary BETWEEN g.'lowest_sal' AND g.'highest_sal';

074

自连接:别名的好处!!!

1
2
3
SELECT  e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.'employee_id' = m.'employee_id';

079

  • sql99分类:
    • 内连接:
      • inner JOIN:可以省略
    • 外连接:
      • left JOIN
      • right JOIN
    • 交叉连接:
      • cross JOIN:求笛卡尔积

089

多行子查询

操作符 含义
IN/NOT IN 等于列表中的任意一个(IN可以使用ANY来代替)
ANY/SOME 和子查询返回的某一个值比较,满足任意一个即可(ANY可以使用最大最小来代替)
ALL 和子查询返回的所有值比较,需要满足所有

092

FROM后面的子查询使用:将子查询结果当做一张表来使用,这张表必须取别名

093

相关子查询:EXISTS(查询语句),返回BOOL值(0/1),判断子查询返回值是否为空。

095

分页查询:当要显示的数据,一页显示不全,需要分页提交sql。

要显示的页数page,每页的条目数size:LIMIT (page-1)*size,size;

1
2
3
4
5
# 关键代码
# 查询时添加的内容,放在查询语句最后,也是最后执行的。
LIMIT OFFSET,SIZE;
# offset要显示条目的起始索引(起始索引从0开始,为0可以省略)
# SIZE要显示的条目个数

100

union 联合 合并:将多条查询语句的结果合并为一个结果,就是语句拆分,方便观看。

查询语句1

union

查询语句2

1
2
3
4
5
# 应用场景:要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时可以使用。
# 多表查询结果联合
SELECT id,cname,csex FROM t_ca WHERE csex='男'
union
SELECT t_id,tName,tGender FROM t_ua WHERE tGender = 'male';
  • 注意:
    • 要求联合查询时,查询的列数必须一致。
    • 要求多条查询语句的每一列的类型和顺序最好一致。
    • 结果集合会自动过滤去重,不想去重,可以添加关键字ALL(UNION ALL)

104

方式一:insert into 表名 values(),(),(),……;

方式二:insert into 表名 set ……;

  • 方式一,可以实现一条语句插入多条数据;方式二不行
  • 方式一支持子查询;方式二不支持。(insert into select将结果集插入表中)

106

修改多表的记录

sql92:

1
2
3
4
update 表1,表2
set=值,……
where 连接条件
and 筛选条件;

sql 99:

1
2
3
update 表1 别名,left|right|inner join2 别名 on 连接条件
set=值,……
where 筛选条件;

107

整个表删除:

DELETE FROM 表名;

TRUNCATE TABLE 表名;

108

多表级联删除

sql92

1
2
3
DELETE1的别名|2的别名
FROM1 别名,表2 别名
WHERE 连接条件 AND 筛选条件;

sql99

1
2
3
DELETE1的别名[,表2的别名]
FROM1 别名 LEFT|RIGHT|INNER JOIN2 别名 ON ……
WHERE 筛选条件;

109

注意:TRUNCATE语句加WHERE会报错!只能单独使用。

  • TRUNCATE与DELETE的区别:
    • 前者不能加WHERE,后者可以。
    • 前者效率高于后者
    • 假如要删除的表中有自增长列,如果用DELETE删除后,自增长列的值从断点开始;而TRUNCATE删除后,再插入数据,自增长列的值从1开始。
    • TRUNCATE删除没有返回值,而DELETE有返回值。
    • TRUNCATE删除不能回滚,而DELETE删除后可以回滚。

110

联合也可以实现多行数据插入操作。(INSERT INTO 表名 SELECT …… UNION SELECT ……UNION……)

111

库已存在,再次创建会报错。

优化:

1
CREATE DATABASE IF NOT EXISTS books;

112

修改列名

1
ALTER TABLE 表名 CHANGE COLUMN 原列名 新列名 数据类型;

修改列的类型或约束

1
ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型;

添加新列

1
ALTER TABLE 表名 ADD COLUMN 列名 数据类型 【FIRST|AFTER|LAST 字段名】;

删除列

1
ALTER TABLE 表名 DROP COLUMN 列名;

修改表名

1
ALTER TABLE 表名 RENAME TO 新表名;

115

1
2
3
# IF EXISTS 用于表、库的操作。
DROP TABLE IF EXISTS 表名;
SHOW TABLES;

116

表的复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 仅仅复制对象表的结构
CREATE TABLE 表名 LIKE 复制的对象表;

# 复制对象表的结构和数据,当然也可以只复制一部分
CREATE TABLE 表名
SELECT * FROM 复制的对象表;

# 复制部分数据
CREATE TABLE 表名
SELECT 部分属性列名
FROM 对象表名
WHERE 筛选条件;

# 复制表的部分字段结构
CREATE TABLE 表名
SELECT 部分属性列名
FROM 表名
where 永假表达式;

118

Tinyint:1字节

Smallint:2字节

Mediumint:3字节

Int\Integer:4字节

Bigint:8字节

  • 整型的特点:

    • 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号数,需要添加unsigned关键字。
    • 如果插入的数值超出了整型的范围,会警告out of range,默认插入临界值。
    • 如果不设置长度,会有默认的长度。(INT(9))
    • INT(长度)搭配ZEROFILL关键字,默认长度不会改变存储范围,只是显示的时候会有不同,显示位数不足会自动补0。
  • 浮点数

    • float:4字节
    • double:8字节
  • 定点型

    • DEC(M,D)
    • DECIMAL(M,D)

float、double中M\D可以省略,会随着插入值的精度来决定精度。

DECIMAL虽然声明时可以省略,但是会被默认置为(10,0),。

M:整数部位和小数部位的总位数,超出范围插入临界值。

D:小数点后的位数。

定点型的精度会更高。

所选择的类型越简单越好,越节约空间越好。

121

  • 较短的文本

    • char:长度省略,默认为1

    • varchar:比较节省空间,但是效率相对较低,声明时长度不可省略。

      当字符没有到达限定长度,字符有多长,分配多长的存储空间。

  • 较长的文本

    • text
    • blob
  • 位类型

    bit

    binary:包含二进制字符串,下同。

    varbinary

  • 枚举类型:

    ENUM(‘A’,’B’,’C’);

    不区分大小写

    要求插入值必须属于列表中指定的值之一。

  • SET类型:

    用于保存集合

    不区分大小写

    SET可以一次选取多个成员,而ENUM只能选一个

    根据成员的个数不同,存储所占的字节数也不同。

1
2
s1 SET('a','b','c','d');
INSERT INTO s1 VALUES('a,b');

122

日期型

DATE

DATETIME:8字节,1000-9999

TIME

YEAR

TIMESTAMP:4字节,1970-2038,范围较小,属性容易受Mysql版本和SQLMode的影响,时间戳,占用空间较小。

设置时区:

1
SET time_zone = '+9:00';

125

  • 常见约束:一种限制,用于限制表中的数据的准确性和可靠性。

    • NOT NULL(非空约束):保证该字段的值不能为空。

    • DEFAULT:用于保证该字段有默认值。

    • PRIMARY KEY:主键,用于保证该字段的唯一性,并且非空。

    • UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空.

    • CHECK:mysql中不支持,检查约束。

    • FOREIGN KEY:外键约束。

      在从表添加外键约束,用于引用主表中的某值。

      添加时机:创建、修改表(modify)

      列级约束:六大约束语法都支持,但外键没有效果。

      表级约束:除了非空和默认,其他都支持。

主键、外键、唯一键,自动生成索引

唯一键:

1
CONSTRAINT uq UNIQUE(seat); #唯一键

检查键:

1
CONSTRAINT fk CHECK(gender='男' OR gender='女');

允许组合主键和组合唯一键,但不推荐。

主键的关联列必须是一个KEY,一般是主键或唯一键。

插入数据,先插主表,再插从表。

删除先删从表,再删主表。

130

添加列级约束:MODIFY

添加表级约束:ALTER TABLE 表名 ADD PRIMARY KEY(列名);

131

1.删除非空约束

1
ALTER TABLE 表名 MODIFY COLUMN stuname Varchar(20) NULL;

2.删除默认约束:

1
ALTER TABLE 表名 MODIFY COLUMN age INT;

3.删除主键:

1
ALTER TABLE 表名 DROP PRIMARY KEY;

4.删除唯一键:

1
SHOW INDEX FROM 表名;ALTER TABLE 表名 DROP INDEX 索引名;

5.删除外键

1
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

6.添加外键

1
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 表名(列名);

132

标识列:自增长列:可以不用手动插值,系统提供默认的序列值。

1.创建表时设置标识列

1
# AUTO_INCREMENT关键字ID INT PRIMARY KEY AUTO_INCREMENT;
1
# 查看起始值和增长值SHOW VARIABLE LIKE '%auto_increment%';# 所以可以通过设置变量值改变起始值,步长,mysql中不允许设置起始值,但是可以设置步长。# 设置起始值:手动插入一个起始值即可。

特点:

​ 标识列必须和主键搭配吗?不一定,但要求是一个键,比如唯一键也可以。

​ 一个表可以有几个标识列?至多一个。

​ 标识列的类型:只能是数值型,float都可以。

​ 标识列设置步长:SET AUTO_INCREMENT_INCREMENT = ? / 手动设置

134

TCL语句:Transation Control Language,事务控制语言。

事务:一个或者一组sql组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

在mysql中的数据用各种不同的技术存储在文件中(内存中)。

SHOW ENGINES:查看mysql支持的存储引擎。

在mysql中用的最多的存储引擎有:innodb、myisam、memory等。其中innodb支持事务,而myisam、memory等不支持事务。

特点:事务特点—ACID

135

隐式事务:事务没有明显的开启和结束的标记。

如:insert、update、delete等。

Variable_name Value

autocommit ON(自动提交开启)

显示事务:事务具有明显的开启和结束的标记。

1
# 关闭自动提交。# 开启事务SET autocommit = 0;START TRANSACTION; # 可选的# 编写事务中的SQL语句。语句;语句;……# 结束事务commit;# 提交事务,提交到文件rollback;# 回滚事务

136

脏读

不可重复读

幻像读

丢失更新

1
2
3
4
5
6
# 查看当前mysql连接的隔离级别:
SELECT @@tx_isolation;
# 设置当前Mysql连接的隔离级别:
SET transation isolation level red committed;
# 设置数据库系统的全局隔离级别:
SET global transation isolation level read committed;
脏读 不可重复读 幻读
read uncommitted
read committed ×
repeatable read × ×
serializable × × ×

mysql默认为第三个隔离级别,repeatable read。

oracle默认为第二个隔离级别,read committed。

138

1
2
savepoint 节点名; # 设置节点
rollback to 节点名; # 回滚到保存点

139

视图:虚拟表,和普通表一样。

mysql5.1版本出现的新特性,是通过表动态生成的数据,只保存了sql逻辑不保存查询结果

1
2
3
4
5
CREATE VIEW 视图名
AS 查询语句

# 查看视图
SELECT * FROM 视图名;

修改视图:

1
CREATE OR REPLACE VIEW 视图名 AS 查询语句;
1
ALTER VIEW 视图名 AS 查询语句;

删除视图

1
DROP VIEW 视图名,视图名,……;

修改视图:把视图当做表进行操作。

插入

1
INSERT INTO 视图名 VALUES();

修改

删除

如果不希望更改视图,可以为其添加权限

  • 具备以下特点的视图,实际上不允许更新:
    • 包含以下关键字的sql语句:分组函数、distinct、group by、having、union、union all
    • 常量视图
    • SELECT中包含子查询
    • JOIN
    • FROM 一个不能更新的视图
    • WHERE子句的子查询引用了FROM子句中的表。

148

删除主表记录:

  • 级联删除
1
# 外键设置ON DELETE CASCADE;
  • 级联置空
1
# ON DELETE SET NULL;

唯一键

添加唯一

1
ALTER TABLE 表名 ADD CONSTRAINT 约束名称 UNIQUE(字段名);

删除唯一

1
ALTER TABLE 表名 DROP INDEX 索引名;

149

  • 变量
    • 系统变量
      • 全局变量
      • 会话变量
    • 自定义变量
      • 用户变量
      • 局部变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 系统变量:由系统提供,不是用户定义,属于服务器层面。
# 使用语法:
/*
1.查看所有系统变量
SHOW GLOBAL VARIABLES; # 全局变量
SHOW SESSION VARIABLES; # 会话变量
*/

/*
2.查看满足条件的部分系统变量
SHOW GLOBAL|[SESSION] VARIBALES LIKE '%char%';
*/

/*
3.查看指定的某个系统变量的值
SELECT @@global|[session].系统变量名;
*/

/*
4.为系统变量赋值
方式一:SET global|[session]系统变量名 = 值;
方式二:SET @@global|[session].系统变量名 = 值;
注意:如果是全局级别,则需要添加GLOBAL,如果是会话级别,则需要添加SESSION,不写默认为SESSION
*/

/*
全局变量作用域:服务器,每次启动将为所有的全局变量设置初始值。
会话变量作用域:仅仅针对当前会话(连接)有效,更改后另一个连接不受影响。
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 自定义变量:用户自定义的,不是由系统创建的。
使用步骤:声明、赋值、使用
/*
作用域:针对于当前会话/连接有效,同于系统变量中的会话变量的作用域。
应用在任何地方,也就是BEGIN END里面或BEGIN END
*/

# 1.声明并初始化
SET @用户变量名 = 值;或
SET @用户变量名 := 值;或
SELECT @用户变量名 :=值;

# 2.赋值
# 方式一:通过SETSELECT
SET @用户变量名 = 值;或
SET @用户变量名 := 值;或
SELECT @用户变量名 :=值;
案例:
SET @name = '小雨';
SET @name = 100;
# 方式二:通过SELECT INTO
SELECT 字段 INTO 变量名
FROM 表;

# 3.查看用户变量的值
SELECT @用户变量名;
1
# 局部变量/*作用域:仅仅在定义的BEGIN END块中。应用在BEGIN END中的第一句话!!!*//*1.声明DECLARE 变量名 类型;DECLARE 变量名 类型 DEFAULT 值;2.赋值方式一:通过SET或SELECTSET 局部变量名 = 值;或SET 局部变量名 := 值;或SELECT @局部变量名 :=值;案例:SET name = '小雨';SET name = 100;方式二:通过SELECT INTOSELECT 字段 INTO 变量名FROM 表;3.使用SELECT 	局部变量名;*/
作用域 定义和使用的位置 语法
用户变量 当前会话 会话中的任何地方 添加加@符号,不用限定类型
系统变量 BEGIN END中 只能在BEGIN END中,且为第一句话 一般不用加@符号,需要限定类型
1
# 案例:声明两个变量并初始化,求和,打印# 1.用户变量SET @m = 10;SET @n = 100;SET SUM = @m + @n;SELECT @SUM;# 局部变量DECLARE m INT DEFAULT 1;DECLARE n INT DEFAULT 2;DECLARE sum INT;SET sum = m+n;SELECT sum;

155

存储过程与函数

提高代码重用性、简化操作、减少编译次数、减少了和数据库服务器的连接次数,提高了效率。

1
# 存储过程/*含义:一组预先编译的SQL语句的集合,理解成批处理语句。*/# 创建/*CREATE PROCEDURE 存储过程名(参数列表)BEGIN	存储过程体(一组合法的SQL语句)END注意:1.参数包含三部分:	参数模式	参数名	参数类型		参数模式:			IN:该参数可以作为输入,也就是该参数需要调用方传入值。			OUT:该参数可以作为输出,也就是该参数可以作为返回值。			INOUT:该参数既可以作为输入,体,也就是参数既需要传入值,也可以返回值。2.如果存储过程体仅有一句话,BEGIN END可以省略3.存储过程体的每条SQL语句的结尾必须加分号。  存储过程的结尾可以使用DELIMITER重新设置  语法:  	DELIMITER 结束标记  	DELIMITER $*/# 调用/*CALL 存储过程名(实参列表);*/

157

1
# 空参列表/*案例:插入admin表中五条记录*/SELECT * FROM admin;DELIMITER $ # 必须是$结尾,不要多或者少,而且这里声明之后没有;!!!!!!!!CREATE PROCEDURE MYP1();BEGIN	INSERT INTO admin(username,password) VALUES('','');END$# 调用CALL MYP1()$

158

创建带in模式参数的存储过程

1
# 案例1:创建存储过程实现 根据女性姓名查询配偶信息CREATE PROCEDURE myp2(IN womanName varchar(20))BEGIN	SELECT m.*	FROM man AS m	RIGHT JOIN woman w ON m.id = w.husband	WHERE w.name = womanName; /*相当于局部变量*/ END $# 调用CALL myp2('小七')$
1
2
3
4
5
6
7
8
9
10
11
12
13
# ***********************
# 案例二:创建存储过程实现,用户是否登录成功。
CREATE PROCEDURE myp3(IN username Varchar(20),IN password Varchar(20))
BEGIN
DECLARE result INT DEFAULT 0; # 声明并初始化

SELECT COUNT(*) INTO result '' # 赋值
FROM admin
WHERE admin.usename = usename
ADN admin.password = password;

SELECT IF(result>0,'success','fail'); # 使用
END $

159

创建带out模式的存储过程

1
2
3
4
5
6
7
8
9
10
11
12
# 案例1:根据女性姓名查询配偶信息
CREATE PROCEDURE myp4(IN womanName VARCHAR(20),OUT manName VARCHAR(20))
BEGIN
SELECT m.manName INTO manName
FROM man AS m
RIGHT JOIN woman w ON m.id = w.husband
WHERE w.name = womanName; /*相当于局部变量*/
END $

# 调用
CALL mp4('小七',@name)$
SELECT @name$

一个存储过程,也支持多个OUT变量返回。

160

创建带inout模式参数的存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
# 案例一:传入a和b两个值,最终a和b都翻倍并返回
CREATE PROCEDURE mp5(INOUT a INT,INOUT b INT)
BEGIN
/*a\b为局部变量*/
SET a=a*2;
SET b=b*2;
END $

#调用:定义用户变量,调用,查看结果
SET @m = 10$
SET @n = 20$
CALL mp5(@m,@n)$
SELECT @m,@n$

162

删除存储过程:DROP PROCEDURE 存储过程名称;(一次只能删除一个存储过程)

163

查看存储过程

1
SHOW CREATE PROCEDURE 存储过程名称;

165

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 函数
/*
存储过程:有0个或多个返回值,适合做批量的插入、更新。
函数:有且仅有一个返回值,适合做处理数据后返回一个结果。
*/

/*
创建语法
*/
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END

/*
注意:
1.参数列表:包含两部分--参数名、参数类型
2.函数体:肯定会有return语句,如果没有会报错,如果RETURN语句没有放在函数体的最后,也不会报错,但不建议。

RETURN 值;
3.函数体中只有一句话,则可以省略BEGIN END
4.使用DELIMITER语句设置结束标记,注意不要多加;
*/

# 调用语法
SELECT 函数名(参数列表)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -------------------------------------
# 1.无参数个数返回
# 案例:返回管理员数目
mysql -u root -p
zhulan
DELIMITER $
CREATE FUNCTION fu1() RETURNS INT
BEGIN
DECLARE c INT;
SELECT COUNT(*) INTO c
FROM admin;
RETURN c;
END $

SELECT fu1() $

166

查看函数

1
SHOW CREATE FUNCTION 存储过程名; 

删除存储过程

1
DROP FUNCTION 存储过程名;

170

流程控制结构

顺序结构:程序从上往下执行。

分支结构:程序从两条或多条路径中选择一条去执行。

循环结构:满足一定条件的基础上,重复执行一段代码。

  • 分支结构

    • IF函数

      • 功能:实现简单的双分支

      • 语法:

        1
        2
        3
        SELECT IF(表达式1,表达式2,表达式3);
        # 执行:表达式1成立,返回表达式2,否则返回表达式3
        # 应用:任何地方。
    • case结构

      • 情况一:类似于JAVA中的SWITCH语句,一般用于实现等值判断。

        1
        2
        3
        4
        5
        6
        case 要判断的字段或表达式
        when 常量1 then 要显示的值1或语句1
        when 常量2 then 要显示的值2或语句2
        ……
        else 要返回的值n或语句n
        end CASE;
      • 情况二:类似于JAVA中的多重IF语句,一般用于实现区间判断。

        1
        2
        3
        4
        5
        6
        case
        when 要判断的条件1 then 要显示的值1或语句1;
        when 要判断的条件2 then 要显示的值2或语句2;
        ……
        else 要返回的值n或语句n;
        end CASE;

      特点:

      1.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END 中,或BEGIN END外面

      也可以作为独立的语句去使用,只能放在BEGIN END中

      2.如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并结束CASE

      如果都不满足,则执行ELSE中的语句或值

      3.ELSE可以省略,如果省略了ELSE,并且WHEN中的条件都不满足,则返回NULL

      1
      2
      3
      4
      5
      6
      7
      8
      9
      CREATE PROCEDURE test_case(IN score)
      BEGIN
      CASE
      WHEN score >= 90 AND score<= 100 THEN SELECT 'A';
      WHEN score >= 80 THEN SELECT 'B';
      WHEN score >= 70 THEN SELECT 'C';
      ELSE SELECT 'D';
      END CASE;
      END

173

  • if结构

    • 功能:实现多重分支

    • 语法:

      1
      2
      3
      4
      5
      if 条件1 then 语句1;
      elseif 条件2 then 语句2;
      ……
      [else 语句n;]
      end if;
    • 只能用于BEGIN END中

    • 案例:根据传入的成绩,来返回级别。

      1
      2
      3
      4
      5
      6
      7
      8
      CREATE FUNCTION test_if(score INT) RETURNS CHAR
      BEGIN
      IF score >= 90 and score <= 100 THEN RETURN 'A';
      ELSEIF score >= 80 THEN RETURN 'B';
      ELSEIF score >= 60 THEN RETURN 'C';
      ELSE RETURN 'D';
      END IF;
      END;

174

  • 循环结构

    • 分类:

      • WHILE
      • LOOP
      • REPEAT
    • 循环控制:

      • leave(类似于break,跳出,结束当前所在循环)
      • iterate(类似于continue,结束本次循环,继续下一次循环)
    • 语法

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # WHILE
      [标签:]WHILE 循环条件 DO
      循环体;
      END WHILE [标签];

      # LOOP:可以用来模拟简单的死循环
      【标签:】LOOP
      循环体;
      END LOOP [标签];

      # REPEAT
      【标签:】REPEAT
      循环体;
      UNTIL 结束循环的条件 【标签】;
    • 案例:批量插入,根据次数插入到admin表中

      1
      2
      3
      4
      5
      6
      7
      8
      9
      CREATE PROCEDURE test_while(IN count INT)
      BEGIN
      DECLARE i INT;
      SET i = 1;
      WHILE i <= count DO
      INSERT INTO admin VALUES(……);
      SET i = i + 1
      END WHILE;
      END;
    • 添加leave

      如果次数大于20则停止。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      CREATE PROCEDURE test_while(IN count INT)
      BEGIN
      DECLARE i INT;
      SET i = 1;
      a:WHILE i <= count DO
      INSERT INTO admin VALUES(……);
      SET i = i + 1
      IF i >= 20 THEN leave a;
      END IF;
      END WHILE;
      END;
    • 添加iterate语句

      插入偶数次

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      CREATE PROCEDURE test_while(IN count INT)
      BEGIN
      DECLARE i INT;
      SET i = 0;
      a:WHILE i <= count DO
      SET i = i + 1
      IF MOD(i,2)!=0 THEN iterate a;
      END IF;
      INSERT INTO admin VALUES(……);
      END WHILE;
      END;

MySQL高级

  • MySql的架构介绍

    • mysql简介
    • mysql linux版的安装
    • mysql配置文件
    • mysql逻辑架构介绍
    • mysql存储引擎
  • 索引优化分析

    • 性能下降SQL慢:执行时间长、等待时间长
    • 常见通用的JOIN查询
    • 索引简介
    • 性能分析
    • 索引优化(SQL调优)
  • 查询截取分析

    • 查询优化
    • 慢查询日志
    • 批量数据脚本
    • Show Profile
    • 全局查询日志
  • 主从复制

    • 复制基本原理
    • 复制基本原则
    • 复制的最大问题
    • 主从常见配置
  • MySql锁机制

    • 行锁
    • 表锁
    • 页锁

02 MySql简介

MySQL是一个关系型数据库管理 系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。
MySQL是一种关系数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内, 这样就增加了速度并提高了灵活性。
Mysq|是开源的,所以你不需要支付额外的费用。
Mysq是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
Mysq|支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
MySQL使用标准的SQL数据语言形式。
Mysq可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、 Java、 Perl、 PHP、 Eiffel、 Ruby和Tcl等。
MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB, 64位系统支持最大的表文件为8TB。

后端向数据库开发转型。

  • 数据库内部结构和原理
  • 数据库建模优化
  • 数据库索引建立
  • SQL语句优化
  • SQL编程(自定义函数、存储过程、触发器、定时任务)
  • mysq|服务器的安装配置
  • 数据库的性能监控分析与系统优化
  • 各种参数常量设定
  • 主从复制
  • 分布式架构搭建、垂直切割和水平切割
  • 数据迁移
  • 容灾备份和恢复
  • shell或python等脚本语言开发
  • 对开源数据库进行二次开发

03 RPM安装

1
2
3
4
 检查是否安装了mysql
rpm qa|grep i mysql
#
rpm ivh mysql-community-server-5.7.16-1.el7.x86_64.rpm