MySQL学习笔记

一、为什么要学习数据库

保存数据的容器【数组/集合[不能永久,临时]、文件[不易于查询]....】→数据库。

♥ 好处:实现数据持久化,使用完整的管理系统统一管理,易于查询。

二、数据库的相关概念

① DB:数据库(database):存储数据的“仓库”,保存一系列有组织的数据。【本质上是文件系统。】
② DBMS:数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的容器。
③ SQL:结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。

♥ 关系:DBMS  使用【通用的】 SQL 语句,可以 对 【所有的关系型】 DB  进行管理 。
♥ SQL优点:几乎所有DBMS都支持   /   简单易学 /  强有力,可进行复杂高级操作。

三、数据库存储数据的特点

1、数据放表中,表放库中。
2、DB中可有多个表,每个表都有唯一的名字标识自己。
3、表的特性决定数据在表中如何存储,每个表类似java中“类”。
4、表由列组成,称为字段,	          每一列类似java中“属性”
5、表中数据按行存储,     	          每一行类似java中“对象”。

四、初识MySQL:

♥对比:
	1、MySql:开源免费,小/中型。[瑞典-->sun-->甲骨文]
	2、Oracle:收费、大型。[Oracle甲骨文]。
	3、DB2 :收费的,常用银行系统。[IBM]。 
	4、SqlServer:收费、中型,C#、.net 等常用,[MicroSoft 微软]等。
	5、SQLite:嵌入式,小型,应用在手机端,如:Android。

♥ MySQL优点:成本低,开源,免费试用, 性能高,执行快,易安装使用。
拓展:DBMS分两类【共享文件系统的[单机版] 】【客户机/服务器】
♥ MySQL的版本:  社区版(免费)【5.5    8.0[测试版]】 企业版(收费)
♥ MySQL下载:	
	 Windows平台下下载:http://dev.mysql.com/downloads/mysql

五、卸载、安装、配置【每个人都要掌握】

数据库的安装

  1. 打开下载的 mysql 安装文件双击解压缩,运行“mysql-5.5.40-win64.msi”。

    MySQL学习笔记_第1张图片

    MySQL学习笔记_第2张图片

  2. 选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,选择“Custom”, 按“next”键继续。

    MySQL学习笔记_第3张图片

  3. 点选“Browse”,手动指定安装目录。

    MySQL学习笔记_第4张图片

  4. 填上安装目录,我的是“d:\Program Files (x86)\MySQL\MySQL Server 5.0”,按“OK”继续。

    MySQL学习笔记_第5张图片

  5. 确认一下先前的设置,如果有误,按“Back”返回重做。按“Install”开始安装。

    MySQL学习笔记_第6张图片

    MySQL学习笔记_第7张图片

    MySQL学习笔记_第8张图片

    MySQL学习笔记_第9张图片

    MySQL学习笔记_第10张图片

  6. 正在安装中,请稍候,直到出现下面的界面, 则完成 MYSQL 的安装。

    MySQL学习笔记_第11张图片

    数据库安装好了还需要对数据库进行配置才能使用 MYSQL 的配置

  7. 安装完成了,出现如下界面将进入 mysql 配置向导。

    MySQL学习笔记_第12张图片

  8. 选择配置方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,我 们选择“Detailed Configuration”,方便熟悉配置过程。

    MySQL学习笔记_第13张图片

  9. 选择服务器类型,“Developer Machine(开发测试类,mysql 占用很少资源)”、“Server Machine(服务 器类型,mysql 占用较多资源)”、“Dedicated MySQL Server Machine(专门的数据库服务器,mysql 占 用所有可用资源)”

    MySQL学习笔记_第14张图片

  10. 选择mysql数据库的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服务器类型,专注于事务处理,一般)”、“Non-Transactional Database Only(非事务 处理型,较简单,主要做一些监控、记数用,对 MyISAM 数据类型的支持仅限于 non-transactional),按“Next” 继续。

    MySQL学习笔记_第15张图片
    MySQL学习笔记_第16张图片

  11. 选择网站并发连接数,同时连接的数目,“Decision Support(DSS)/OLAP(20个左右)“Online ”、 Transaction Processing(OLTP)(500 个左右)”、“Manual Setting(手动设置,自己输一个数)”。

    MySQL学习笔记_第17张图片

  12. 是否启用 TCP/IP 连接,设定端口,如果不启用,就只能在自己的机器上访问 mysql 数据库了,在这个页 面上,您还可以选择“启用标准模式”(Enable Strict Mode),这样 MySQL 就不会允许细小的语法错误。 如果是新手,建议您取消标准模式以减少麻烦。但熟悉 MySQL 以后,尽量使用标准模式,因为它可以降 低有害数据进入数据库的可能性。按“Next”继续

    MySQL学习笔记_第18张图片

  13. 就是对 mysql 默认数据库语言编码进行设置(重要),一般选 UTF-8,按 “Next”继续。

    MySQL学习笔记_第19张图片

  14. 选择是否将 mysql 安装为 windows 服务,还可以指定 Service Name(服务标识名称),是否将 mysql 的 bin 目录加入到 Windows PATH(加入后,就可以直接使用 bin 下的文件,而不用指出目录名,比如连接, “mysql.exe -uusername -ppassword;”就可以了,不用指出 mysql.exe 的完整地址,很方便),我这里全部打上了勾,Service Name 不变。按“Next”继续。

    MySQL学习笔记_第20张图片

  15. 询问是否要修改默认 root 用户(超级管理)的密码。“Enable root access from remote machines(是否允 许 root 用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕,按“Next”继续。

    MySQL学习笔记_第21张图片

  16. 确认设置无误,按“Execute”使设置生效,即完成 MYSQL 的安装和配置。

    MySQL学习笔记_第22张图片
    MySQL学习笔记_第23张图片

    注意:设置完毕,按“Finish”后有一个比较常见的错误,就是不能“Start service”,一般出现在以前有安装 mysql 的服务器上,解决的办法,先保证以前安装的 mysql 服务器彻底卸载掉了;不行的话,检查是否按上面一步所说, 之前的密码是否有修改,照上面的操作;如果依然不行,将 mysql 安装目录下的 data 文件夹备份,然后删除,在 安装完成后,将安装生成的 data 文件夹删除,备份的 data 文件夹移回来,再重启 mysql 服务就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据错。

    MySQL学习笔记_第24张图片

    解决方法:卸载 MySQL,重装 MySQL

    安装失败的一些解决方案:
    1.按照数据库的卸载走一遍
    2.关闭防火墙
    3.找到MySQL安装目录的并文件夹的MySQLInstanceConfig.exe,右键以管理的模式打开
    

数据库的卸载

1. 去mysql的安装目录找到my.ini文件
* 复制 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"  这里面存的是数据库,需要把数据库进行转移备份
2. 卸载MySQL
3. 删除安装目录留下的MySQL文件夹
4. 删除C:/ProgramData目录下的MySQL文件夹。(ProgramData这是一个隐藏文件夹需要显示出来)
  1. 停止 window 的 MySQL 服务。 找到“控制面板”-> “管理工具”-> “服务”,停止 MySQL 后台服务。

    MySQL学习笔记_第25张图片

  2. 卸载 MySQL 安装程序。找到“控制面板”-> “程序和功能”,卸载 MySQL 程序。

    MySQL学习笔记_第26张图片

  3. 删除 MySQL 安装目录下的所有文件。

  4. 删除 c 盘 ProgramData目录中关于 MySQL 的目录。路径为:C:\ProgramData\MySQL(是隐藏文件,要显示出来)

MySQL学习笔记_第27张图片
MySQL学习笔记_第28张图片

5.删除注册表中的mysql目录,打开运行窗口,输入regedit

MySQL学习笔记_第29张图片
MySQL学习笔记_第30张图片

cmd -> regedit   删除MySQL目录
1、HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL目录
2、HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL目录
3、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL目录

数据库的配置

数据库的启动

MySQL 服务器启动方式有两种:
1) 通过服务的方式自动启动
2) 手动启动的方式
Windows 服务方式启动

操作步骤:

MySQL学习笔记_第31张图片

MySQL学习笔记_第32张图片

DOS 命令方式启动

操作步骤:

MySQL学习笔记_第33张图片

数据库环境变量的配置

配置文件没有配置好。解决方式

1、找到位置:此电脑→属性→高级系统设置→环境变量→系统环境变量【已有内容不要动】
2、找到path→编辑→新建→将mysql安装目录的bin目录路径复制
	【D:\Program Files\MySQLMySQL Server 5. S\bin】
3、检查原来的环境变量的值删掉
4、重新打开cmd命令
♥ 如果安装步骤的第14步勾选了 【path】,那么会自动添加环境变量。

数据库的连接登录和退出

控制台连接数据库

MySQL 是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的 root 账号,使用安装时设置的密码即可登录

登录格式 1:u 和 p 后面没有空格

mysql -u用户名 -p密码

MySQL学习笔记_第34张图片

 后输入密码方式:

MySQL学习笔记_第35张图片

登录格式 2:

登录格式 3【一般不用,了解即可】:

退出 MySQL:

quit 或 exit
mysql -h127.0.0.1 -P3306 -uroot. -proot

cls--window清屏

注意:

卸载: 备份data,停止服务,卸载,删除遗留文件【两处】,删除注册表目录【可能3处】

安装:先安装再配置,注意勾选项和语言项。安装失败的三种解决方案见课件。

环境变量的配置:电脑-属性-高级系统设置-环境变量-path-安装目录bin

六、数据库的启动、连接、退出

1、启动
     ① windows服务方式启动
     ② Dos命令【管理员身份】
	net start mysql
	net stop mysql
2、连接
    ① mysql -uroot -proot
         mysql -uroot -p后输入密码
    	     ② mysql -h127.0.0.1 -proot -uroot
         mysql -h127.0.0.1 -P3306 -proot -uroot
     ③ mysql --host=127.0.0.1 --user=root --password=root
♥ u-user用户  p-password密码  h-host地址 P-port端口号
3、退出【mysql环境中】:
	quit 或 exit
4、查看服务器版本	mysql --version  或 mysql -V  (大写)

七、MySQL常见命令【mysql环境中】

1.查看所有数据库	show databases;
2.打开指定的库	use 库名;
3.查看所有表	show tables;
4.查看其它库所有表	show tables from 库名;
5.创建表		create table 表名(
			列名 列类型,
			列名 列类型,
	例如:
			name VARCHAR(20),
		    owner VARCHAR(20),
		    species VARCHAR(20),
		    sex CHAR(1),
		    birth DATE,
		    death DATE
		);
6.查看表结构	desc 表名;
7.查看服务器版本	select version();

八 、MySQL的语法规范

1.不区分大小写,建议关键字大写,其他小写
2.每条命令,用分号结尾,根据需要缩进 或换行
3.注释
	单行:#注释文字   或 -- 注释文字【注意空格】
	多行:/* 注释文字  */

九、SQLyog客户端

SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。使用SQLyog 可以快速直观地让您从世界的任何角落通过网络来维护远端的 MySQL 数据库
MySQL学习笔记_第36张图片
使用 SQLyog 登录数据库
MySQL学习笔记_第37张图片
总结:

安装:注意语言简体中文【chinese】--安装路径---密钥注册
登录:新建→连接→账号,密码即可

十、了解MySQL 目录结构

① bin    所有 mysql 的可执行文件目录	
② MySQLInstanceConfig.exe  数据库的配置向导
③ my.ini	配置文件,不建议修改。【端口号/字符集/安装路径/自建库路径】
④ data 【系统必须的数据库所在的目录】
⑤ c:\ProgramData\MySQL\MySQL Server 5.5\data\   自建的数据库目录

十一、数据库管理系统

DBMS:一种操作和管理数据库的大型软件,用于建立/使用/维护DB。
DBMS、DB和表的关系:
1) 一个数据库服务器包含多个库
2) 一个数据库包含多张表
3) 一张表包含多条记录

十二、SQL的语言分类

DQL(Data Query Language):数据查询语言		
	select 
DML(Data Manipulate Language): 数据操作语言
	insert 、update、delete
DDL(Data Define Languge):数据定义语言
	create、drop、alter
TCL(Transaction Control Language):事务控制语言
	commit、rollback

十三、DQL语言

四个基本语句

-- 查询表
SELECT * from pet;

-- 插入数据
INSERT INTO pet VALUES ('puffball', 'Diane', 'hamster', 'f', '1990-03-30', NULL);

-- 修改数据
UPDATE pet SET name = 'squirrel' where owner = 'Diane';

-- 删除数据
DELETE FROM pet where name = 'squirrel';

-- 删除表
DROP TABLE myorder;

进阶1:基础查询

​ 语法:

SELECT 查询列表 FROM 表名;
类似于Java中 :System.out.println(要打印的东西);
特点:
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数

进阶2:条件查询

​ 条件查询:根据条件过滤原始表的数据,查询到想要的数据
​ 语法:

	select 
		要查询的字段|表达式|常量值|函数 
	from 
		表
	where 
		条件 ;
分类:
一、条件表达式
	示例:salary>10000
	条件运算符:
	> < >= <= = != <>

二、逻辑表达式
示例:salary>10000 && salary<20000

逻辑运算符:
	and(&&):两个条件如果同时成立,结果为true,否则为false
	or(||):两个条件只要有一个成立,结果为true,否则为false
	not(!):如果条件成立,则not后为false,否则为true

三、模糊查询
示例:last_name like 'a%'

进阶3:排序查询

语法:

select
	要查询的东西
from
	表
where 
	条件
order by 排序的字段|表达式|函数|别名 【asc|desc】

进阶4:常见函数

一、单行函数

1、字符函数
concat拼接
substr截取子串
upper转换成大写
​lower转换成小写
​trim去前后指定的空格和字符
​ltrim去左边空格
​rtrim去右边空格
​replace替换
​lpad左填充
rpad右填充
instr返回子串第一次出现的索引
length 获取字节个数
2、数学函数
	round 四舍五入
	rand 随机数
	floor向下取整
	ceil向上取整
	mod取余
	truncate截断
3、日期函数
	#%Y 四位的年份   1999
	#%y 2位的年份    99
	#%m 月份(01,02…11,12)
	#%c 月份(1,2,…11,12) 
	#%d 日(01,02,…) 
	#%H 小时(24小时制)  16:04
	#%h 小时(12小时制)  4:04
	#%i 分钟(00,01…59) 
	#%s 秒(00,01,…59)
	year 		年			%Y      
	month  		月			%m
	day 		日			%d
	hour		小时		%H
	minute		分钟	    %i
	second		秒			%s
	now			当前系统日期+时间
	curdate		当前系统日期
	curtime		当前系统时间
	str_to_date 将字符转换成日期
	如:
	str_to_date('2019,1,12','%Y-%m-%d')   -- 2019-1-12
	
	date_format 将日期转换成字符
	如:
	date_format(noe(),'%Y年%m月%d'日) 
	举例:
	计算日期天数 例如:生日
	detediff(now(),'2001-01-23')
	
	#可以获取当前日期 指定的部分,年、月、日、小时、分钟、秒
	SELECT YEAR(NOW())
	SELECT MONTH(NOW())
	SELECT DAY(NOW())
	SELECT HOUR(NOW())
	SELECT MINUTE(NOW())
	SELECT SECOND(NOW())
	
	SELECT YEAR('2000-10-10')
	SELECT MONTH('2000-10-10')
	
	SELECT YEAR('2000/10/10')
4、流程控制函数
if 处理双分支
case语句 处理多分支
	情况1:处理等值判断
	情况2:处理条件判断
	
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句n;

end

5、其他函数
version版本
database当前库
user当前连接用户

二、分组函数

	sum 求和
	max 最大值
	min 最小值
	avg 平均值
	count 计数

	特点:
	1、以上五个分组函数都忽略null值,除了count(*)
	2、sum和avg一般用于处理数值型
		max、min、count可以处理任何数据类型
    3、都可以搭配distinct使用,用于统计去重后的结果
	4、count的参数可以支持:
		字段、*、常量值,一般放1

	   建议使用 count(*)

进阶5:分组查询

语法:

select 查询的字段,分组函数
from 表
group by 分组的字段
特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、分组筛选
		针对的表	位置			关键字
分组前筛选:	原始表		group by的前面		where
分组后筛选:	分组后的结果集	group by的后面		having

4、可以按多个字段分组,字段之间用逗号隔开
5、可以支持排序
6、having后可以支持别名

进阶6:多表连接查询

笛卡尔乘积:如果连接条件省略或无效则会出现
解决办法:添加上连接条件

一、传统模式下的连接 :等值连接——非等值连接

1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能

二、sql99语法:通过join关键字实现连接

含义:1999年推出的sql语法
支持:
等值连接、非等值连接 (内连接)
外连接
交叉连接

语法:

select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on  连接条件
【inner|left outer|right outer|cross】join 表3 on  连接条件
【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选条件】
【order by 排序的字段或表达式】

好处:语句上,连接条件和筛选条件实现了分离,简洁明了!


三、自连接

案例:查询员工名和直接上级的名称

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m 
WHERE e.`manager_id`=m.`employee_id`;

进阶7:子查询

含义:

一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询
在外面的查询语句,称为主查询或外查询

特点:

1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询
	结果集只有一行
	一般搭配单行操作符使用:> < = <> >= <= 
	非法使用子查询的情况:
	a、子查询的结果为一组值
	b、子查询的结果为空
	
② 多行子查询
	结果集有多行
	一般搭配多行操作符使用:any、all、in、not in
	in: 属于子查询结果中的任意一个就行
	any和all往往可以用其他查询代替

进阶8:分页查询

应用场景:

实际的web项目中需要根据用户的需求提交对应的分页查询的sql语句

语法:

select 字段|表达式,...
from 表
【where 条件】
【group by 分组字段】
【having 条件】
【order by 排序的字段】
limit 【起始的条目索引,】条目数;

特点:

1.起始条目索引从0开始

2.limit子句放在查询语句的最后

3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page

进阶9:联合查询

引入:
union 联合、合并

语法:

select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union  【all】
.....
select 字段|常量|表达式|函数 【from 表】 【where 条件】

特点:

1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型几乎相同
3、union代表去重,union all代表不去重

`

删除

方式1:delete语句

单表的删除: ★

delete from 表名 【where 筛选条件】

多表的删除:

delete 别名1,别名2
from 表1 别名1,表2 别名2
where 连接条件
and 筛选条件;

方式2:truncate语句

truncate table 表名

两种方式的区别【面试题】

#1.truncate不能加where条件,而delete可以加where条件

#2.truncate的效率高一丢丢

#3.truncate 删除带自增长的列的表后,如果再插入数据,数据从1开始
#delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始

#4.truncate删除不能回滚,delete删除可以回滚

十四、DDL语言

库和表的管理

库的管理:

一、创建库
create database 库名
二、删除库
drop database 库名

表的管理:

​ #1.创建表

CREATE TABLE IF NOT EXISTS stuinfo(
	stuId INT,
	stuName VARCHAR(20),
	gender CHAR,
	bornDate DATETIME
);
-- 查看表结构
DESC studentinfo;

​ #2.修改表 alter

语法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段类型】;

#①修改字段名
ALTER TABLE studentinfo CHANGE  COLUMN sex gender CHAR;

#②修改表名
ALTER TABLE stuinfo RENAME [TO]  studentinfo;

#③修改字段类型和列级约束
ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;

#④添加字段

ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
#⑤删除字段
ALTER TABLE studentinfo DROP COLUMN email;

​ #3.删除表

DROP TABLE [IF EXISTS] studentinfo;

常见类型

整型:
	 int,bigint,long,integer
小数:
	浮点型:float(M,D) double(M,D)
	定点型:dec(M,D) decimal(M,D)
字符型:
	较短的文本:char、varchar
	较长的文本:text、blob(较长的二进制数据)
日期型:
	datetime(年月日,时分秒), timestamp(年月日,时分秒), date(只有年月日), 		time(只有时分秒)

整型
分类:

tinyintsmallintmediumintint/integerbigint
特点:
① 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
② 如果插入的数值超出了整型的范围,会报 out of range 异常,并且插入临界值
③ 如果不设置长度,会有默认的长度
长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用!

小数

特点:
①
M:整数部位+小数部位
D:小数部位
如果超过范围,则插入临界值

②
M和D都可以省略
如果是decimal,则M默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度

③定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用

常见约束

NOT NULL   非空
DEFAULT    默认
UNIQUE     唯一
CHECK      检查约束
PRIMARY KEY   主键
FOREIGN KEY   外键
auto_increment   自增

外键添加:
FOREIGN KEY(表名) PRIMARY KEY 表名2(id)

十五、TCL语言(数据库事务)

1.什么是事务?

事务是由一个或一组SQL语句组成的一个执行单元(是一个整体),这个执行单元要么全部执行,要么全部不执行。

MySQL事务主要用于处理操作量大、复杂度高的数据。
比如说,在人员管理系统CRM中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱、文章等等,这样,这些数据库操作语句就构成一个事务。

(1)在MySQL	中只有使用了Innodb数据库引擎的数据库或表才支持事务。
(2)事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
(3)事务用来管理insert、update、delete语句。

2.案例:转账

ID	姓名	存款
1	张三丰	1000.00
2	郭襄	1000.00

转账:张三丰转500元给郭襄
update 表 set 张三丰的余额=存款-500 where name='张三丰'
意外
update 表 set 郭襄的余额=存款+500 where name='郭襄'

3.事务的特性ACID

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

一致性(Consistency):
一个事务执行会使数据从一个一致状态切换到另外一个一致状态
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。(比如:A向B转账,不可能A扣了钱,B却没有收到)


隔离性(Isolation,又称独立性):
一个事务的执行不受其他事务的干扰
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。(比u人:A正在从一张银行卡里面取钱,在A取钱的过程中,B不能向这张银行卡打钱)

持久性(Durability):
一个事务一旦提交,则会永久的改变数据库的数据.
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
锁
	行级锁
	表级锁

脏数据

	悲观锁
	乐观锁

4.事务的分类

事务分两类:隐式事务 和 显示事务
(1)隐式事务:即事务没有明显的开启和结束的标记。
比如insert、update、delete语句,具有自动提交功能。
MySQL默认是自动提交,即:set autocommit=1;

(2)显式事务:即事务具有明显的开启和结束的标记。
前提:必须先设置自动提交功能为禁用:
set autocommit=0;

5.创建事务

创建事务前,先检查事物有没有开启(查找可变参数autocommit)
show variables like 'autocommit';

隐式事务:会自动提交
delete from 表 where id =1;
rollback;		-- 发现删除掉的记录不能恢复,因为delete具有自动提交功能。

显式事务:
前提设置禁用自动提交事务功能:set autocommit = 0;
步骤1:开启事务
start transaction;		-- 手动开启事务,可选的

步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
...

步骤3:结束事务
commit;			-- 提交事务
或
rollback;			-- 回滚事务

1.演示事务的使用步骤

#开启事务
SET autocommit = 0;  
START TRANSACTION;

#编写一组事务的语句
UPDATE account SET balance = 5800 WHERE userName = '张无忌';
UPDATE account SET balance = 5600 WHERE userName = '赵敏';

#结束事务
# [结束事物用 回滚 还是用  提交 
# 要结合下周学的逻辑语句if[成功commmit]_else[失败rollback]
COMMIT;	# 提交事物,一组事物的语句都执行
#rollback;	# 回滚,一组事物的语句都不执行
SELECT * FROM account;

2.演示事务对于delete和truncate的处理的区别

#delete不加条件就是删整表数据,标识列 紧跟 断点+1,不会重置
#truncate删除整表数据,重新开始标识列,重置数据

演示delete

SET autocommit = 0;
START TRANSACTION;
DELETE FROM account;  #没有删除,可以回滚。
ROLLBACK;

演示truncate

SET autocommit = 0;
START TRANSACTION;
TRUNCATE TABLE account;  #删除数据,不可以回滚。
ROLLBACK;

结论:truncate的删除 无法进行回滚控制,delete可以回滚

3.演示savepoint 的使用【设置撤销点】

SET autocommit = 0;
START TRANSACTION;

DELETE FROM account WHERE id = 1;

SAVEPOINT a;  #设置保存点 ,名字为a

DELETE FROM account WHERE id = 4;

rollback; 回滚到事物开启位置

ROLLBACK to a;  # 回滚到保存点a【撤销到a点】

SELECT * FROM account;

总结

含义

通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态

特点(ACID)

	原子性:要么都执行,要么都回滚
	一致性:保证数据的状态操作前和操作后保持一致
	隔离性:多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
	持久性:一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改

使用到的关键字

set autocommit=0;
start transaction;
commit;
rollback;

savepoint  断点
commit to 断点
rollback to 断点

事务的隔离级别:

事务并发问题如何发生?

当多个事务同时操作同一个数据库的相同数据时

事务的并发问题有哪些?

脏读:一个事务读取到了另外一个事务未提交的数据
不可重复读:同一个事务中,多次读取到的数据不一致
幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据

如何避免事务的并发问题?

通过设置事务的隔离级别
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免脏读
3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读
4、SERIALIZABLE可以避免脏读、不可重复读和幻读

设置隔离级别:

set session|global  transaction isolation level 隔离级别名;

查看隔离级别:

select @@tx_isolation;

十六、视图

含义:理解成一张虚拟的表

视图和表的区别:

	  使用方式	 占用物理空间

视图	 完全相同	不占用,仅仅保存的是sql逻辑

表	  完全相同	 占用

视图的好处:

1、sql语句提高重用性,效率高
2、和表实现了分离,提高了安全性

视图的创建

​ 语法:

CREATE VIEW  视图名
AS
查询语句;

视图的增删改查

​ 1、查看视图的数据 ★

SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';

2、插入视图的数据

INSERT INTO my_v4(last_name,department_id) VALUES('虚竹',90);

3、修改视图的数据

UPDATE my_v4 SET last_name ='梦姑' WHERE last_name='虚竹';

4、删除视图的数据

DELETE FROM my_v4;

某些视图不能更新

​	包含以下关键字的sql语句:分组函数、distinct、group  by、having、union或者union all
​	常量视图
​	select中包含子查询
​	join
​	from一个不能更新的视图
​	where子句的子查询引用了from子句中的表

视图逻辑的更新

#方式一:

CREATE OR REPLACE VIEW test_v7
AS
SELECT last_name FROM employees
WHERE employee_id>100;
	

#方式二:

ALTER VIEW test_v7
AS
SELECT employee_id FROM employees;
-- 使用
SELECT * FROM test_v7;

视图的删除

DROP VIEW test_v1,test_v2,test_v3;

视图结构的查看

DESC test_v7;
SHOW CREATE VIEW test_v7;

十七、存储过程

含义:

一组经过预先编译的sql语句的集合
好处:

1、提高了sql语句的重用性,减少了开发程序员的压力
2、提高了效率
3、减少了传输次数

分类:

1、无返回无参
2、仅仅带in类型,无返回有参
3、仅仅带out类型,有返回无参
4、既带in又带out,有返回有参
5、带inout,有返回有参
注意:in、out、inout都可以在一个存储过程中带多个

创建存储过程

语法:

create procedure 存储过程名(in|out|inout 参数名  参数类型,...)
begin
	存储过程体
end

类似于方法:

修饰符 返回类型 方法名(参数类型 参数名,...){

	方法体;
}

注意

1、需要设置新的结束标记
delimiter 新的结束标记
示例:
delimiter $

CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名  参数类型,...)
BEGIN
	sql语句1;
	sql语句2;

END $

2、存储过程体中可以有多条sql语句,如果仅仅一条sql语句,则可以省略begin end

3、参数前面的符号的意思
in:该参数只能作为输入 (该参数不能做返回值)
out:该参数只能作为输出(该参数只能做返回值)
inout:既能做输入又能做输出

调用存储过程

​	call 存储过程名(实参列表)

十八、函数

创建函数

学过的函数:LENGTH、SUBSTR、CONCAT等

语法:

CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型
BEGIN
	函数体

END

调用函数

​	SELECT 函数名(实参列表)

函数和存储过程的区别

		关键字		调用语法	返回值			应用场景
函数		FUNCTION	SELECT 函数()	只能是一个		一般用于查询结果为一个值并返回时,当有返回值而且仅仅一个
存储过程	PROCEDURE	CALL 存储过程()	可以有0个或多个		一般用于更新

十九、流程控制结构

系统变量

一、全局变量

作用域:针对于所有会话(连接)有效,但不能跨重启

查看所有全局变量
SHOW GLOBAL VARIABLES;
查看满足条件的部分系统变量
SHOW GLOBAL VARIABLES LIKE '%char%';
查看指定的系统变量的值
SELECT @@global.autocommit;
为某个系统变量赋值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;

二、会话变量

作用域:针对于当前会话(连接)有效

查看所有会话变量
SHOW SESSION VARIABLES;
查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%char%';
查看指定的会话变量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
为某个会话变量赋值
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';

自定义变量

一、用户变量

声明并初始化:

SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;

赋值:

方式一:一般用于赋简单的值
SET 变量名=值;
SET 变量名:=值;
SELECT 变量名:=值;
方式二:一般用于赋表 中的字段值
SELECT 字段名或表达式 INTO 变量
FROM 表;

使用:

select @变量名;

二、局部变量

声明:

declare 变量名 类型 【default 值】;

赋值:

方式一:一般用于赋简单的值
SET 变量名=值;
SET 变量名:=值;
SELECT 变量名:=值;
方式二:一般用于赋表 中的字段值
SELECT 字段名或表达式 INTO 变量
FROM 表;

使用:

select 变量名

二者的区别:

		作用域			定义位置		语法

用户变量 当前会话 会话的任何地方 加@符号,不用指定类型
局部变量 定义它的BEGIN END中 BEGIN END的第一句话 一般不用加@,需要指定类型

分支

一、if函数

语法:if(条件,值1,值2)
特点:可以用在任何位置

二、case语句

语法:

情况一:类似于switch
case 表达式
when 值1 then 结果1或语句1(如果是语句,需要加分号) 
when 值2 then 结果2或语句2(如果是语句,需要加分号)
...
else 结果n或语句n(如果是语句,需要加分号)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

情况二:类似于多重if
case 
when 条件1 then 结果1或语句1(如果是语句,需要加分号) 
when 条件2 then 结果2或语句2(如果是语句,需要加分号)
...
else 结果n或语句n(如果是语句,需要加分号)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

特点:
可以用在任何位置

三、if elseif语句

语法:

if 情况1 then 语句1;
elseif 情况2 then 语句2;
...
else 语句n;
end if;

特点:
只能用在begin end中!!!!!!!!!!!!!!!

三者比较:

​ 应用场合
​ if函数 简单双分支
​ case结构 等值判断 的多分支
​ if结构 区间判断 的多分支

循环

语法:

【标签:】WHILE 循环条件  DO
	循环体
END WHILE 【标签】;

特点:

只能放在BEGIN END里面

如果要搭配leave跳转语句,需要使用标签,否则可以不用标签

leave类似于java中的break语句,跳出所在循环!!!

你可能感兴趣的:(mysql)