MySQL学习笔记

  • MySQL产品的介绍和安装
  • MySQL服务的启动和停止
  • MySQL服务的登陆和退出
  • MySQL的常见命令
  • MySQL的语法规范
  • MySQL基础查询
    • 1.起别名
    • 2. 去重distinct
    • 3.+号的作用
    • 4.CONACAT()函数拼接字符串
    • 5.IFNULL()函数改变数据格式
  • MySQl条件查询
    • 语法:
    • 语句执行顺序:
    • 筛选的特点
  • MySQl排序查询
  • 常见函数
    • 字符函数
    • 数字函数
    • 日期函数
    • 流程控制函数
    • 分组函数
  • MySQL分组查询
  • DDL数据定义语言
    • 库的管理
      • 基本操作
      • 操作数据库
    • 表的操作
      • 表的创建
      • 基本数据类型
      • 常见约束
      • 修改表
      • 表的删除
      • 表的复制
  • 连接查询
    • 分类
    • sql92语法
    • sql99语法
      • 内连接
      • 外连接
    • 子查询
      • 标量子查询
      • 多行单列查询
  • 分页查询
  • 联合查询
  • DML
    • 插入数据
    • 自增长列
    • 更新数据
    • 删除数据
  • 索引
    • 创建索引
    • 删除索引
    • 查看索引
    • 索引优化
  • 事务
    • 事务的四大特性
      • 原子性(atomicity)
      • 一致性(consistency)
      • 隔离性(isolation)
      • 持久性(durability)
    • 事务分类
    • 演示事务的使用步骤:
    • 并发操作的问题
      • 脏读
      • 不可重复读
      • 幻读
    • 事务隔离级别
    • savepoint回滚点
  • 存储过程
    • 创建语法
    • 删除语法
    • 查看语法
    • 调用语法
  • 函数
    • 创建语法
    • 调用语法
  • 视图
    • 创建视图
    • 修改视图
    • 删除视图
    • 查看视图
  • 流程控制结构
    • 分支结构
      • if函数
      • case结构
      • if结构
    • 循环结构
  • 数据库锁理论
    • 锁的分类
      • 全局锁
    • 查询行锁情况
  • 主从复制

MySQL产品的介绍和安装

MySQL服务的启动和停止

方式一:计算机--右击管理--服务
方式二:通过管理员身份运行
net start 服务名
net stop 服务名

MySQL服务的登陆和退出

方式一:通过MySQL自带的客户端
只限于root用户
方式二:通过windows自带的客户端即命令行
登陆 :mysql  -h 主机名 -P端口号 - u用户名(连接远程服务器)mysql  -u用户名(本机)

MySQL的常见命令

1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名;
3.查看当前库的所有表
show tables;
4.查看其他库的所有表
show tables from 库名;
5.创建表
create table 表名(列名 列类型,列名 列类型
);
6.查看表结构
desc 表名;
7.查看服务器版本
mysql服务器中:select version();
命令行中:  mysql -version

MySQL的语法规范

1. 不区分大小写,但建议关键字大写,表名列名小写
2.每条命令用分号结尾
3.每条命令可根据自己的需要进行缩进和换行
4.注释单行注释:#注释文字多行注释:/*注释文字*/
5.

MySQL基础查询

1.起别名

1.便于理解
2.当查询的字段有重名的情况,用别名可以区分开来

SELECT 100%98 AS 结果;
若别名里有特殊字符,需要将别名用双引号
SELECT salary AS “out put” FROM xxxxx;

2. 去重distinct

SELECT DISTINCT salary FROM xxxx;

3.+号的作用

与java中不一样,mysql中只有运算符的作用,若两边有一边为字符型,则试图将字符型转换为
数值型,若转换成功,则继续做加法运算,若失败则将其变成0
特殊 :SELECT null +10;只要两边有一个null,结果一定都是null。

4.CONACAT()函数拼接字符串

SELECT CONCAT(a,b,c) AS 结果 FROM xxxxx;

5.IFNULL()函数改变数据格式

SELECT IFNULL(A,0) AS xxx FROM xxxx ;
如果A列中有null值,就将查询结果中的null替换成0;

MySQl条件查询

语法:

select 查询列表
from 表名
where 筛选条件

语句执行顺序:

1.from语句,找到一个大表
2.where语句,找到符合条件的每一行构成一个小表
3.select语句,查询小表中的选定列

筛选的特点

1.按关系表达式筛选
关系运算符 : > < >= <= =
2.按逻辑表达式筛选
逻辑运算符: and or not
3.模糊查询

  1. like:一般和通配符搭配使用,对字符型数据进行部分匹配查询
    常见的通配符:
    _ 任意单个字符
    %任意多个字符
    案例1:查询姓名中含a的员工信息
    select *
    from employees
    where last_name like ‘%a%’;
    案例2:查询姓名第二个字符为’_'的员工信息
    select *
    from employees
    where last_name like ‘--%’; (特殊字符需用 ’ \ ’ 转义)

  2. in :查询某字段的值是否属于指定的列表之内
    in (常量值,常量值,常量值,…);
    in / not in ;
    案例1: 查询部门编号不是30/50/90的员工名,部门编号
    select last_name , department_id
    from employees
    where department_id NOT IN (30,50,90);

  3. between and : 判断某个字段是否介于xx之间
    案例:
    select department_id ,last_name
    from employees
    where department_id BETWEEN 30 AND 90;

  4. is null / is not null:查询值为null的字段,因为null不能用 = 号判断
    案例1:查询没有奖金的员工信息
    select *
    from employees
    where commission_pct IS NULL
    拓展:
    = 只能判断普通的内容
    IS 只能判断NULL值
    <=> 都能判断,但是最好别用

MySQl排序查询

语法:
select xx
from xx
where xx( 可没有)
order xx;
执行顺序:
1.from
2.where
3.select
4.order
案例1:将员工编号 >120的员工信息进行工资的升序
select *
from employees
where employees_id > 120
order by salary ;
案例2:将员工编号 >120的员工信息进行工资的 降序
select *
from employees
where employees_id > 120
order by salary DESC;

常见函数

1.自定义函数(MySQL高级)
2.调用函数

字符函数

1.CONCAT拼接函数
2.LENGTH获取字节长度
3. CHAR_LENGTH获取字符个数
4. SUBSTR 截取子串
/* 注意:起始索引从1开始!!!
SUBSTR(str,起始索引,截取的字符串长度);
SUBSTR(str,起始索引)表示到结束;
*/
select SUBSTR(‘张三丰爱上了郭襄’,1,3); 结果:张三丰;
select SUBSTR(‘张三丰爱上了郭襄’,7); 结果 : 郭襄;
5:INSTR获取字符第一次出现的索引
INSTR (‘母字符串’,‘子字符或子字符串’)

6.TRIM去除前后指定的字符,默认是去空格
SELECT TRIM (’ 爱得起打 ');
SELECT TRIM( ‘x’ FROM ‘xxxxxxadqaxxxxx’ )去除x;

7.LPAD/RPAD 左填充/右填充
SELECT LPAD(‘xx’ , 指定的字符长度 , ‘指定填充的字符’);
SELECT LPAD('木婉清 ’ , 10 , ’ a ’ ); 结果 :aaaaaaa木婉清;
8. STRCMP 比较两个字符大小;
SELECT STRCMP(‘aaaa’,‘abbc’) ; 结果 :-1;
9.LEFT / RIGHT从左从右截取子串
SELECT LEFT(str, len );

数字函数

1.abs
2.ceil : 向上取整,返回 >=该参数的最小整数
3.floor :向下取整
4.round :四舍五入
round (x);
round(x,保留小数点后几位);
5.truncate: 截断
truncate(x,保留小数点后几位);
6.MOD 取余

日期函数

1.NOW :获取当前时间
2.curdate :获取当前日期
3.curtime :获取当前时间
4.datediff :获取两个时间的差值
5.date_format: 类似与java的simpledateformat
案例:select date_format(‘1998-7-16’ , '%Y年 %m月%d日);
结果:1998年7月16日;
案例:select date_format( hiredata , '%Y年 %m月%d日);
6.str_to_date按指定格式解析字符串为日期类型
STR_TO_DATE(‘3/15 1998’ , ’ %m/%d %Y ');

流程控制函数

1.IF函数
SELECT IF(100>9, ‘好’ ,‘坏’);
需求:如果有奖金,则显示最终奖金,如果没有,则显示0
select IF(commission_pct IS NULL , 0 , salary 12commission_pct ) as 奖金 ;

2.CASE函数
用法1:类似与Java中的switch case ;
CASE 表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
WHEN 值3 THEN 结果3
ELSE 结果4
END
用法2:类似与java多重if语句,实现区间判断
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
。。。
ELSE 结果N
END

分组函数

分组函数常常用于实现将一组数据进行统计计算,最终得到一个值,又叫聚集函数(经常搭配分组查询使用)。
分组函数清单:
sum(字段名)
avg(字段名)
max(字段名)
min(字段名)
count(字段名):计算非空字段值的个数

MySQL分组查询

语法:
select 查询列表
from 表名
where筛选条件
group by 分组列表
having 分组后筛选
order by 排序列表;
执行顺序:
1.from
2.where
3.group by
4.having
5.select
6.order by
特点:
1.查询列表往往是 分组函数和被分组的字段
2.分组查询中的筛选分为两类
筛选的基表 使用的关键词 位置
分组前筛选 原始表 where group by的前面
分组后筛选 分组后的表 having group by的后面
注意:分组函数做条件只可能放在having后面
1)简单的分组
案例:查询每个工种的员工的平均工资
select avg(salary),job_id
from employees
group by job_id;
2)可以实现分组前的查询
案例:查询有奖金的每个领导手下员工的平均工资
select avg(salary)
from employees
where commission_pct IS NOT NULL
order by manger_id;
3)可以实现分组后的筛选
案例1:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
select job_id,max(salary)
from employees
where commission_pct IS NOT NULL
group by job_id
having max(salary )>12000;
案例2:查询领导编号大于102的每个领导手下的员工最低工资大于5000的最低工资
select min(salary),manager_id
from employees
where manager_id>102
group by job_id
having min(salary>5000)
4) 可以进行排序
5)按多个字段分组
案例:查询每个工种每个部门的最低工资,并按最低工资排序
select min(salary) as 最低工资,job_id,department_id
from employees
group by job_id,department_id;

DDL数据定义语言

DDL:数据定义语言,用于对数据库和表的管理和操作

库的管理

基本操作
  • 查看所有数据库show databases;
  • 切换数据库:use mydb1,切换到mydb1数据库;
操作数据库

1.创建数据库
create database stuDB;
create database IF NOT EXISTS stuDB;
2.删除数据库
drop database stuDB;
drop database IF EXISTS stuDB;

表的操作

表的创建

语法:
create table IF NOT EXISTS 表名 (

          字段名   字段类型   【字段约束】,字段名   字段类型   【字段约束】,字段名   字段类型   【字段约束】,字段名   字段类型   【字段约束】

);

基本数据类型

整数型:int tinyint smallint bigint
浮点型:float(m,n) , double(m,n) , decimal(m,n) (m,n可选,n代表保留几位小数,m代表整部分加小数部分的总长)
字符型:char(n可选) , varchar(n必选 ), text ;
n都代表最多字符个数
日期型:date ,time,datetime,timestamp;
二进制型(用来保存图片):blob;

常见约束

说明:用于限制表中字段的数据的,从而进一步保证数据表的数据是一致的,准确的,可靠的;
not null 非空:用于限制该字段为必填项
default 默认:用于限制该字段没有显示插入值的时候,则直接显示默认值
primary key 主键:用于限制该字段值不能重复,设置为主键的字段默认不能为空,一个表只能有一个主键,当然可以是组合主键,通常用来约束ID这种字段
unique 唯一:用于限制该字段值不能重复,字段可以为空
check 检查:用于限制该字段值必须满足指定条件
如:check(age between 1 and 100)
foreign key 外键:用于限制两个表的关系,要求外键列的值必须来自主表的关联列
要求:
1.主表的关联列和从表的关联列的类型必须一致
2.主表的关联列必须是主键
如:constraint fk_stu_major foreign key (majorid) references major(id)
案例:

create table if not exists stuinfo(stuid int primary key,stuname varchar(20) unique not null,stugender char(1) default '男',email varchar(20) not null,age int check (age between 0  and 100),//mysql不支持  majorid int,foreign key  (majorid) references major(id)//注意,外键约束只能在表的最后加上,因为外键约束是表级的约束 ,不能和其他的一样直接在字段的后面加约束
);
修改表

语法:alter table 表名 add|modify|change|drop 字段名 字段类型 【字段约束】;

表的删除

drop table if exists students;

表的复制

仅仅复制表的结构:
create table newtable2 LIKE major;
复制表的结构加数据
create table newtable3 select * from girls.beauty;
复制表中的last_name ,department_id,salary字段到新表
create table emp
select last_name,department_id,salary
from myemployees.employess;
复制表中的last_name ,department_id,salary字段到新表,但不复制数据
create table emp
select last_name,department_id,salary
from myemployees.employess
where 1=2;

连接查询

含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡儿乘积现象:表1有m行,表二有n行,结果就m*n行
发生原因:没有有效的连接条件

分类

  • 按年代:
    sq92标准
    sq99标准
  • 按功能分类:
    * 内连接:
    + 等值连接
    + 非等值连接
    + 自连接
    * 外连接:
    + 左外连接
    + 右外连接
    + 全外连接
    * 交叉连接

sql92语法

等值连接:
案例:查询每个城市的部门个数
select count(*) as 个数 ,city
from departement d,location l
where d.location_id = l.loction_id
group by city;
非等值连接:
案例:查询员工的工资和工资级别
select salary,grade_level
from employees e,job_grades g
where salary between g.lowest_sal and g.highest-sal;
自连接(在一张表里等值或者非等值):
案例:查询员工名和上级的名称
select e.employee_id,e.last_name,m.employee_id,m.last_name
from employees e, employees m
where e.manager_id = m.employee_id;

sql99语法

内连接

语法:
select xxxx
from 表名
JOIN 表名
on 连接条件
where 筛选条件;
sql92 和sql99的区别:sql99中使用join关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高了阅读性;

外连接

定义:查询结果为主表中的所有记录,如果从表中有匹配项,则显示匹配项;如果从表没有匹配项,则显示null;
应用场景:一般用于查询主表中有但从表中没有的记录
特点:
1.外连接分主表和从表,不能交换位置
2.左连接左边为主表,右连接右边为主表
语法:select 查询列表
from 表1
left | | right outer join 表2
on 连接条件
where筛选条件;
案例1:查询所有的女神记录,以及对应的男神名,如果没有对应的男神,则显示为null
select
from beauty b
left join boys bo
on b.boyid = bo.id;
案例2:查询哪个女神没有男朋友
select b.name
from beauty b
left join boys bo on b.boyid = bo.id
where bo.id is null;
ps:全外连接:mysql不支持,但是全外连接就是主表和从表的记录都显示。

子查询

说明:当一个查询语句中又嵌套了另一个完整的select语句,则被嵌套的select语句称为子查询或者内查询,外面的查询语句叫外查询。
分类:
按子查询出现的位置进行分类:
1.select后面:要求查询的结果为单行单列(标量子查询)
2.from后面:要求子查询的结果也可以为多行多列
**3.where和having后面:**要求子查询的结果必须为单列
4.exists后面:要求子查询的结果必须为单列
特点:
1.子查询放在条件中,要求必须放在条件的右侧
2.子查询一般放在小括号中
3.子查询的优先级高于外查询
4.单行子查询对应了单行操作符:< > >= <= = <>
5.多行子查询对应了多行操作符: any in all

标量子查询

案例1:谁的工资比Abel高?

1)查询abel的工资
select salary
from employees
where last_name = 'Abel';
2)查询员工的信息,满足salary>1)结果
select *
from employees
where salary >(select salary from employeeswhere last_name = 'Abel'
);
多行单列查询

多行比较操作符的含义:
IN/NOT IN :等于列表中的任意一个。
ANY | SOME:和子查询返回的某一个值比较,只要和其中的一个值满足条件即可。
ALL:和子查询返回的所有值比较,要和所有的值都满足条件。
案例1:返回其他部门中比jobid为‘it_prog’ 部门所有工资都低的员工 的员工号,姓名,job_id 以及salary

select last_name,employee_id , job_id,salary
from employees
where salary<all(select salaryfrom employeeswhere job_id = 'it_prog'
)   and job_id = 'it_prog';

分页查询

应用场景:当页面上的数据,一页显示不全,则需要分页显示
分页查询的sql命令请求数据库服务器–>服务器响应查询到的多条数据–>前台界面
语法:
select 查询列表
from 表名
limit 起始条目数索引,显示的条目数
特点:
1.起始条目索引如果不写,默认是0
对于实际应用中的分页的公式:
select *
from employees
limit (page-1)*size , size;

案例1:查询员工信息表的前五条
select *
from employees
limit 5;
案例2:查询有奖金的,且工资较高的第11名到第20名
select *
from employees
where commission_pct IS NOT NULL
order by salary DESC
limit 10,10;

联合查询

说明:当查询结果来自多张表,但各表之间没有关联,这个时候往往用联合查询。
select 查询列表 from 表1
union
select 查询列表 from 表2;
特点:
1.多个查询列表的查询的列数应该一样
2.联合查询自带去重功能,如果想不去重,应该用union all。

DML

DML:数据操纵语言,对表中的数据增删改

插入数据

语法:
插入单行:
insert into 表名 (字段名1,字段名2 ,字段名3 …) values(值1,值2,值3…) ;
(可以不写字段列表,默认的是所有字段);
插入多行:
insert into 表名 (字段名1,字段名2 ,字段名3 …) values
(值1,值2,值3…) ,(值1,值2,值3…) ,(值1,值2,值3…) ;
(可以不写字段列表,默认的是所有字段);

自增长列

可以使一列直接为不重复的递增序列
在创建表的时候可在主键后面加上auto_increment;
设置自增长列的要求:
1.自增长列必须要求设置在一个键上,比如主键或唯一键
2.自增长列要求数据类型为数值型
3.一个表最多有一个自增长列

更新数据

语法规则为:
UPDATE 表名 SET 字段名1 = 内容1, 字段名2 = 内容2, 字段名3 = 内容3 WHERE 过滤条件;

删除数据

方式1:delete 语句
语法:delete from 表名 where 筛选条件;(删除单行数据)
方式2:truncate语句
语法:truncate table 语句;(删除表中的所有数据)
面试题:delete和truncate的区别
1.一个有where,一个没有where
2.truncate的效率较高
3.如果删除带自增长列的表,
使用delete删除后,重新插入数据,记录从断点处开始
使用truncate删除后,重新插入数据,记录从1开始
4.delete删除数据,会返回影响的行数
truncate删除数据,不返回受影响的行数
5.delete删除数据,支持事务回滚
truncate删除数据,不支持事务回滚

索引

创建索引

CREATE INDEX [ indexname] ON TABLE_name(column);

删除索引

DROP INDEX [indexname] on table;

查看索引

SHOW INDEX FROM TABLE ;

索引优化

  1. 全都匹配我最爱:where后面有几个字段就建几个索引
  2. 最佳左前缀法则,对于复合索引,查询要从索引的最左边的字段开始查询,并且不能跳过索引中的每一个字段。
  3. 不在索引字段上做任何操作(计算,函数,类型转换),会导致索引失效。
  4. 存储引擎不能使用索引中范围条件右边的列
  5. 若条件查询的含有范围查询字段,建索引的时候一定要将范围查询字段放在复合索引的最后,因为该范围查询字段后的字段索引全部失效。
  6. 若条件查询中有不等于符号的时候,该索引字段会失效。同样,is null 可以使用索引,is not null 不可以使用索引。
  7. 当模糊查询的时候,对于like字段,首字母一定要确定,不然索引会失效,如’%abc’这种就不行。
  8. 类型转换会导致索引失效,在和bean对象对应时一定要一一对应

事务

什么是事务?
一个事务是由一条或者多条sql语句构成,这一条或者多条sql语句要么全部执行成功,要么全部执行失败!

事务的四大特性

原子性(atomicity)

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事 务来说,不可能只执行其中的一部分操作,这就是事务的原子性

一致性(consistency)

数据库总是从一个一致性的状态转换到另外一个一致性的状态
在前面的例子中,一致性确保了,即使在执行第三、四条语句 之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终 没有提交,所以事务中所做的修改也不会保存到数据库中

隔离性(isolation)

通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。

持久性(durability)

一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失
持久性是个有点模糊的 概念,因为实际上持久性也分很多不同的级别
有些持久性策略能 够提供非常强的安全保障,而有些则未必。而且不可能有能做到 100%的持久性保证的策略(如果数据库本身就能做到真正的持久 性,那么备份又怎么能增加持久性呢?)。

事务分类

  • 隐式事务:如一条dml的insert,update,delete语句本身就是一条事务
  • 显式事务:具有明显的开启和结束标志,一般由多条sql语句组成,必须具有明显的开启和结束标记

步骤
1.开启事务
2.编写事务需要的sql语句
3结束事务

演示事务的使用步骤:

/取消事务自动开启
set autocommit = 0;
/开启事务
start transaction;
/编写事务的sql语句
xxxxxxx
/结束事务
/提交
commit;
/回滚:指的是回到事务发生以前的状态
rollback;

并发操作的问题

脏读

脏读指的是读到了其他事务更新但未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了最终不存在的数据,这就是脏读。

不可重复读

不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务更新了数据并提交了。通常针对数据更新(update)操作。

幻读

幻读是针对数据插入(insert)操作来说的,当其他事务插入并提交了新的数据时,另外的事务再次读取是就会多出几行或者少几行。

事务隔离级别

SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:
READ UNCOMMITTED 读未提交
READ COMMITTED 读提交
REPEATABLE READ 可重复读 (MySql默认的隔离级别)
SERIALIZABLE 串行化

savepoint回滚点

set autocommit = 0;
start transaction ;
delete from account where id = 25;
savapoint a;#设置保存点
delete from account where id = 28;
rollback to a ;#回滚到保存点
结果:id = 28 的行没被删掉,成功回滚到了a点。

存储过程

一般用于批量添加数据,预先编译好的一组sql语句集合。

创建语法

CREATE PROCEDURE 存储过程名 (参数列表)
BEGIN 存储过程体(一组合法的sql语句)
END

注意:参数列表包含三部分
参数模式 参数名 参数类型
参数模式:
IN:该参数可以作为输入
OUT:该参数可以作为输出
INOUT:该参数既可以作为输入,也可以作为输出。

删除语法

DROP PROCEDURE 存储过程名

查看语法

SHOW CREATE PROCEDURE 存储过程名

调用语法

CALL 存储过程名(参数列表 );

函数

函数类似于存储过程,区别在于函数有且仅有一个返回,而存储过程可以有0个1个或多个返回。在应用场景上,存储过程适合用于批量插入,修改数据,
而函数适合做处理数据后返回一个结果。

创建语法

CREATE FUNCTION 函数名(参数名  参数类型) RETURNS 返回类型
BEGIN函数体(之中一定要包含return语句)
END;

可使用delimiter语句设置结束标记

调用语法

SELECT 函数名(参数列表)

视图

含义:虚拟表,和普通表一样使用。只在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。
应用场景:
多个地方用到同样的查询结果
该查询结果使用的sql语句较复杂
(类似于封装)

创建视图

语法:

CREATE VIEW 视图名
AS
查询语句

修改视图

语法:

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

删除视图

语法:

DROP VIEW 视图名;

查看视图

SHOW CREATE VIEW 视图名;

流程控制结构

分支结构

if函数

能在任何场景中使用
语法

if(表达式1,表达式2,表达式3);
执行顺序,如果表达式1成立,则返回表达式2的值,否则返回表达式3的值
case结构

语法

case 变量|表达式|字段
when 要判断的值 then 返回的值或语句1;
when 要判断的值 then 返回的值或语句2;
else 要返回的值或语句;
end

特点:可以作为表达式,嵌套在其他的语句中使用
可以作为独立的语句去使用
案例:创建存储过程,根据传入的成绩,来显示登记,比如传入90-100 显示A,…

delimiter $create  PROCEDURE test_case(in score int)BEGINCASE when score>=90 and score<=100   then  select 'A';when score >=80 then select 'B';when score >=60 then select 'C';else select 'D';end case;END $delimiter ;
if结构

语法

             if 条件1 THEN 语句1;elseif 条件2 then 语句2;elseif 条件3 then 语句3;else 语句n;end if;

只能应用在 begin end 中

案例:创建存储过程,根据传入的成绩,来显示登记,比如传入90-100 返回A

DELIMITER $CREATE FUNCTION testCase(score int) returns charBEGINIF score>=90 and score<=100 then return 'A';ELSEIF score>=80 and score<90 then return 'B';ELSEIF score>=70 and score<80 then return 'C';ELSEIF score>=60 and score<70 then return 'D';else return 'E';end if;END $DELIMITER ;

循环结构

while

while循环语法:
while 条件 DO循环体;
end while;

实例:向表中插入指定个数的随机字符串

create procedure test(in maxi int )
begin declare i int default 1;declare str varchar(26) default 'abcdefghijkmlnopkrstuvwxyz';set len int defalut  1;while i<=maxi do set len = Floor(rand()*(26-startindex+1)+1);#产生一个随机数,代表截取随机字符串的长度set startIndex = floor(rand()*26+1) ;#产生一个随机的整数,代表起始索引insert into table(str) values(substr(str,startIndex,len));set i = i+1;end while;
end $

数据库锁理论

锁的分类

全局锁

全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock。当需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句

全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都select出来存成文本

查询行锁情况

SHOW STATUS LIKE 'innodb_row_lock%';

对查询结果各个量的说明:
Innodb_row_lock_current_waits 当前正在等待锁定的数量
Innodb_row_lock_time 从系统启动到现在锁定总时间长度
Innodb_row_lock_time_avg 每次等待所花平均时间
Innodb_row_lock_time_max 从系统启动到现在等待最长的一次所花时间
Innodb_row_lock_waits 系统启动后到现在总共等待的次数

主从复制

MySQL基础学习笔记(带目录)相关推荐

  1. MySQL基础-学习笔记

    MySQL基础 一.DQL语言的学习 1.基础查询 /* 语法: select 查询列表 from 表名特点: 1-查询的结果集是一个虚拟表 2-select类似于System.out.printIn ...

  2. MySQL基础学习笔记

    一.数据库基本概念 1.1 数据库 - Database 从字面意思看,数据库就是一个存储数据的仓库.从计算机的角度来讲,数据库(Datebase)是按照数据结构来组织.存储和管理数据的仓库. 简单来 ...

  3. MySQL基础学习笔记(持续更新中)

    一.MySQL基础 1. 数据库概念 1.1 为什么要学MySQL 个人理解:随着互联网的发展,数据变得烦杂,冗余,量大,为了保证数据的持久性以及健壮性等等,同时也为了方便人们很好的处理数据,这就发明 ...

  4. MYSQL基础--学习笔记

    最近一段时间,系统的学习了下mysql相关知识,当然都是比较基础的,现在贴出来,以供参考备忘--帅帅的小猪猪 创建用户: CREATE USER 'sampadm'@'localhost' IDENT ...

  5. MySql基础学习笔记(一)

    一.数据库存储数据的特点 将数据放到表中,表再放到库中 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己.表名具有唯一性. 表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 ...

  6. MySQL基础学习笔记——关于KEY的说明

    关于KEY的说明 在MySQL中Key的底层都包含index(索引)的含义. 如上图,在使用describe 表的时候,观察Key的值: PRI:表示该列(字段)是主键的组成部分: UNI:表示该列( ...

  7. MySQL 基础学习笔记(1)

    DBMS数据库管理系统 SQL结构化查询语言 MySQL sql语句:不区分大小写,以分号结尾. commit 提交; 数据类型:     char    定长字符串     varchar 变长字符 ...

  8. Mysql 高级学习笔记

    Mysql 高级学习笔记 文章目录 Mysql 高级学习笔记 一.Mysql 基础 1. 聚合函数 2. having 3. sql 的执行顺序 4. 约束 5. 试图 二.Mysql 高级 1. M ...

  9. 2022年Spark基础学习笔记目录

    一.Spark学习笔记 在私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建Spark单机版环 ...

最新文章

  1. 使用TypeScript映射和条件类型使React组件更出色
  2. tmux的使用方法和个性化配置
  3. Box-Cox(python实现)
  4. Liferay激活Navigation和Breadcrumb
  5. HierarchicalBeanFactory接口
  6. sublime_text快捷键
  7. Java8————Stream API
  8. 字符串第一个出现的单个字符_如何在不编写单个应用程序的情况下找到我的第一个开发人员工作
  9. 判断是否是2的N次方各方法运行速度比较
  10. linux调试工具kdbg,Linux下图形化调试工具: kdbg, Affinic
  11. atitit.web的动态include 跟变量传递 java .net php
  12. 怎么在计算机服务关闭无线网络,家里电脑WIFI怎么关掉?(怎么在电脑上操作把WIFI关掉)...
  13. 如何下载M3U8格式文件,将文件转化为MP3格式进行本地存储。
  14. 字符串之重复字符统计
  15. 台湾批准联电7.1亿美元投资联芯科技
  16. golang的panic
  17. 三星Galaxy s4(i9505)完美获取root权限教程
  18. 原声大碟 -《仙剑奇侠传三·电视原声带》[MP3]
  19. 究极花里胡哨的渐变是什么样子的?
  20. 我是什么情况下开始学python,现在能用python做什么

热门文章

  1. ITIL 4 讲解:事态、事件、灾难流程如何界定?
  2. java算法--冒泡算法
  3. 搜索引擎常用搜索技巧
  4. Java日志 - log4j
  5. linux传不上去文件,linux下上传文件,文件上传不上去
  6. SQL SERVER插入数据操作
  7. 第九届大唐杯直播整理
  8. 常用的Java Web框架简介
  9. 无线测温装置在变压器中的设计与应用
  10. 学习jQuery框架获取数据的几种基础方式