MySQL基础学习笔记(带目录)
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.模糊查询
like:一般和通配符搭配使用,对字符型数据进行部分匹配查询
常见的通配符:
_ 任意单个字符
%任意多个字符
案例1:查询姓名中含a的员工信息
select *
from employees
where last_name like ‘%a%’;
案例2:查询姓名第二个字符为’_'的员工信息
select *
from employees
where last_name like ‘--%’; (特殊字符需用 ’ \ ’ 转义)in :查询某字段的值是否属于指定的列表之内
in (常量值,常量值,常量值,…);
in / not in ;
案例1: 查询部门编号不是30/50/90的员工名,部门编号
select last_name , department_id
from employees
where department_id NOT IN (30,50,90);between and : 判断某个字段是否介于xx之间
案例:
select department_id ,last_name
from employees
where department_id BETWEEN 30 AND 90;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 ;
索引优化
- 全都匹配我最爱:where后面有几个字段就建几个索引
- 最佳左前缀法则,对于复合索引,查询要从索引的最左边的字段开始查询,并且不能跳过索引中的每一个字段。
- 不在索引字段上做任何操作(计算,函数,类型转换),会导致索引失效。
- 存储引擎不能使用索引中范围条件右边的列
- 若条件查询的含有范围查询字段,建索引的时候一定要将范围查询字段放在复合索引的最后,因为该范围查询字段后的字段索引全部失效。
- 若条件查询中有不等于符号的时候,该索引字段会失效。同样,is null 可以使用索引,is not null 不可以使用索引。
- 当模糊查询的时候,对于like字段,首字母一定要确定,不然索引会失效,如’%abc’这种就不行。
- 类型转换会导致索引失效,在和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基础学习笔记(带目录)相关推荐
- MySQL基础-学习笔记
MySQL基础 一.DQL语言的学习 1.基础查询 /* 语法: select 查询列表 from 表名特点: 1-查询的结果集是一个虚拟表 2-select类似于System.out.printIn ...
- MySQL基础学习笔记
一.数据库基本概念 1.1 数据库 - Database 从字面意思看,数据库就是一个存储数据的仓库.从计算机的角度来讲,数据库(Datebase)是按照数据结构来组织.存储和管理数据的仓库. 简单来 ...
- MySQL基础学习笔记(持续更新中)
一.MySQL基础 1. 数据库概念 1.1 为什么要学MySQL 个人理解:随着互联网的发展,数据变得烦杂,冗余,量大,为了保证数据的持久性以及健壮性等等,同时也为了方便人们很好的处理数据,这就发明 ...
- MYSQL基础--学习笔记
最近一段时间,系统的学习了下mysql相关知识,当然都是比较基础的,现在贴出来,以供参考备忘--帅帅的小猪猪 创建用户: CREATE USER 'sampadm'@'localhost' IDENT ...
- MySql基础学习笔记(一)
一.数据库存储数据的特点 将数据放到表中,表再放到库中 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己.表名具有唯一性. 表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 ...
- MySQL基础学习笔记——关于KEY的说明
关于KEY的说明 在MySQL中Key的底层都包含index(索引)的含义. 如上图,在使用describe 表的时候,观察Key的值: PRI:表示该列(字段)是主键的组成部分: UNI:表示该列( ...
- MySQL 基础学习笔记(1)
DBMS数据库管理系统 SQL结构化查询语言 MySQL sql语句:不区分大小写,以分号结尾. commit 提交; 数据类型: char 定长字符串 varchar 变长字符 ...
- Mysql 高级学习笔记
Mysql 高级学习笔记 文章目录 Mysql 高级学习笔记 一.Mysql 基础 1. 聚合函数 2. having 3. sql 的执行顺序 4. 约束 5. 试图 二.Mysql 高级 1. M ...
- 2022年Spark基础学习笔记目录
一.Spark学习笔记 在私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建Spark单机版环 ...
最新文章
- 使用TypeScript映射和条件类型使React组件更出色
- tmux的使用方法和个性化配置
- Box-Cox(python实现)
- Liferay激活Navigation和Breadcrumb
- HierarchicalBeanFactory接口
- sublime_text快捷键
- Java8————Stream API
- 字符串第一个出现的单个字符_如何在不编写单个应用程序的情况下找到我的第一个开发人员工作
- 判断是否是2的N次方各方法运行速度比较
- linux调试工具kdbg,Linux下图形化调试工具: kdbg, Affinic
- atitit.web的动态include 跟变量传递 java .net php
- 怎么在计算机服务关闭无线网络,家里电脑WIFI怎么关掉?(怎么在电脑上操作把WIFI关掉)...
- 如何下载M3U8格式文件,将文件转化为MP3格式进行本地存储。
- 字符串之重复字符统计
- 台湾批准联电7.1亿美元投资联芯科技
- golang的panic
- 三星Galaxy s4(i9505)完美获取root权限教程
- 原声大碟 -《仙剑奇侠传三·电视原声带》[MP3]
- 究极花里胡哨的渐变是什么样子的?
- 我是什么情况下开始学python,现在能用python做什么