MySQL
基础概念
数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。
**数据库(Data Base—简称DB):**存储数据的仓库,位于计算机存储上设备之上,数据按照一定格式存放的。
**数据库管理系统(DataBase Management System,简称DBMS)😗*用于建立、使用和维护数据库。是管理数据库的软件。
**数据库系统(DataBase System,简称DBS)😗*是一个完整的数据操作链路,包含从用户到数据的所有内容。
三者之间的关系:
数据库系统中的核心是数据库管理系统
数据管理发展史
第一阶段:人工管理阶段(入学填写纸质档案)
第二阶段:文件系统阶段(将信息录入Excel表)
第三阶段:数据库管理系统阶段(将excel表导入校园管理系统)
数据库系统的特点
1.数据结构化
2.数据共享性
3.数据独立性
4.DBMS统一管理
数据模型
数据模型的组成
数据结构:根据对象与对象之间的关系划分为不同的结构模型,如层次模型,网状模型和关系模型。
数据操作:包含数据的查询与更新(增删改)
数据的完整性约束条件:保证数据库中数据的正确,有效和相容。
概念模型
实体:现实世界中实际存在的物体将之虚拟到计算机中,称为实体。例如:一个人,一条狗
属性:实体中所包含的某一特征,实体可以有多个属性。例如:人的身高,体重,年龄
码:表示实体的属性集, 多个相同实体的共同特征。
实体型:具有相同属性的实体具有共同的特征和性质,用实体名和属性抽象为实体,称为实体型。
实体集:同一类型的实体集合称为实体集。
关系:一对一(学生—学号),一对多(班级------学生),多对多(学生------课程)
逻辑模型
逻辑模型只针对数据内容中所有实体,实体的属性以及实体间的关系的设计,并不涉及这些数据的具体实现。
物理模型
描述数据在系统内部的表示方法和存在方式,是具体实现数据库管理的模型。
逻辑模型分类
层次模型:
网状模型:
关系模型:
关系:一张表
元组:一行数据
属性:表中字段
域:字段的取值范围
关键字:标志数据唯一性的字段
主关键字:多个字段做关键字时,选定其中的一个。
外部关键字:某字段在当前表中不是主关键字,确实另一张表中的主关键字(例如,成绩表中的学号)
候选关键字:能唯一标识表中行的列,称为候选关键字。
关系模型中二维表应满足的条件
- 表中不允许有重复的字段名。
- 表中每一列数据的数据类型必须相同
- 表中不允许有两条完全相同的数据
- 表中行的排列次序以及列的排列次序可以任意,且不影响表中的关系
数据库系统的三级模式
- 模式:也称为逻辑模式,是数据库系统模式结构的中间层。一个数据库只有一个模式。
- 外模式:连接应用程序和用户,一个数据库可以有多个外模式。
- 内模式:数据物理结构和存储方式的描述,一个数据库自由一个内模式。
数据库的种类
- 关系型数据库:mysql(开源)、Oracle(收费)、visual foxpro、oceanbase、sqlserver(财务系统)
- 非关系型数据库:redis,mongodb-------作为缓存使用
Mysql发展史
mysqlAB-------》sun公司----------》oracle
Mysql特点
- 开源免费
- 容易使用
- 高性能
- 功能强大
- 运行速度快
- 数据安全
- 支持跨平台
- 丰富的接口
mysql应用
- 数据分析
- 数据库集群
- Web开发
- 应用程序
- 数据库管理
mysql版本
- 社区版
- 商业版
mysql安装
- 使用安装包
- 解压版
环境变量的配置
鼠标右键计算机------>属性
![]()
点击高级系统设置
![]()
点击环境变量
![]()
编辑Path(将mysql安装路径添加至path中)
![]()
D:\database\mysql-5.6.40-winx64\mysql-5.6.40-winx64\bin\
mysql服务的启动与停止
视图方式
命令方式
net start mysql --启动 net stop mysql --停止
使用Mysql客户端登录服务
1.没有配置环境变量情况下,先打开mysql安装目录,打开bin文件夹,执行登录口令
2.配置了环境变量情况下直接执行口令即可
登录语法:mysql -u用户名 [-h主机名] -p密码 [-P端口号] mysql -uroot -h127.0.0.1 -p123456 -P3306 -- root表示用户名 -- 127.0.0.1表示本机IP,也可使用localhost代替 -- 123456mysql登录密码 -- 3306表示MySQL端口号 -- 如果登录本机数据库,ip和端口号可以省略不写
完整操作步骤
1.打开cmd命令符操作界面,输入cmd回车
win+r
2.登录mysql服务
mysql -uroot -p 输入密码
3.查看数据库列表
show databases;
4.打开mysql数据库
use mysql;
5.展示当前库所有数据表
show tables;
6.查询user表中记录
select * from user;
7.退出mysql
1.exit 2.quit 3.\q
数据库图形化管理工具
- Navicat
- SQLyog
- Datagrip
- Workbench
Navicat连接mysql
软件运行流程
SQL(结构化查询语言)
结构化查询语言分类
-
DDL(数据定义语言):对数据库、表、视图、索引等数据库对象进行创建、删除、修改操作。
-
DML(数据操作语言):对数据进行增删改的操作
-
DQL(数据查询语言):对数据进行查询的
-
DCL(数据控制语言):用来管理数据库的语言,包括管理权限及数据更改
SQL类型 命令动词 功能描述 数据定义语言DDL create 创建 drop 删除 alter 修改 数据操作语言DML insert 新增数据 delete 删除数据 update 修改数据 数据查询语言DQL select 查询数据 数据控制语言DCL grant 为用户增加权限 revoke 为用户收回权限 SQL语言的特点
- SQl语言是一种一体化的语言。
- SQL语言是一个高度非过程化的语言。
- SQL语言非常简洁。
- SQL语言技能使用命令方式交互使用也可以嵌入到程序内部以程序方式运行。
SQL语法规则
- sql语句可以写在一行或者多行。较长的sql语句分成多行书写,必要时进行缩进。
- 每条命令以“;”或者“\g”或“\G”结束。
- 关键字不能缩写,也不能分行书写。
- 必须保证所有的括号,单引号、双引号成对出现。
- mysql再windows环境下不区分大小写,但是在Liunx系统中区分大小
- 注释分为单行注释和多行注释
- 单行注释:-- 注释内容
- 多行注释:/注释内容/
MySQL数据类型
类型 | 详细分类 | 类型举例 |
---|---|---|
数值类型 | 整数类型 | int、smallint、tinyint、bigint、mediumint |
浮点数类型 | float、double | |
定点数类型 | decimal | |
位类型 | bit | |
日期和时间型 | 日期和时间型 | datetime、year、time、date、timestamp(时间戳) |
字符串类型 | 文本字符串类型 | char、varchar、tinytext、text、mediumtext、longtext |
枚举、集合类型 | enum、set | |
二进制字符串类型 | binary、varbinary、tinyblob、blob、mediublod、longblob |
整数类型
取值范围:tinyint、smallint、mediumint、int、bigint
符号取值:
int 取值范围:0~4294967295 int unsigned 取值范围:-2147483648~2147483647
显示宽度:
tinyint (3) :括号中的数字用来指定该字段的显示长度,显示长度并不会影响真正的取值范围。
默认值填充
int(3) zerofill :定义为整型变量后未赋值情况下,使用0做填充。
类型的选择:
- 确定字段取值范围
- 确定值是否有负数
小数类型
取值范围:float、double、decimal(M,D)
decimal(M,D)
M:精度,表示数字的总位数。 取值范围:0~255
D:标度,表示小数点后的位数。 取值范围:0~30
日期和时间型
year类型:1901~2155
date类型:YYYYY-MM-DD、YYYY/MM/DD、YYYY\MM\DD、YYYY.MM.DD、YYYY,MM,DD
time类型:HH:MM:SS
datetime:YYYYY-MM-DD HH:MM:SS
timestemp:显示从1970到现在所经过的毫秒数。
字符串类型
char: 定长字符串
char(长度):长度取值范围1~255
![]()
varchar:变长字符串
varchar(最大长度):最大长度取值范围:1~21845
![]()
char与varchar区别:
char与varchar类型都可以指定长度,(字符数)。
当输入的字符长度大于指定的字符长度时,系统报错。当输入的字符小于指定长度时,char类型使用空格填充,varchar保留实际长度+1。
char类型最大长度255,varchar类型最大长度21845。
char类型查询效率高于varchar类型。
二进制类型字符串
binary:固定长度,参考char
varbinary:可变长度,参考 varchar
文本类型
text:保存的是非二进制的长文本数据,例如文章内容、评论等比较长的文本。
子类型:tinytext、text、mediumtext、longtext
blob:保存数据量很大的二进制数据,如图片、声音、视频一级扫描文档。
子类型:tinyblob、blob、mediumblob、longblob
text与blob的区别
- text以文本形式存储数据,blob以二进制方式存储。
- text不区分大小写,blob区分大小写
- 字符集对text有影响,对blob没有影响
- text和blob执行效率低于char和varchar类型
枚举和集合类型
enum:枚举类型
格式:ENUM(‘值1’,‘值2’,‘值3’…)
枚举列表最多可以存储65535个值
ENUM(‘男’,‘女’)
set:集合类型
格式:SET(‘值1’,‘值2’,‘值3’…)
集合列表最多可以存储64个值。
SET(‘唱歌’,‘跳舞’,‘打篮球’)
枚举和集合的区别
- 枚举只支持单选,集合支持多选
- 只能插入规定的数据项,节省空间,提高查询效率
- 枚举和集合都支持中文
- 插入和查询操作时自动忽略末尾空格。
mysql运算符
-
算术运算符
运算符 书写格式 功能 + n1+n2 加法运算 - n1-n2 减法运算 * n1*n2 乘法运算 /或div(整除) n1/n2 或 n1 div n2 除法运算 mod或% n1 mod n2 或n1%n2 取余运算 取余注意:
-
如果n1的绝对值能被n2的绝对值整除,余数为零。
-
n1与n2取余时,所得余数的符号与被除数n1的符号相同。
-
小数也能实现取余(求模)操作。
-
-
运算过程中只要有null参与也运算,那么最终结果就为null。
-
-
如果除法或取余运算除数为零时,系统不报错,结果为null。
-
-
-
比较运算符
运算符 功能 >、>= 判断大于、大于等于 <、<= 判断小于、小于等于 = 等值判断 <>、!= 判断不等于 <=> 判断是否为null in、not in 判断是否包含 is null、is not null 判断是否为空 between and、not between and 范围判断 like、not like 字符串匹配判断 regexp 正则表达式判断 注意:
- 比较运算符可用于多种数据类型的比较。
- 比较运算符返回值为逻辑型,可分为三种,分别是1(表示True)、0(表示False)、null。
- 比较字符串时,不区分大小写。
- null值与任何类型的内容进行运算时,结果都为null。
-
逻辑运算符
运算符 功能 && 或 and 运算符左右两边同时为真,结果才为真,其他情况都为假 || 或 or 运算符左右两边有一个结果为真,最终结果几位真。 ! 或 not 取反 XOR(异或) 运算符左右两边的结果相反,最终结果为真。否则结果为假。 注意:
- 逻辑与运算时,如果操作数中含有null,另一个操作数为真,结果为null,如果另一个操作数为假,结果为0
- 逻辑或运算时,如果操作数中含有null,另一个操作数为真,结果为1,如果另一个操作数为假时,结果为null
- 异或运算中,操作数中含有null,结果为null。
-
运算符优先级
优先级 运算符 1 ! 2 +(正号)、-(负号) 3 ^(幂次方) 4 *、/、DIV、%(mod) 5 +、- 6 =、>、<。。。。关系运算符 7 between…and… 8 not 9 &&、and 10 XOR 11 ||、or 12 =(赋值) mysql内部函数
-
聚合函数
函数格式 功能 count(*) 计数函数,统计表中记录数 sum(字段名) 统计该字段名的和 avg(字段名) 统计该字段平均值 max(字段名) 统计该字段中最大值 min(字段名) 统计该字段中最小值 聚合函数通常需要配合group by分组语句使用。
-
数学函数
函数格式 功能 示例 sign(n) 符号函数,如果n为整数,返回值为1,如果n为负数,返回值为-1,如果n为0,返回值就为0 abs(n) **绝对值函数,**返回n的绝对值。 sqrt(n) **平方根函数,**返回n的平方根。n不能为负数,否则返回值为null。 mod(n1,n2) 取余函数,返回n1除以n2所得的余数。 ceil(n)或ceiling(n) 向上取整函数,返回大于或等于n的整数。 floor(n) 向下取整函数,返回小于或等于n的整数。 rand() 随机函数,返回0~1之间的随机数。获取指定范围随机数公式floor(下限+rand()*(上限-下限)) rand(n) 随机函数,返回0~1之间的随机数,n不变的话,每次返回的结果相同。 round(n) 四舍五入函数,将n进行四舍五入取整数。 round(n1,n2) 四舍五入函数,将n1四舍五入保留n2位小数。 format(n1,n2) 格式化函数,将n1四舍五入保留n2位小数,并将结果进行格式化“#,###,##”,结果以字符串形式返回。 truncate(n1,n2) 截断函数,将n1保留n2位小数,不四舍五入 pow(n1,n2)或power(n1,n2) 返回n1的n2次方 exp(n) 指数函数 log(n) 对数函数 log10(n) 对数函数,以10为底数 PI() 圆周率函数 radians(n) 将角度转换为弧度 degress(n) 将弧度在转换为角度 sin(n) 正弦函数 asin(n) 反正弦函数 cos(n) 余弦函数 acos(n) 反余弦函数 tan(n) 正切函数 atan(n) 反正切函数 cot(N) 正切函数 greatest(n1,n2,n3…) 返回列表中最大值 least(n1,n2,n3…) 返回列表中最小值 -
字符串函数
函数名 功能 示例 upper或ucase 将字符串中小写字母转换为大写 lower或lcase 将字符串中大写字母转换为小写 left(字符串,数值) 将字符串从左往右取n个字符 right(c,n) 将字符串从右往左取n个字符 substring(字符串,数值1,数值2)或mid(c,n1,n2) 将字符串从n1位置开始截取n2个长度的字符 ltrim© 去除字符串左边开头的空格 rtrim© 去除字符串右边结尾的空格 trim© 将字符串中头尾的空格删除掉 trim(c1 from c) 删除字符串c开始和结尾处的字符串c1 reverse© 将字符串倒序返回 concat(c1,c2…) 将括号中的字符串合并为一个字符串 concat_ws(x,c1,c2…) 使用x作为连接符连接各个字符串 char_length© 返回字符串的字符数。一个汉字为一个字符。 length© 返回字符串的字节数,gbk中一个汉字占用2个字节,utf-8中一个汉字占用3个字节。 position(c in c1)或locate(c,c1) 返回字符串c在c1中的第一次出现位置。 instr(c,c1) 返回字符串c1在c中第一次出现的位置 field(c,c1,c2…) 返回字符串c字符串列表中的位置。 find_in_set(c,c1) 返回c在含有英文逗号分隔的字符串c1中出现的位置。 elt(n,c1,c2…) 返回多个字符串中的第n个。 replace(c,c1,c2) 将c字符串中的c1字符替换为c2 insert(c1,n1,n2,c2) 使用字符串c2替换c1中第n1个位置开始的长度为n2的字符串,c1中第一个字符位置为1 Lpad(c1,n,c2) 使用字符串c2填充c1的开始处,使字符串长度达到n rpad(c1,n,c2) 使用字符串c2填充在c1的结尾处,使字符串长度达到n repeat(c,n) 将字符串重复n次 space(n) 返回n个空格 ord©或ascii© 返回字符串中第一个租房有的ASCII码 char(n) 返回ASCII码对用的字符 strcmp(c1,c2) 比较两个字符串,如果c1大于c2,返回1;如果c1等于c2返回0;c1小于c2返回-1; -
日期和时间函数
函数 功能 示例 curdate()或current_date() 返回当前日期 curtime或current_time 返回当前的时间 now()或current_timestamp或sysdate() 返回当前的日期和时间 localtime()或localtimestamp() 返回当前的日期和时间 date(d) 返回表达式中的日期值 time(t) 返回表达式中的时间值 year(d) 返回表达式中的年份 month(d) 返回表达式中的月份 day(d) 返回表达式中的日期值 monthname(d) 返回表达式中月份的名称 dayname(d) 返回表达式中对应的星期名称 dayofyear(d) 返回日期是本年的第几天 dayofmonth(d) 返回日期是本月的第几天 dayofweek(d) 返回日期是本周的第几天 week(d) 返回表达式中的日期是本年的第几周 weekofyear(d) 同上(周一为第一天) quarter(d) 返回表达式日期是本年的第几个季度 hour(t) 返回小时数 minute(t) 返回分钟时 second(t) 返回秒数 adddate(d,n) 返回起始日期加上n天后的日期 subdate(d,n) 返回起始日期减去n天后的日期 addtime(t,n) 返起始日期时间t加上n秒后的日期 subtime(t,n) 返回起始日期时间减去n秒后的日期 datediff(d1,d2) 计算算两个日期相差的天数 timediff(t1,t2) 计算两个日期时间之间相差的秒数 -
系统信息函数
函数 功能 演示 version 查看mysql版本号 datebase或schema 返回当前数据库名 user或
sys_user
session_user
current_user返回当前登录的用户名 charset© 返回字符串c的字符集 collation© 返回字符串c的排列方式 connetion_id 返回当前客户连接服务器的次数 last_insert_id 返回最近生成的auto_increment值 -
其他函数
函数名 功能 示例 if(expr,x1,x2) 条件判断函数,如果expr条件成立,返回x1的值,否则返回x2的值。 ifnull(x1,x2) 条件判断函数,如果x1不为空,返回x1的值,否则返回x2的值。
-
数据库管理
-
创建数据库
create {database|schema} [if not exists] 数据库名 [[default] character set [=] <字符集名>] [[default] collate [=] <排序规则名>] -- 1.database和schema都是创建数据库的关键字,功能相同 -- 2.if not exists:数据库不存在时自动创建,否则忽略本次操作。 -- 3.default character set:指定数据库字符集 -- 4.defalut collate:指定数据库校对规则 数据库命名规则 1.可以是字母、数字、下划线和$组成的任意字符串,但是不能以纯数字命名。 2.同一连接下不能出现同名数据库 3.不能使用mysql的关键字作为数据库名
练习:创建财务管理数据库db_financial,并指定字符集为“gbk”,校对规则为“gbk_chinese_ci”,确保如果数据库不存在就创建它,如果存在就忽略此条命令。
create database if not exists db_financial character set gbk collate gbk_chinese_ci
-
删除数据库
drop {databases|schemas} [if exists] 数据库名称
练习:删除db_shop数据库。
drop database if exists db_shop
-
显示数据库列表
show {databases|schemas}
-
查看创建数据库语句
show create database <数据库名>
-
使用数据库
use 数据库名称
-
修改数据库
alter {database|schema} [{数据库名}] [[default] character set [=] <字符集名>] [default] collate [=] <排序规则名>
练习:将数据库db_financial的字符集改为utf8mb4,排序规则改为utf8mb4_general_ci。
alter database db_financial character set utf8mb4 collate utf8mb4_general_ci
-
查看数据库下包含哪些表
show tables
数据表管理
-
查看表结构
desc 表名 show [full] columns from 表名
-
显示建表语句
show create table 表名 CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pname` varchar(20) DEFAULT NULL, `brithday` datetime DEFAULT NULL, `idcode` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, `mid` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |
-
创建表
create table [if not exists] 表名称( 字段名 数据类型(长度) 约束条件, 字段名2 数据类型(长度)约束条件)enging=存储类型 default charset=字符集类型 collate=检验规则 定义字段的语法格式: 字段名 数据类型 [not null|null] [default 默认值] [auto-increment] [unique key|primary key] [comment 注释内容] [reference 外键名称] [index 索引名] -- 练习 -- 创建一个学生表Student -- 包含学生id int、学生姓名 varchar(50)、性别 char(1)、专业 varchar(30)、任课老师 varchar(30)、地址 varchar(50)、照片 blob -- 将学生id设置为主键,不能为空,自动递增 -- 将所有字段添加注释 -- 将专业默认设置为“计算机” create table Student( 学生id int not null auto-increment primary key comment "学生编号", 学生姓名 varchar(50) comment "学生姓名", 性别 char(1) comment "性别", 专业 varchar(30) default "计算机" comment "专业", 任课老师 varchar(30) comment "任课老师", 地址 varchar(50) comment "地址", 照片 blob comment "照片" )
修改表结构
语法:
alter table 表名 add 字段名 数据类型 [属性] [索引] [first | after 字段名] -- first将新增字段插入在首列,after将新增字段插入到指定字段后边 modify|alter 字段名 数据类型 [属性] [索引] -- 修改指定字段的数据类型等信息 change 字段名 新字段名 数据类型 [属性] [索引] -- change可以修改字段数据类型,也可以把指定的字段修改为一个新的名字 drop 字段名 -- 删除指定字段 auto-increment = n -- 设置字段初始值的 rename to|as 新表名 -- 修改表名 enging=存储引擎|charset=字符集|collate=校验规则
练习:在Student学生表中,Stusex字段后面添加一个新的出生日期字段(Birthday)。
alter table Student add Birthday date after Stusex
练习2:将学生表中姓名Stuname的长度修改为varchar(20);
alter table student modify Stuname varchar(20)
练习3:将学生表名修改为studentbak;
alter table student rename to studentbak;
重命名数据表
语法:rename table 旧表 名 to 新表名
练习:将student表名修改为studentTemp
rename table student to studentTemp
复制数据表
语法:create table 新表名 like 旧表名
功能:把旧表的表结构、索引、默认值都复制到新表中。
练习:将学生表student复制,生成一张新表,名为studentTemp
create table studentTemp like student
删除表结构
语法:drop table [if not exists] 表名
练习:删除student表
drop table if not exists student
**MyISAM:**节约空间,以及相应的速度。
InnoDB:安全性,事务处理及多用户操作数据表
数据表存放位置及形式
数据表以文件形式存放在磁盘中,目录为mysql安装目录下data文件夹中
- innodb:只包含一个.frm文件
- myisam:包含.frm,.myd和.myi文件------索引文件
数据库完整性
实体完整性
实体(Entity):对应的数据库表中一条完整的记录。
元组(Tuple):表中的一行记录。
字段(Field):表中的一列,属性。
实体完整性:表中的每条记录保持唯一,通过主关键字的唯一性确保记录的唯一性,从而达到实体完整性。
实体完整性规则:
- 一个基本关系(表)对应一个实体集(多行记录)。
- 实体之间通过唯一标识进行区分,例如学生编号、员工编号、订单编号。
- 主关键字作为唯一标识,不能为空。
数据库中实体完整性的实现
约束:作用于表中字段上的规则,用于限制存储在表中的数据,目的是保证数据库中数据的正确性、有效性和完整性。
约束类型:
主键约束(Primary Key)
每张表中只能有一个列被设置为主键,主键字段不能重复,不能为空。
-- 创建表时指定主键 create table XXX( id int primary key, ... ) create table XXX( 字段1 ....., primary key(字段名)) -- 已存在的表中指定主键 alter table 表名 add primary key(主键字段) -- 删除主键约束 alter table 表名 drop primary key
联合主键:由多个字段组合而成的主键。
alter table 表名 add primary key(字段1,字段2)
唯一约束(Unique Key)
不允许出现重复的字段,允许为空,但是一张表中只能有一个空值,一张表中可以创建多个唯一约束。
-- 1.创建表时增加唯一约束 create table 表名( 字段1 数据类型, 字段2 数据类型 Unique key, ... ) -- 2.方法2 create table 表名( 字段1 数据类型, 字段2 数据类型, ... unique key(字段名) ) -- 3.对已存在的表中设置唯一索引 alter table 表名 add 约束名 unique key(字段) -- 4.删除表中的唯一索引 alter table 表名 drop index 字段
参照完整性
参照完整性规则
- 参照关系中的属性值必须能够在被参照关系中找到或者取空值。
引用关系
- 同一关系
- 两个关系
参照完整性的实现
外键约束(foreign key)
-- 创建表时添加外键 create table 表名( 字段名 数据类型, foreign key 字段名 references 主表 字段名 ) -- 实例 create table studet5( stuid int primary key, name varchar(50), sex char(1), address varchar(50) ) create table student6( id int, sc varchar(10), class varchar(10), foreign key(id) references studet5(stuid) )
用户自定义完整性
用户根据实际的完整性要求来定义的,在执行数据从操作时,数据库管理系统会检查数据是否满足限定条件。常使用的用户自定义完整约束包含非空约束、自增约束和默认值约束。
非空约束(not null):属于域完整性约束,字段的值不能为空,但是允许重复。
-- 创建表时,添加非空约束 create teble 表名( 字段名 数据类型 not null ) -- 给创建好的数据表增加非空约束 alter table 表名 change 旧字段名 新字段名 数据类型 not null -- 如何删除已经创建好的非空约束 alter table 表名 change 旧字段名 新字段名 数据类型
默认值约束
默认值约束(default):给某个字段指定默认值,一旦指定默认值,再插入数据是,如果该字段没有赋值,则使用默认值。
-- 建表时添加默认值约束 create table 表名( 字段名 数据类型 defalut 默认值 ) -- 建表后添加默认值 alter table 表名 modify 字段名 数据类型 default 默认值 -- 删除默认值约束 alter table 表名 modify 字段名 数据类型
完整性约束命名子句
主键约束:primary key
外键约束:foreign key
唯一约束:unique key
非空约束:not null
默认值约束:defalut
完整性约束命名子句语法
constraint 约束名称 约束条件 -- 练习 alter table stu add constraint id primary key(stuid) alter table stu add constraint name unique key(stuname) alter table stu modify column stuname varchar(20) not null alter table stu modify column sc int default 95
mysql数据查询与更新
单表查询
查询语法: select 查询项 from 表名 [where 查询条件] [group by 分组字段] [having 筛选条件] [order by 排序字段] [limit 分页规则] [union 运算符] -- union子句用来将多个select语句查询结果合并为一个结果集
简单查询
语法:
select [all|distinct] from 表名|视图 [limit n1,n2] all:表示结果集的所有行,包含重复行,all是默认选项 distinct:消除重复行,空值被认为相等。 limit n1,n2表示从n1行开始,返回n2条记录。初始行从0开始 示例:去除重复行记录 select distinct * from student 示例:-- 第一次查询显示1~3条记录 select * from student limit 0,3 -- 第二次查询显示4~6条记录 select * from student limit 3,3 查询结果的别名设置 select 字段名 as 别名... select 字段名 别名... -- 示例: select name as 姓名,address 家庭住址 from student
条件查询
where 查询条件
查询条件 谓词 比较运算符 > 大于 >= 大于等于 < 小于 <= 小于等于 <>或!= 不等于 = 等于 <=> 相等或都等于空 逻辑运算符 not 非 and 与 or 或 xor 异或:运算符左右两边的结果不同则结果为真 字符匹配 like %:表示任意个任意字符 _:表示一个任意字符 区间查询 between…and… 小值在前,大值在后 包含 in() 包含 not in() 不包含 空值判断 is null 为空 is not null 不为空 示例: -- 查询年龄大于16岁的学生信息 select * from student where age>16 -- 查询年龄大于等于16岁的学生信息 select * from student where age>=16 -- 查询年龄小于16岁的学生信息 select * from student where age<16 -- 查询年龄小于等于16岁的学生信息 select * from student where age<=16 -- 查询年龄不等于16岁的学生信息 select * from student where age<>16 select * from student where age!=16 -- 查询年龄等于16岁的学生信息 select * from student where age=16 -- 查询年龄等于16岁的学生信息(使用逻辑非运算符) select * from student where not age<>16 -- 查询年龄在16岁以下,性别为女的同学信息 select * from student where age<16 and sex="女" -- 查询年龄在16岁以下,或者性别为男的同学信息 select * from student where age<16 or sex="男" -- 查询年龄在16岁以下的不是男生的信息或者16以上的男生信息 select * from student where age<16 xor sex="男" -- 查询姓张的同学信息 select * from student where name like "张%" -- 查询15~18之间的学生信息 select * from student where age between 15 and 18 select * from student where age>=15 and age<=18 -- 查询年龄是15,18,13的同学信息 select * from student where age in(15,18,13) -- 查询家庭住址为空的学生信息 select * from student where address is null
排序查询
单字段排序 语法:order by 排序字段 [排序规则] 排序规则:desc降序 asc升序(默认值) 示例:将学生信息按照年龄从大到小的顺序显示 select * from student order by birthday asc 多字段排序 语法:order by 主排序字段 排序规则,次排序字段 排序规则 示例:-- 根据分数由高到低进行排序,如果分数相同,根据年龄由低到高显示 select * from student order by score desc,birthday desc
分组查询
语法:group by 分组字段 [having 筛选条件] 注意:分组查询根据分组字段的不同值划分成不同的组别,然后在进行聚合运算,查询结果中需要加入分组字段 -- 统计男女同学的人数 select sex, count(*) from student group by sex 聚合函数: max():最大值 min():最小值 count():计数 sum():求和 avg():平均值 -- 统计男女同学的人数。只显示2人以上的记录 select sex, count(*) from student group by sex having count(*)>=2 -- 查询2010年以后出生的学生,根据性别分组,显示不同组别总分在150分以上的记录 select sex 性别,sum(socre) 总分 from student where birthday>="2010/1/1" group by sex having sum(socre)>=150 -- 统计班级中男女同学的人数 select sex as 性别,count(*) from student group by sex 分组后数据的筛选 having:分组之后要显示符合要求的数据,使用having做二次过滤。 having 与 where的区别 1.where:一次过滤,对表中所有的数据进行初步过滤,被过滤掉的数据无法参加排序、分页、分组等操作。 2.having:数据分组并且统计之后进行二次过滤,对不符合结果要求的聚合函数结果进行过滤筛选。 -- 按照不同的课程分组,分别算出其平均分、最高分和最低分,对于低于60分平均分的不予显示 --低配版 select subjectNo,avg(studentresult),max(studentresult),min(studentresult) from result group by subjectNo having avg(studentresult)>=60
![]()
连接查询
语法:select 子句 from 表名1 [inner|left|right|cross]join 表名2 on 连接表达式 where 查询条件
分类
连接类型 连接关键字 说明 内连接 inner join 显示两表中相匹配的记录 左外连接 left join 显示左表中的所有记录,右表中没有与之匹配的记录使用null填充 右外连接 right join 显示右表中的所有记录,左表中没有与之匹配的记录使用null填充 交叉连接|全连接 cross join 显示两表所有的记录,记录数为两表记录数的乘积。(笛卡尔效应) 内连接
-- 查询参加考试的同学信息及分数信息 select * from student inner join score on student.studentid=score.studentid
左外连接
-- 查询参加考试的同学信息及分数信息 select * from student left join score on student.studentid=score.studentid
右外联接
-- 查询所有的考试信息及对应的学生信息 select * from student right join score on student.studentid=score.studentid
交叉连接|全连接(笛卡尔效应)
-- 不指定两表的关联关系,查询结果为两表记录数的乘积,cross可以省略 -- 无任何实际意义 select * from student cross join score
嵌套查询|子查询
说明:将内部查询的结果作为外部查询的条件使用
分类:
比较运算符子查询:当能确切知道子查询返回的是一个固定值时,可以使用比较运算符进行比较。
in 子查询:in 子查询的结果是一个集合,而不是一个单一的值。
exists子查询:用来判断子查询的结果是否为空
any或all子查询:子查询返回单一值时,可以用比较运算符子查询,返回多个值时,可以使用any或all查询。
-- 查询张三的所有科目的成绩信息 -- 1.查询张三的学号 select studentid from student where name="张三" -- 2.查询成绩信息 select * from score where studentid=1 -- 子查询 select * from score where studentid in (select studentid from student where name="张三")
DML语句—数据操作语言
用于操作数据库对象所包含的数据
-
insert into(插入数据)
语法:insert into 表名(字段名1,字段名2…)values(值1,值2)
-
如果插入的是全字段,values前的字段名可省略,添加值需按照表结构顺序添加
-
插入多条语句时,values后边使用英文逗号分隔开
-- 全字段插入 insert into student(studentid,name,sex,address,birthday) values(9,"张无忌",'男',"光明顶","1967-12-21 12:12:12"); -- 全字段乱序插入 insert into student(birthday,sex,studentid,name,address) values("1900-1-1 10:10:10",'女',10,"周芷若","峨眉山") -- 插入全字段数据,可以省略字段名 insert into student values(12,"张三丰","男","武当山","1900-1-1"); -- 插入部分字段(字段名必须要指定) insert into student(studentid,name,sex,address) values(11,"谢逊",'男',"恶人岛") -- 一次插入多条记录 insert into student values (13,"赵敏",'女','蒙古',"1954-12-1"), (14,"金花婆婆",'女',"恶人岛","1900-1-14"), (15,"灭绝师太",'女',"峨眉山","1900-1-2")
-
-
insert…set
语法:insert into 表名 set 字段名1=值1,字段名2=值2…
insert into student set studentid=16,name="宋青山",sex='男',address="武当山",birthday="1923-12-1"
-
insert…select
功能:从一个表中复制信息带另一个表中。
语法:insert into 目标表名(字段名) select 字段名 from 源数据表 where 条件
-- 根据student表结构创建studenttemp表 create table studenttemp like student -- 将student表中所有的女性记录的学号,姓名,性别插入到studenttemp新表中 insert into studenttemp(studentid,name,sex) select studentid,name,sex from student where sex="女"
练习
-
--创建年级表 create table grade( GradeID int(11) not null, GradeName varchar(50) not null )
--年级表插入数据 insert into grade(GradeName) values ("大一"),("大二"),("大三"),("大四")
-
--新建学生信息表 create table student( StudentNo int(11) not null, StudentName varchar(50) not null, Sex char(2), GradeID int(11), Phone varchar(11), Address varchar(255), Email varchar(50), IdCard varchar(18) )
--向学生表中插入数据 insert into student (StudentNo,StudentName,Sex,GradeId,Phone,Address,Email,IdCard) values (1011,"郭靖",'男',1,"13500000001","北京海淀区中关村大街1号","guojing@bdqn.cn","4502319861111000") --不指定字段,同时插入两条数据 insert into student VALUES (1012,"李文才",'男',2,"13500000002","河南洛阳","liwencai@bdqn.com","450323198112311000"), (1013,"李梅",'女',3,"13500000015","上海卢湾区","limei@bdqn.com","450323198612311000")
-
--新建科目表 create table subject( SubjectNo int(11) not null, SubjectName varchar(50), ClassHour int(10), GradeID int(11) )
--向科目表中插入数据 insert into subject values (1,"高等数学-1",120,1), (2,"高等数学-2",110,2), (3,"高等数学-3",100,3), (4,"高等数学-4",130,4)
-
update(修改数据)
语法:update 表名 set 字段名 = 值 where 修改条件 示例:--将李梅班级编号修改为3 update student set GradeID = 3 where StudentName = "李梅"
修改条件
修改多个字段需要将不同字段间使用英文逗号隔开 语法:update 表名 set 字段名1 = 值1,字段名2 = 值2... where 修改条件 --修改学号(StudentNo)为1013的学生记录 --邮箱修改为student1013@bdqn.cn --班级编号(GradeID)修改为1 update student set Email = "student1013@bdqn.cn",GradeID = 1 where StudentNo = 1013 在原值基础上进行修改,赋值需要使用字段名来表示原值 --将数据表subject中ClassHour大于110的课时都减少10 update subject set ClassHour = ClassHour-10 where ClassHour>100 --多个修改条件使用关键字and --将学生信息表中二班的男同学邮箱统一修改为"grade2@bdqn.cn" update student set Email="grade2@bdqn.cn"where sex='男'and GradeID = 2 --将学生信息表中班级编号为3的或者性别为女的同学地址信息修改为"河南驻马店" update student set Address = "河南驻马店" where GradeID=3 or sex='女' --范围修改 update student set Address = "河北张家口" where StudentNo between 1011 and 1013 --平替版本 update student set Address = "河北石家庄" where StudentNo >=1011 and StudentNo<=1013 练习: --将学生信息表中编号为1012的同学性别改为‘女’ update student set sex='女' where StudentNo=1012 --将学生信息表中班级编号为3或学号为1011的同学地址改为”山西太原“ update student set address="山西太原" where GradeID=3 or StudentNo=1011
-
delete(删除数据)
语法:delete from 表名 where 删除条件 --删除"李文才"的个人信息 delete from student where studentName="李文才"
-
truncate(清空表数据)
语法:truncate 表名 --删除课程表所有数据 truncate subject
-
二者之间的联系与区别
- 都能删除数据、不删除表结构,但TRUNCATE 速度更快
- 使用TRUNCATE TABLE重新设置AUTO_INCREMENT计数器
- 使用TRUNCATE TABLE不会对事务有影响
- delete删除记录会在日志中记录,truncate不会再日志中记录删除的内容
索引
概念:索引又称为键(key),是存储引擎用于快速查找记录的一种数据结构,类似于书本中的目录。所有的数据类型都支持创建索引。
分类1:
主键索引(primary key)
每张表中只能包含一个逐渐索引,建立逐渐索引的字段不允许为空,不能重复。InnoDB存储引擎中数据的保存顺序与主键索引的顺序一致。也称为聚族索引。
辅助索引
性能略低于主键索引,但是查询优化使用频率更高。
索引名称 说明 普通索引 普通索引是mysql中的基本索引,允许字段的值重复 唯一索引 字段值不能重复,允许有且只有一个空值 全文索引 全文索引查找的是文本中的关键词,而不是直接比较索引中的值,全文索引可以在char、varchar或text类型的列上创建。 空间索引 空间索引是定义在空间数据类型上的索引,且索引字段不能为空。 分类2:
- 单列索引:在表中单字段上创建索引。
- 复合索引:在表的多个字段上创建一个索引,查询时查询条件中包含左边字段时,索引才可生效。
创建索引
数据表已存在创建索引
create [unique|fulltext|spatial] index 索引名 on 表名(字段名(长度) [asc|desc]) unique:指定索引类型为唯一索引 fulltext:指定索引类型为全文索引 spatial:指定索引类型为空间索引 索引名:索引的名称,保持唯一 字段名:创建索引的字段 -- 为student表中的name字段创建普通索引 create index stu_name on student(name) -- 为student表中studentid创建唯一索引,并指定为降序 create unique index student_No on student(studentid desc)
创建表的同时创建索引
create table 表名( 字段名1 数据类型, ..., [unique|fulltext|spatial] index|key 索引名(字段名[长度][asc|desc])[visible|invisible] ); visible:标识索引的可见性 invisible:不可见索引 -- 创建test表,并指定name为唯一索引,address为全文索引 create table test( id int, name varchar(50), age int, address VARCHAR(50), unique key test_name(name asc), fulltext index test_address(address desc) )
修改表方式添加索引
alter table 表名 add [unique|fulltext|spatial] [index|key] 索引名(字段名[长度] [asc|desc]) -- 为student表中的address字段添加全文索引,指定长度为5,排序方式为升序 alter table student add fulltext index stu_add(address(5) asc)
删除索引
alter table 表名 drop index 索引名; drop index 索引名 on 表名; -- 删除创建好的索引 alter table test drop index test_name; alter table test drop index test_address; drop index stu_name on student drop index stu_name_sex on student drop index stu_add on student
查看表中创建的索引
show index from 表名
视图
概念:从一张表或多张表中导出的数据库对象。数据库中只存储视图的定义,并没有实际数据,所以视图是一个基于基础表导出的虚拟表。视图可以像基础表一样进行增删改查操作。
优点:
- 简单性,视图可以将多个表集中在一起,简化了用户堆数据的查询操作。
- 安全性,通过视图可以更方便的进行权限控制。
- 逻辑数据独立性:屏蔽基本表结构变化带来的影响。
创建视图
create view 视图名 [(字段名1,字段名2...)] as select [(字段名1,字段名2...)] from 表名; -- 视图的命名规则通常加“view_”作为前缀,目的是为了区分视图与基本表 -- 将学生表中所有的女生信息建立视图 create view view_student(name,sex,address) as select name,sex,address from student where sex='女' -- 创建一个视图,包含所有参加考试的学生以及分数信息 create view view_student_score(姓名,性别,地址,出生日期,科目,分数) as select student.name,student.sex,student.address,student.birthday,score.classid,score.score from student right join score on student.studentId=score.studentid
使用试图
查看视图基本信息
show table status like '视图名' show table status like 'view_student_score'
查看视图的结构信息
desc 视图名 describe 视图名 desc view_student
查看视图的定义文本
show create view 视图名 show create view view_student_score;
视图查询
select * from view_student_score where 性别='男'
视图修改数据
update 视图名 set 字段名=值 where 修改条件 update view_student_score set 姓名="刘能" where 姓名="刘莎"
使用视图插入记录
insert into 视图名(字段列表) values(值列表) -- 单表视图可以插入,插入后的记录不一定会在视图显示 insert into view_student(name,sex,address) values("谢广坤",'男',"象牙山")
视图删除记录
delete from 视图名 where 删除条件 delete from view_student where name="金花婆婆" -- 删除0条记录,因为视图中没有谢广坤这条记录 delete from view_student where name="谢广坤"
修改视图
alter view 视图名(字段列表) as select 语句 alter view view_student(编号,姓名,性别,地址,出生日期)as select studentid,name,sex,address,birthday from student
删除视图
drop view 视图名 drop view view_student_score
触发器(trigger)
概念:触发器的执行不是由程序调用的,而是由事件触发的。
相关事件:insert、delete、update
作用:
- 可以在写入数据之前,强制检验或者转换数据。
- 触发器发生错误时,异动的结果会被撤销。
- 部分数据库管理系统可以使用DDL触发器
- 可依照特定情况,替换移动的指令(insetad of)
优点:
- 自动执行
- 级联更新
- 强化约束
- 跟踪变化
- 强制业务逻辑
缺点:
- 如果出发频率高,占用内容,降低访问速率
- 相对不灵活,一旦出发,马上执行,不能排除特殊情况
- 过度使用也会造成数据库的维护困难
触发器使用原则:
- 只能正对表级别事件,不能针对行级别事件
- 不能嵌套使用
- 执行语句是原子性的,只包含一条独立sql
- 触发器不能针对绑定的表进行修改操作,否则会导致死循环
- 执行效率低,避免使用过多的触发器
创建触发器
触发器四要素:
- 触发地点(table):触发器对那个表生效
- 触发事件(insert/delete/update):对表进行什么操作时触发
- 触发时间(after/before):在表执行相应的操作前还是后触发
- 触发程序体(begin…end):触发之后执行的操作
语法:
create trigger 触发器名 [before|after] [insert|delete|update] on 表名 for each row 触发主体 -- for each row:表示表中的每一行记录都要激活触发器 -- 每个表中最多支持6种触发器,每一个事件只能有一个触发器
案例:
-- create trigger 触发器名 [before|after] [insert|delete|update] on 表名 for each row 触发主体 -- 新增记录时如果性别一栏输入的不是男或女,将性别设置为默认值男 create trigger stu_beforeinsert before insert on student for each row begin if new.sex !='男' or new.sex!='女' then set new.sex='男'; end if; END insert into student values(100,"测试",'你',"张家口","2020-01-01") -- 学生表中修改学号,成绩表中自动更新学号 create trigger stu_alterupdate after update on student for each row begin update score set studentid=new.studentid; end update student set studentid=99 where name="张无忌"
查看当前数据库种所有的触发器
show triggers
查看当前数据库的某个触发器
show create trigger 触发器名
查看triggers数据表种的触发信息
select * from information_schema.triggers
删除触发器
drop trigger 触发器名
事件(event_scheduler)
概念:可以在mysql系统中自动完成一些定时任务,时间可以精确的每秒。
优点:对数据定时性操作不再依赖外部程序,而是直接使用数据库本身提供的功能们可以每秒执行一个任务,对实时性要求较高的环境非常实用。
缺点:定时触发,不可以调用。
查询事件调度状态
show variables like 'event_scheduler'; select @@event_scheduler; show processlist;
开关事件调度
-- 开启事件调度(临时,系统重启失效) set global event_scheduler = on; set @@global.event_scheduler = on; set global event_scheduler = 1; set @@global.event_scheduler = 1; -- 关闭事件调度(临时) set global event_scheduler = off; set @@global.event_scheduler = off; set global event_scheduler = 0; set @@global.event_scheduler = 0; -- 永久性配置需打开mysql配置文件mydefault.ini event_scheduler = 1 event_scheduler = 0
创建事件
create event 事件名称 on schedule [时间表] [on completion preserve] [enable|disable] [comment 'comment'] do 事件主体; end -- 时间表:at时间戳,用来完成单次计划任务,timestamp,datetime -- every用来完成重复性的计划任务,year,month,day,hour,minute,second -- on completion preserve表示事件结束之后不会删除事件内容 -- enable:创建完成后立即执行 disable:创建完成后不会立刻执行 -- 创建事件,在特定时间新增一条记录 create event insert_student on schedule at '2025-04-21 16:00:00' -- 指定在特定时间执行一次该事件 on completion preserve -- 指定事件完成后保存记录 enable -- 设置事件为启用状态 do -- 事件主体 insert into student values(101,"王大翠",'男',"怀安县","2000-06-22 14:44:54"); end
查询事件
-- 查询系统中所有的事件 show events -- 查询特定事件的详情 show create event 事件名
启动与关闭事件
-- 启动事件 alter event 事件名 enable -- 关闭事件 alter event 事件名 disable
修改事件
-- 语法 alter event 事件名 on schedule [时间表] [on completion preserve] [enable|disable] [comment 'comment'] do 事件主体; end
删除事件
-- 语法 drop event 事件名
存储过程
**概念:**一组完成特定功能的SQL集合,存储过程类似于C#程序中的子程序
特点:
- 封装性
- 执行效率高
- 可重用性
- 功能强大
作用:
- 通过把处理封装在容易使用的单元中,简单复杂的操作。
- 简化对变动的管理
- 有助于提高应用程序的性能
- 有助于减少该应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的SQL语句,而只用发送存储过程的名称和参数。
- 可增强SQL语句的功能和灵活性,使MYSQL能完成复杂的判断和较复杂的运算
- 可提高数据库的安全性和数据的完整性。
创建存储过程
create procedure 过程名([in|out|inout]参数名 数据类型) begin 过程体 end in:输入参数,表示调用者向过程中传入值 out:输出参数,表示过程向调用者传出值 inout:既可以输入也可以输出
流程控制语句
if语句
if 判断条件1 then 过程体1 elseif 判断条件2 then 过程体2 ... else 过程体n end if -- 示例 CREATE PROCEDURE `demo1`() BEGIN declare val int default 0; -- 定义val遍历 if val is null -- 判断val是否为空 then select 'val is null'; else select 'val is not null'; end if; END
case语句
case 表达式 when 值1 then 语句1; when 值2 then 语句2; else 语句n; end case; -- 示例: CREATE DEFINER=`root`@`localhost` PROCEDURE `demo2`() BEGIN declare val int default 2; -- 定义val遍历 case val when 1 then select 'val=1'; when 2 then select 'val=2'; else select 'val=null'; end case; END
case语句2
case when 判断条件1 then 语句1; when 判断条件2 then 语句2; else 语句n; end case; -- 示例: CREATE DEFINER=`root`@`localhost` PROCEDURE `demo2`() BEGIN declare val int default 2; -- 定义val遍历 case when val =1 then select 'val=1'; when val =2 then select 'val=2'; else select 'val=null'; end case; END
loop语句与leave语句—死循环和中止循环操作
-- 语法: [loop_label:]loop 循环操作 end loop [loop_label] --loop_label:表示loop语句的标注名称,可省略 -- 示例 CREATE DEFINER=`root`@`localhost` PROCEDURE `demo02`() begin -- 定义变量 declare id int default 0; add_loop:loop set id=id+1; select id; if id>=10 then leave add_loop; end if; end loop add_loop; end
iterate语句–跳出循环
定义:用于将执行顺序转到语句段的开头处。 iterate lable; -- 示例:p1的初始值为0,如果p1的值小于10时,重复执行p1加1的操作,当p1大于或者等于10,并且小于20时,打印消息p1 between 10 and 20,当p1大于20时,退出循环。 CREATE DEFINER=`root`@`localhost` PROCEDURE `demo02`() begin -- 定义变量 declare p1 int default 0; my_loop: loop set p1 = p1+1; if p1<10 then iterate my_loop; elseif p1>20 then leave my_loop; end if; select 'p1 between 10 and 20'; end loop my_loop; end
repeat语句(先执行后判断)
-- 语法: [reapt_lable:] repeat 循环操作 until 循环判断 end repeat -- 示例:循环执行id自增,直到id值大于等于10 CREATE DEFINER=`root`@`localhost` PROCEDURE `demo02`() begin -- 定义变量 declare id int default 0; repeat set id = id +1; select id; until id>=10 -- 条件为真结束循环 end repeat; end
while语句
-- 语法: [while_lable] while 循环条件 do 循环操作 end while [while_lable] -- 创建一个变量i,初始值为0,当i的值小于10时重复执行加1 CREATE DEFINER=`root`@`localhost` PROCEDURE `demo02`() begin -- 定义变量 declare i int default 0; while i<10 do set i=i+1; end while; select i; end
调用存储过程
call 存储过程名称(实参列表) -- 创建与调用存储过程传入参数示例 -- 在调用时能够通过传入参数id删除成绩表中该学生的成绩, -- 查询成绩中的最高分, -- 通过传入参数p_gra查询高于该值的成绩总数并通过p_gra输出。 create procedure param_pro(in id int,out max int,inout p_gra int) begin delete from score where studentid=id; select max(score) from score into max; select count(*) into p_gra from score where score>P_gra; end -- 创建变量保存分数 set @p_gra = 80; call param_pro(5,@max,@p_gra); -- 打印输出参数 select @max,@p_gra;
修改存储过程
alter procedure 过程名[需改规则] -- 修改规则 -- contains sql:子程序包含sql语句,但是不包含读或写数据的语句。 -- no sql:子程序不好含读数据的语句。 -- reads sql data:子程序包含读数据的语句。 -- modifies sql data:子程序包含写数据的语句。 -- sql security {definer|invoker}:知名谁有权限执行 -- definer:只有定义者自己才能执行 -- invoker:调用者可以执行 -- comment '注释内容' -- 示例:将存储过程param_pro的读写权限改为modifies sql data,并指定调用者可以执行。 alter procedure param_pro modifies sql data sql security invoker;
查看存储过程
-- 1.显示存储过程 show procedure status; -- 2.显示特定数据库的存储过程 show procedure status where db="数据库名"; show procedure status where db="23青鸟"; -- 3.显示特定模式的存储过程,要求显示名称中包含某字符的存储过程 show procedure status where name like 通配符表达式; show procedure status where name like "d%"; -- 4.显示存储过程的源码 show create procedure 存储过程名; show create procedure param_pro;
删除存储过程
drop procedure 存储过程名; drop procedure demo1;
存储函数(自定义函数)
概念:存储函数与mysql自定义函数具有相同性质。
创建存储函数
create function 函数名(参数名 数据类型) returns 返回类型 begin 函数核心代码 end -- 参数类型只支持in类型 -- returns子句声明返回值类型只能在存储函数中使用,一个存储函数必须包含一个returns语句。 -- 不带参数 -- 创建一个存储函数,参数定义为空,该函数查询学号为“100”的学生地址 create function demo02() returns varchar(255) begin return(select address from student where studentid=15); END -- 调用 select demo01(); -- ============================================================================ -- 带参数 -- 创建一个自定义函数,传入年龄age,查询相应年龄大于的学生数量并返回数据类型为整型。 create function demo03(age int) returns int begin return(select count(*) from student where (year(now())-year(birthday))>age); END -- 调用 select demo03(18);
调用存储函数
select 函数名(参数)
查看存储函数
-- 1.查看存储函数的状态 show function status; -- 2.查看存储函数的定义 show create function 函数名; -- 3.从系统库中查看存储函数信息 select * from information_schema.Routines where routine_name='函数名'
修改存储函数
alter function 函数名 修改规则 -- 修改规则 -- contains sql:子程序包含sql语句,但是不包含读或写数据的语句。 -- no sql:子程序不好含读数据的语句。 -- reads sql data:子程序包含读数据的语句。 -- modifies sql data:子程序包含写数据的语句。 -- sql security {definer|invoker}:知名谁有权限执行 -- definer:只有定义者自己才能执行 -- invoker:调用者可以执行 -- comment '注释内容'
删除存储函数
drop function 函数名
数据库设计
需求分析
数据需求分析
功能需求分析
性能需求分析
其他需求
数据字典
- 数据项
- 数据结构
- 数据流
- 数据存储
- 处理过程
概念结构设计
逻辑结构设计(ER图)
关系模式存取方法选择
- 索引存取方法:提高单条记录查询速度,维护困难。
- 聚簇存取方法:对单个属性或属性组查询速度较快。
数据库实施
- 定义数据库结构
- 组织数据入库
- 应用程序编码与调试
- 数据库试运行
数据库运行维护
- 数据库的转储和恢复
- 数据库安全性和完整性的控制
- 数据库的性能检测及分析改进
- 数据库的重组和重构
关系模式的规范化
范式的级别:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)、BC范式
第一范式的目标是确保每列的原子性
第二范式要求每个表只描述一件事情
![]()
如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)
![]()
数据库安全
数据库的不安全因素
- 非授权用户对数据库的恶意存取和破坏。
- 数据库中重要或敏感的数据被泄露。
- 安全环境的脆弱性。
数据库安全性级别
- 环境级
- 用户级
- 操作系统级
- 网络级
- 数据库系统级
用户管理
查看用户
use mysql -- 打开系统数据库 select host,user,authentication_string from user; -- 查看用户列表
创建用户
-- create语句 create user "用户名"@"主机名"[identified by [password]"密码"] -- 主机名可以省略,如果省略则默认表示是对所有主机开放权限。 -- identified by:用来设置用户密码,可以省略。 -- password:用户登陆时的密码。 create user 'admin'@'localhost' identified by 'admin123' -- 创建用户名为:admin -- 密码为:admin123 -- grant语句 grant 权限类型 on 数据库名.表名 to 用户[dientified by [password]"密码"] grant select on 23青鸟.* to 'user2'@'localhost' IDENTIFIED by '123456' -- insert语句 insert into mysql.user(host,user,anthentication_string,ssl_type,ssl_cipher,x509_issuer,x509_subject)values(); insert into mysql.user(host,user,authentication_string,ssl_type,ssl_cipher,x509_issuer,x509_subject)values("127.0.0.1","user3",password('123456'),"","","",""); flush privileges -- 将新账户加载至系统中
修改用户
-- 修改用户名语法: rename user '旧用户名' to '新用户名'@'新主机地址' -- 修改用户user1的名称为‘test1’,主机地址修改为本机 rename user 'user1'@'%' to 'test1'@'localhost'
修改密码
-- 修改用户密码1 mysqladmin -u 用户名 [-h 主机名] -p password 新密码 -- 将用户名test1的密码修改为123456 mysqladmin -uroot -p password root123 -- 确认密码:输入旧密码 -- 修改用户密码2----必须使用root账户登录mysql set password for '用户名'@'主机名'=PASSWORD('新密码') -- 将root账户密码修改为123456 set password for 'root'@'localhost' = PASSWORD('123456') -- 修改用户密码3-----update update mysql.user set authentication_string = PASSWORD('新密码') where user='用户名' and host='主机名' -- 修改test1用户密码为test123 update mysql.user set authentication_string=PASSWORD('test1') where user='test123' and host='localhost' flush privileges -- 刷新
删除用户
-- 使用drop user语句删除用户 drop user '用户名'@'主机名' -- 删除 user2用户 drop user 'user2'@'localhost' -- 使用delete语句删除用户 delete from mysql.user where user='用户名' and host='主机名' -- 删除用户名为user3,主机地址为192.168.35.250的账户 delete from mysql.user where user='user3' and host='192.168.5.250'
权限管理
权限管理层级
- 全局层面:使用on * . *语法授予权限,所有库及所有表
- 数据库层面:使用on 数据库名.*授予权限,指定库内的所有表
- 表层面:使用on 数据库名.表名 语法授权,指定库内的指定表
- 列层级:使用select(列1,列2…)、insert(列1,列2)和update(列1,列2)语法授予权限
- 存储过程,函数级:使用execute on procedure 或 execute on function 语法赋予权限
mysql常见的权限
权限名称 权限范围 all、all privileges 所有权限 select 查询 insert 插入 update 修改 delete 删除 alter 修改表 drop 删除数据库/表 create 创建数据库、表 grant option 数据库,表,存储过程,函数 references 数据库或表 create view 创建视图 show view 查看视图 alter routine 修改存储过程或存储函数 create rotine 创建村塾过程或存储函数 execute 执行存储过程或存储函数 file 加载服务器主机上的文件 create user 创建用户 super 超级权限 使用grant语句分配权限
grant 权限类型 on 数据库名.表 to '用户名'@'主机地址' -- 为test1账户授予23青鸟库中所有表的select、insert、update、delete权限 grant select,insert,update,delete on 23青鸟.* to 'test1'@'localhost'
查看账户权限
show grants for '用户名'@'主机名' -- 查看test1账户权限 show grants for 'test1'@'localhost'
回收权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名' -- 将test1账户中delete权限做回收 revoke delete on 23青鸟.* from 'test1'@'localhost' -- 将test1账户所有权限收回 revoke all privileges on 23青鸟.* from 'test1'@'localhost'
角色管理
创建角色
create role '角色1','角色2'... -- 创建开发、测试、生产角色 create role 'dev','test','pro'
授予角色权限
grant 权限列表 on 数据库名.表名 to 角色 -- 给测试角色添加insert,select权限 grant select,insert on 23青鸟.* to test
查看角色权限
show grants for 角色 -- 查看test角色的权限 show grants for test
回收角色权限
revoke 权限列表 on 数据库名.表名 from 角色 -- 将test角色的insert权限做回收 revoke insert on 23青鸟.* from test
5. 为用户分配角色
grant 角色名 to 用户名 -- 将test1账户设置为测试角色 grant test to test1
数据库的备份与恢复
数据库故障
- 事务故障:运算溢出、并发事务死锁
- 系统故障:硬件故障、操作系统故障、数据库管理系统代码错误、突然停电
- 介质故障:磁盘损坏、磁头碰撞、瞬时强磁场干扰
- 计算机病毒:蠕虫病毒
数据库恢复技术
- 数据备份
- 登记日志文件
数据库备份的分类
备份时服务器是否在线
- 热备份:数据库正在运行状态进行备份
- 温备份:数据库正常运行,数据只能读不能写
- 冷备份:数据库处于关闭状态。
按备份内容分类
- 物理备份:直接复制数据库文件进行备份。速度快,占用空间大
- 逻辑备份:从数据库中提取数据并将结果写到一个文件中,该文件格式与源数据库文件格式不同。
按备份涉及的数据范围来划分
- 完整备份:备份整个数据库
- 增量备份:对数据库从上一次完整备份或最近一次增量备份以来改变的内容进行备份
- 差异备份:对最近一次完整备份后发生改变的数据进行备份
数据库备份时机
- 创建数据库或为数据库填充数据
- 创建索引
- 清理事务日志
- 执行无日志操作
备份一个完整的数据库
mysqldump -u用户名 -h主机名 -p密码 [--databases] 数据库名 >备份文件.sql -- 将123数据库进行备份 mysqldump -uroot -hlocalhost -p123456 123>D:\mysqldump\123.sql
备份多个数据库
mysqldump -u用户名 -h主机名 -p --databases 数据库1 数据库2... >备份文件.sql -- 将123数据库与mysql数据库进行备份 mysqldump -uroot -hlocalhost -p --databases 123 mysql >D:\mysqldump\mysql2.sql
备份所有数据库
mysqldump -u用户名 -h主机名 -p --all-databases >备份文件.sql -- 将本地连接下的所有数据库备份 mysqldump -uroot -hlocalhost -p --all-databases >D:\mysqldump\alldb.sql
备份数据库中的一个或多个表
mysqldump -u用户名 -h主机名 -p 数据库名 表名1 表名2... >备份文件.sql -- 将mysql数据库中user表备份 mysqldump -uroot -hlocalhost -p mysql user >D:\mysqldump\user.sql
数据库的恢复
mysql命令还原数据
mysql -u用户名 -p [数据库名]<备份文件.sql -- 创建新数据库mysqldump,将123.sql备份文件恢复至mysqldump数据库中 create database mysqldump -- 登录数据库之后执行 mysql -uroot -p mysqldump < D:\mysqldump\123.sql
source命令还原数据
-- 必须再mysql命令行中执行 use 数据库名 source 备份文件.sql -- 创建数据库MySQLdump2,将123.sql恢复至该数据库中 create database mysqldump2 use mysqldump2 source D: \mysqldump\123.sql
=====以下不是教材配套笔记
DQL查询语句
-
简单查询
语法:select 查询项1,查询项2... from 表名 --查询学生信息表中所有学生的姓名和性别 select StudentName,sex from student --查询学生信息表中的所有字段 --*代表数据表中所有字段 select * from student --练习 --1.查询课程表中所有的课程名称 select subjectname from subject --2.查询学生基本信息表中学生姓名及家庭住址 select studentname,address from student --3.查询成绩表中所有信息 select * from result --4.查询年级表中所有年级编号与其对应的课程编号 select gradeid,subjectno from grade
-
条件查询
语法:select 查询项1,查询项n... from 表名 where 查询条件 查询条件:=、>、<、>=、<=、!=、<> --查询学生基本信息表中所有男同学的姓名 select studentname from student where sex='男' --查询所有女同学的姓名 select studentname from student where sex!='男' select studentname from student where sex='女'
-
多表多字段查询
--同时查询不同表中的不同字段 语法:select 表1.字段名1,表2.字段名2 from 表1,表2 --查询学生信息表中所有同学的姓名和成绩表中所有的成绩 select student.StudentName,result.StudentResult from student,result
-
字段别名
--假设两个表中存在相同字段? --查询学生信息表中所有同学的编号和成绩表中所有的学生编号 select student.StudentNo,result.StudentNo from student,result --起别名(起外号)as --as可省略不写 select student.studentNo as "学生表编号",result.StudentNo as "成绩表编号" from student,result select studentname as "姓名" from student --练习 1.查询学生信息表中的地址和科目表中的课程名称。 select student.address,subject.subjectName from student,subject 2.查询年级表中年纪编号 显示标题为年纪表,科目表中年级编号 显示标题为科目表。 select grade.GradeID as "年纪表",subject.GradeID as "科目表" from grade,subject
-
去除重复数据
--distinct:去除查询结构中重复出现的数据,只显示一条有效数据 --查询学生信息表中学生的家庭住址信息 select address from student --有重复记录 --查询学生信息表中学生的家庭住址信息 select distinct address from student --无重复记录
-
查询表达式
select version() as "版本号" select classhour+10 as "最新课时" from subject
-
复习
SQL--结构化查询语言 DDl--数据定义语言 1.库 create database 数据库名 --新建库 alter database 数据库名 --修改库 drop database 数据库名 --删除库 2.表 create table 表名(字段名 数据类型(长度) 字段属性 默认值 注释) --新建表 alter table --修改表 a.新增字段 alter table 表名 add 新增字段名 b.修改字段 alter table 表名 alter c.字段重命名 alter table 表名 rename d.删除字段 alter table 表名 drop drop table 表名 DCL--数据操作语言 1.新增 insert into 表名(字段列表) values(值) 2.修改 update 表名 set 字段名=值 where 修改条件 3.删除 delete from 表名 where 删除条件 DQL--数据查询语言 1.基础查询 select 查询字段名 from 表名 2.查询字段起别名 select 字段名 as 别名 from 表名 select 字段名 别名 from 表名 3.查询全字段 select * from 表名 4.查询条件 select * from 表名 where 查询条件 5.跨表查询 select 字段名 from 表1,表2 6.查询结果去除重复项 select distinct 字段名 from 表名 where 查询条件 create table result( resultid int(11), studentNo int(11), subjectNo int(11), score float ) --条件查询 select * from result --查看分数在70~90之间的数据 select * from result where StudentResult>=70 and StudentResult<=90 select * from result where StudentResult between 70 and 90 --条件查询中的条件可以使用逻辑运算符和比较运算符 --逻辑运算符 --与(and):运算符左右两侧都有表达式,需要二者同时满足 --查询性别为女,并且为二年级的学生信息 select * from student where sex="女" and GradeID=2 --或(or):运算符左右两侧都有表达式,需要二者满足一个即可 --查询二年级或者家庭住址在河北张家口的同学信息 select * from student where GradeID=2 or Address="河北张家口" --非 (not):将表达式结果反转 查询不及格的成绩数据 select * from result where not StudentResult>=60
-
逻辑运算符
--逻辑运算符 --与(and):运算符左右两侧都有表达式,需要二者同时满足 1.逻辑与(查询)性别为男和家庭住址在山西太原的同学信息 select * from student where sex='男' and address='山西太原' select * from student where sex='男' && address='山西太原' --或(or):运算符左右两侧都有表达式,需要二者满足一个即可 2.逻辑或(查询性别为男或家庭住址在河北张家口的同学信息) select * from student where sex='男' or address='河北张家口' select * from student where sex='男' || address='河北张家口' --非 (not):将表达式结果反转 3.逻辑非 查询年级编号不为2的同学信息 select * from student where not gradeid = 2 select * from student where gradeid != 2
-
关系运算符
--比较(关系)运算符(< > <= >= = !=) --is null:判断字段是否为空 --查询性别字段为空的学生姓名 select studentname as 姓名 from student where sex is null --is not null:判断字段是否不为空 --查询联系方式不为空的学生姓名和性别 select studentname 姓名,sex 姓别 from student where phone is not null
-
区间查询
--between...and...(区间查询) --等价于>= and <= --查询 学生编号在1014~1017之间的同学信息 select * from student where studentno between 1014 and 1017 --等价于 select * from student where studentno >=1014 and studentno <=1017
-
模糊查询
--like(模糊查询) --_ 表示一个任意字符 --% 表示任意个任意字符 --查询班级中姓李的同学 select * from student where studentname like "李%" --查询班级中姓李的,姓名是两个字同学 select * from student where studentname like "李_" --查询班级中名字中带晓的同学信息 %晓% select * from student where studentname like "%晓%" --姓名结尾是伟字的同学信息 select * from student where studentname like "%伟" --查询家庭住址在山西的同学信息 select * from student where address like "%张家口%" --查询所有姓李的三字姓名的同学信息 select * from student where studentname like "李__"
-
范围查询
--in(范围查询) --查询学生编号为1017,1019,1025,1005学生信息 --传统方式 select * from student where studentno=1017 or studentno=1019 or studentno=1011 or studentno=1015 --改良 select * from student where studentno in (1017,1019,1011,1015)
-
练习
--1.查询姓李或者性别为女的同学信息 select * from student where studentname like "李%" or sex='女' 2.查询姓张的女同学 select * from student where studentname like "张%" and sex='女' 3.查询成绩表中成绩在70~90之间的成绩记录 select * from result where studentresult between 70 and 90 4.查询课程表号为1,3,4的课程课时信息 select classhour 课时 from subject where subjectNo in(1,3,4) 5.查询姓名中伟字结尾的同学信息 select * from student where studentname like "%伟"
-
表连接查询
表连接查询 1.内连接:两表之间关联字段能匹配上的数据会被查询到 inner join --查询所有学生基本信息 select * from student --查询学生基本信息及其年级信息 select * from student inner join grade on student.gradeid=grade.gradeid --查询课程信息以及学生每门课的成绩 select * from subject inner join result on subject.subjectNo = result.subjectNo 2.外连接 1.左外联----left join --将左表所有的数据都查询出来,右表中显示与左表相匹配的数据,匹配不到的数据使用null做填充 --主表即为左表 select * from student left join grade on student.gradeid=grade.GradeID 2.右外联----right join --将右表所有的数据都查询出来,左表中显示与右表相匹配的数据,匹配不到的数据使用null做填充 select * from student right join grade on student.gradeid=grade.GradeID 3.全连接(笛卡尔效应) --查询结果为左表总条数*右表总条数 select * from student join grade
练习
-
排序
语法: select 查询项 from 表名 where 查询条件 order by 排序字段 [排序规则] 排序规则:asc(升序,默认) desc(降序) --查询学生信息表中男生信息,按照学生编号是降序排列 select * from student where sex='男' order by studentno desc 排序字段:根据此字段进行排序,汉字按照拼音首字母排序,英文按照字母顺序排序,日期按照时间先后进行排序(日期越往前越小) --查询学生表中的学生信息,按照家庭住址降序排列 select * from student order by address descs --排序字段指定多个,当主排序字段值相同时,根据次排序字段的排序规则进行数据显示 --语法: select 查询项 from 表名 where 查询条件 order by 主排序字段 [排序规则],次排序字段[排序规则] --查询课程表中的课程信息,按照课时量由大到小进行排序,如果课时量相同则按照课程编号降序排列 select * from subject order by classhour desc,subjectno desc
-
分页查询:指定查询的记录从哪条至哪条
-
查询结果的数据量庞大时,我们需要将查询结果分批次显示
语法1: limit 起始位置,查询的条数 起始位置:数据查询从起始位置之后开始,起始位置可省略,默认从0开始 语法2: limit 查询条数 offset 起始位置 例题1:查询学生表中前5条数据 select * from student limit 0,5 select * from student limit 5 --省略起始位置,默认第一条开始 select * from student limit 5 offset 0 --语法2 例题2:--查询学生表中第6~15条数据 select * from student limit 5,10 select * from student limit 10 offset 5 --语法2 例题3:查询result表的考试成绩,并按照由高到低显示,同时把该成绩对应的学生的学号打印出来 a.第一次查询前5条记录 select studentno from result order by studentresult desc limit 5 b.第二次查询6-10条记录 select studentno from result order by studentresult desc limit 5,5 例题4:查询JAVA表课程成绩前10名且分数大于80的学生信息(学号,姓名,课程名,分数) select 学号,姓名,课程名称,分数 from JAVA where 分数>80 order by 分数 desc limit 10
-
-
子查询
-
核心:内层查询的结果作为外层查询的条件
--查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名 --步骤分解 --1.查询高等数学-2的课程编号---------2 select subjectNo from subject where subjectname="高等数学-2" --2.查询高等数学二分数大于80分学生的编号------1013 select studentno from result where studentresult >80 and subjectNo=2 --3.查询学生信息 select * from student where studentNo=1013 --子查询--内层查询的结果作为外层查询的条件 select * from student where studentNo in (select studentno from result where studentresult >80 and subjectNo in (select subjectNo from subject where subjectname="高等数学-2")) --查询学号为1026的学生信息 select * from student where studentno = 1026 -- 查询成绩为99分的学生信息 -- 1.拿到学生编号 select studentno from result where studentresult=99 -- 2.查询学生信息 select * from student where studentno = 1017 -- 子查询 select * from student where studentno in (select studentno from result where studentresult=99) -- 查询2024年4月16号考试的内容及其课时量 -- 1.2024/4/16考试课程的编号 select subjectno from result where examdate = "2024-04-16 08:23:52" -- 2.根据课程编号获取课程内容及课时量 select subjectname,classhour from subject where subjectno = 1 -- 子查询 select subjectname,classhour from subject where subjectno in (select subjectno from result where examdate = "2024-04-16 08:23:52") --查询《高等数学-1》的前5名学生成绩信息 1.根据课程名称获取课程编号 select subjectno from subject where subjectname="高等数学-1" 2.查询该课程考试成绩 -- 排序,取前五条 select * from result where subjectno="1" order by studentresult desc limit 5 --子查询 select * from result where subjectno in (select subjectno from subject where subjectname="高等数学-1") order by studentresult desc limit 5
-
-
数据库函数
-
统计函数/聚合函数
--查询学生信息表中有多少条数据 --count() 计数函数 select count(studentname) from student select count(*) from student --sum 求和 --求高等数学-1的总成绩 select sum(studentresult) from result where subjectno = "1" --avg 求平均值 --求高等数学-1的平均分 select avg(studentresult) from result where subjectno = "1" --max 求最大值 --求高等数学-1的最高分 select max(studentresult) from result where subjectno = "1" --min 求最小值 --求高等数学-1的最低分 select min(studentresult) from result where subjectno = "1"
❤❤聚合函数位置在select后边
❤❤使用聚合函数前,查询结果应该为1条以上的数据,否则无意义
❤❤聚合函数括号中需要加入字段名,通常为数值型字段
-
-
分组查询
group by 分组字段 --根据分组字段的不同值,将数据分成不同的小组,后续进行聚合运算
-
--高配版 select subjectname as 课程名称,avg(studentresult) as 平均分,max(studentresult) as 最高分,min(studentresult) as 最低分 from result,subject where result.subjectNo=subject.subjectNo group by result.subjectNo having avg(studentresult) >=60
-
查询语句汇总
select [distinct] 查询项[as 别名] from 表名 [inner|left|right join] 关联表 on 表1.字段=表2.字段 where 筛选条件 group by 分组字段 having 分组后筛选条件 order by 排序字段 limit 分页 -- #查询课程为《JAVA第一学年》成绩前10名分数大于80的学生信息(学号,姓名,课程名,分数)
-
-
事务
-
概念:事物就是将一组sql语句放在同一批次去执行,如果其中一条sql语句出错,所有的数据都会复原。
-
mysql事务处理支支持innodb类型的数据库表
-
g
-
事物的特性
- 原子性:不可分割,一个事务是一个最小的执行单元。
- 一致性:事务中所有的sql语句都要执行,要成功都成功,要失败都失败
- 隔离性:不同事物之间相互隔离,执行时不会互相干扰。
- 持久性:被事物处理过的数据会永久性的写入数据库内
-
事务的使用
-
设置自动提交方式
set autocommit = 0|1 -- 0:关闭自动提交 -- 1:打开自动提交 -- mysql默认自动提交是打开状态,使用事物时需关闭
-
开始一个事务
start transaction
-
事务中包含的sql语句
-
手动提交事务
commit
-
事物回滚(非必要步骤)
rollback -- 手动加该步骤,事物回滚,所有sql都被取消执行 -- 当事务中某条sql语句执行错误时会自动执行该步骤
-
开启自动提交事务
set autocommit = 1
-
-
-- 创建数据库shop和创建表account并插入2条数据
-- A账户成功减少500元,B账户应该增加500元,但一些错误导致未增加成功,这时则需返回A账户的500元,达到账户总额的平衡
-- 建库
create database shop
-- 建表
create table account(
id int(11),
name varchar(32),
cash decimal(9,2)
)
insert into account values(1,"A",2000),(2,"B",10000)
-- 1.关闭自动提交
set autocommit = 0
-- 2.开启一个事务
start TRANSACTION
-- 3.sql语句
update account set cash=cash-500 where name="A"
update account set cash=cash+500 where name="B"
--4.提交事务
commit
--5. 打开自动提交
set autocommit = 1
-
数据库索引
-
作用:
- 提高查询速度
- 确保数据的唯一性
- 可以加速表和表之间的连接,实现表与表之间的参照完整性
- 使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
- 全文检索字段进行搜索优化
-
分类:
- 主键索引(PRIMARY KEY)
- 唯一索引(UNIQUE)
- 常规索引(INDEX)
- 全文索引(FULLTEXT)
-
主键索引(一张数据表中只能存在一个主键)
-
创建数据库时指定某个字段为主键,目的为了保证数据的唯一性
-
主键索引可以通过视图方式和代码方式进行设置,当字段设置为主键时,该字段不能为空不能重复。
-
设置主键索引的方式
-
代码方式:
CREATE TABLE `Grade` ( `GradeID` INT(11) AUTO_INCREMENT PRIMARY KEY, #省略代码…… #主键索引也可在字段字义之后,如 # PRIMARY KEY(`GradeID`) ) -- 直接在字段后指定主键索引或者在建表语句最后声明主键字段
-
视图方式:
-
-
-
-
唯一索引
-
作用:避免同一个表中某数据列中的值重复
-
与主键的区别:
- 主键索引只能有一个(学生编号)
- 唯一索引可以有多个(身份证号、邮箱、手机号)
-
创建唯一索引
CREATE TABLE `Grade` ( `GradeID` INT(11) AUTO_INCREMENT PRIMARY KEY, `GradeName` VARCHAR(32) NOT NULL UNIQUE #或 UNIQUE KEY `GradeID` (`GradeID`) )
-
常规索引
-
作用:将查询频率高的字段创建为索引,在查询数据时直接从索引文件定位到数据,提高数据查询效率。
-
注意:
- index和key关键字都可设置常规索引
- 应加在查找条件的字段
- 不宜添加太多常规索引,影响数据的插入、删除和修改操作
- 数据经常修改的字段不适合添加索引
-
创建索引:
-- 建表时创建索引 CREATE TABLE `result` ( //省略一些代码 INDEX|KEY `ind` (`studentNo`, `subjectNo`) ) -- 修改表结构添加索引 ALTER TABLE result ADD INDEX ind(studentNo, subjectNo);
-
全文索引
-
作用:快速定位特定数据
-
注意:
- 只能用于MyISAM类型的数据表
- 只能用于 CHAR 、 VARCHAR、TEXT数据列类型
- 适合大型数据集
-
创建全文索引
-- 创建表 CREATE TABLE `student` ( #省略一些SQL语句 FULLTEXT (`StudentName`) )ENGINE=MYISAM; -- 修改表 ALTER TABLE employee ADD FULLTEXT (`first_name`);
-
-
管理索引
-
创建索引
-
建表时创建
-
建表后创建
alter table 表名 add 索引类型 索引名(索引字段)
-
删除索引
DROP INDEX 索引名 ON 表名 ALTER TABLE 表名 DROP INDEX 索引名 ALTER TABLE 表名 DROP PRIMARY KEY
-
查看索引
SHOW INDEX(或KEYS) FROM 表名
-
-
索引准则
索引不是越多越好 不要对经常变动的数据加索引 小数据量的表建议不要加索引 索引一般应加在查找条件的字段
-
练习
-- 学号StudentNo,添加主键索引 -- 添加主键索引 alter table student add PRIMARY key(StudentNo) -- 身份证IdentityCard,添加唯一索引 -- 添加唯一索引 alter table student add UNIQUE(IdCard) -- 邮箱Email,添加常规索引 -- 常规索引 alter table student add index index1(Email) -- 姓名StudentName,添加全文索引 (MyISAM类型数据表) -- 添加全文索引(修改表类型) alter table student add fulltext full1(StudentName)
-
-
-
-
-
数据库备份
-
数据备份的必要性
- 保证重要数据不丢失
- 数据转移
-
备份方法
-
mysqldump备份工具
mysqldump -h 主机名 –u 用户名 –p 数据库名> 路径/文件名.sql 示例:mysqldump -uroot -p bdqn>d:/dbqn.sql 输入密码
-
数据库管理工具,如navicat
-
直接拷贝数据库文件和相关配置文件
-
-
数据恢复
-
source
1.选择并打开要导入的数据库 source sql文件存放地址+sql文件名
-
客户端
mysql -uroot -p 数据库名称<数据库文件路径+文件名称
-
-
sql语句导出导入数据
-
导出
SELECT * INTO OUTFILE 'file_name' FROM tbl_name --输出的文件不能先存在,否则报错
-
导入
LOAD DATA INFILE 'file_name ' INTO TABLE tbl_name[FIELDS]
-
-
数据库设计
-
良好的数据库设计
节省数据的存储空间
能够保证数据的完整性
方便进行数据库应用系统的开发
-
糟糕的数据库设计
-
n数据冗余、存储空间浪费
n内存空间浪费
n数据更新和插入的异常
-
-
软件设计步骤
- 需求分析
- 概要设计
- 详细设计
- 代码编写
- 软件测试
- 安装部署
-
数据库设计步骤
收集信息
设计酒店管理系统,包含客户信息管理和客房管理及入住管理功能
标识实体
包含客人和客房两个实体
标识实体属性
客人:姓名、性别、联系方式、入住日期、离店日期。。。 客房:房间号,床位,价格,入住状态。。
建立实体间关系
客人-------入住--------客房
-
ER图
-
-
映射基数
- 一对一:人------身份证
- 一对多:人------手机号
- 多对一:学生------宿舍
- 多对多:学生------老师
-
酒店管理系统ER图
-
关系模式
- u用二维表的形式表示实体和实体间联系的数据模型****即关系模式
-
数据库设三范式
- **
-
2. 建表后创建 ```sql alter table 表名 add 索引类型 索引名(索引字段) ``` 3. 删除索引 ```sql DROP INDEX 索引名 ON 表名 ALTER TABLE 表名 DROP INDEX 索引名 ALTER TABLE 表名 DROP PRIMARY KEY ``` 4. 查看索引 ```sql SHOW INDEX(或KEYS) FROM 表名 ``` 2. 索引准则 ```text 索引不是越多越好 不要对经常变动的数据加索引 小数据量的表建议不要加索引 索引一般应加在查找条件的字段 ``` 3. 练习 ```sql -- 学号StudentNo,添加主键索引 -- 添加主键索引 alter table student add PRIMARY key(StudentNo) -- 身份证IdentityCard,添加唯一索引 -- 添加唯一索引 alter table student add UNIQUE(IdCard) -- 邮箱Email,添加常规索引 -- 常规索引 alter table student add index index1(Email) -- 姓名StudentName,添加全文索引 (MyISAM类型数据表) -- 添加全文索引(修改表类型) alter table student add fulltext full1(StudentName) ```
-
数据库备份
-
数据备份的必要性
- 保证重要数据不丢失
- 数据转移
-
备份方法
-
mysqldump备份工具
mysqldump -h 主机名 –u 用户名 –p 数据库名> 路径/文件名.sql 示例:mysqldump -uroot -p bdqn>d:/dbqn.sql 输入密码
-
数据库管理工具,如navicat
-
直接拷贝数据库文件和相关配置文件
-
-
数据恢复
-
source
1.选择并打开要导入的数据库 source sql文件存放地址+sql文件名
-
客户端
mysql -uroot -p 数据库名称<数据库文件路径+文件名称
-
-
sql语句导出导入数据
-
导出
SELECT * INTO OUTFILE 'file_name' FROM tbl_name --输出的文件不能先存在,否则报错
-
导入
LOAD DATA INFILE 'file_name ' INTO TABLE tbl_name[FIELDS]
-
-
数据库设计
-
良好的数据库设计
节省数据的存储空间
能够保证数据的完整性
方便进行数据库应用系统的开发
-
糟糕的数据库设计
-
n数据冗余、存储空间浪费
n内存空间浪费
n数据更新和插入的异常
-
-
软件设计步骤
- 需求分析
- 概要设计
- 详细设计
- 代码编写
- 软件测试
- 安装部署
-
数据库设计步骤
收集信息
设计酒店管理系统,包含客户信息管理和客房管理及入住管理功能
标识实体
包含客人和客房两个实体
标识实体属性
客人:姓名、性别、联系方式、入住日期、离店日期。。。 客房:房间号,床位,价格,入住状态。。
建立实体间关系
客人-------入住--------客房
-
ER图
-
-
映射基数
- 一对一:人------身份证
- 一对多:人------手机号
- 多对一:学生------宿舍
- 多对多:学生------老师
-
酒店管理系统ER图[外链图片转存中…(img-eAYwYlJY-1749456013641)]
-
关系模式
- u用二维表的形式表示实体和实体间联系的数据模型****即关系模式
-
数据库设三范式
- **
-
[外链图片转存中…(img-ecG7SLN3-1749456013641)]