MySQL 数据库基础学习参考:学习教程 —— 以实战案例方式逐丝剥茧学习 MySQL基础及知识点归纳
数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型
分为三类:数值类型、日期/时间类型、字符串类型
数值类型
类型 | 大小 | 用途 |
---|---|---|
TINYINT | 1 字节 | 小整数值 |
SMALLINT | 2 字节 | 大整数值 |
MEDIUMINT | 3 字节 | 大整数值 |
INT或INTEGER | 4 字节 | 大整数值 |
BIGINT | 8 字节 | 极大整数值 |
FLOAT | 4 字节 | 单精度浮点数 |
DOUBLE | 8 字节 | 双精度浮点数 |
DECIMAL | DECIMAL(M, D) | 小数值 |
日期和时间类型
类型 | 大小 | 格式 | 用途 |
---|---|---|---|
DATE | 3 | YYYY-MM-DD | 日期值 |
TIME | 3 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | YYYY | 年份值 |
DATETIME | 8 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 8 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过255个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65535字节 | 二进制形式的长文本数据 |
TEXT | 0-65535字节 | 长文本数据 |
MEDIUMBLOB | 0-16777215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16777215字节 | 中等长度文本数据 |
LONGBLOB | 0-4294967295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4294967295字节 | 极大文本数据 |
DROP TABLE IF EXISTS `user`;
CREATE TABLE IF NOT EXISTS `user` (
`id` INT(8) UNSIGNED AUTO_INCREMENT,
`username` VARCHAR(20) NOT NULL UNIQUE KEY COMMENT '账号',
`password` VARCHAR(40) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
DROP TABLE IF EXISTS `person`;
CREATE TABLE IF NOT EXISTS `person` (
`id` INT(8) UNSIGNED AUTO_INCREMENT,
`sex` VARCHAR(1) NOT NULL DEFAULT '男' COMMENT '性别',
`realname` VARCHAR(10) NOT NULL COMMENT '姓名',
`birthday` DATE NOT NULL COMMENT '出生日期',
`userid` INT(8) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
id
) 表示 id 为主键,用于关联其他表删除数据表:DROP TABLE ;
插入数据表:INSERT INTI (field, …) VALUES (value, …);
多条数据插入可以共用一个 INSERT INTO,多个录入数据之间使用逗号隔开
查询数据表:SELECT field, … FROM ;
查询表过滤:在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据,也可以使用 GROUP BY 读取表中不重复数据来达到过滤重复
查看表结构:SHOW COLUMNS FROM ;
查看表创建:SHOW CREATE TABLE ;
查看表索引:SHOW INDEXES FROM ;
更新数据表:UPDATE SET field = newVal, …;
更换表数据:REPLACE INTO (field, …) VALUES (value, …);
清空数据表:DELETE FROM ;
表数据导入:在老旧项目升级开发中,项目中的表格数据大多都是多表联合查询的结果,那么就需要通过数据转移来到处数据
PS:剔出原数据中的一些相关数据(例如类型、品牌等),提高效率,需要通过 INSERT - SELECT 或 CREATE - SELECT 来智能录入
DROP TABLE IF EXISTS `course`;
CREATE TABLE IF NOT EXISTS `course` (
`id` INT(8) UNSIGNED AUTO_INCREMENT,
`tellscore` INT(2) UNSIGNED NOT NULL COMMENT '语文考分',
`fatescore` INT(2) UNSIGNED NOT NULL COMMENT '数学考分',
`heroscore` INT(2) UNSIGNED NOT NULL COMMENT '英语考分',
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
INSERT INTO `course` (tellscore, fatescore, heroscore) SELECT tellscore, fatescore, heroscore FROM `fraction`;
-------------------------------------------------------------------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE IF NOT EXISTS `course` (
`id` INT(8) UNSIGNED AUTO_INCREMENT,
`tellscore` INT(2) UNSIGNED NOT NULL COMMENT '语文考分',
`fatescore` INT(2) UNSIGNED NOT NULL COMMENT '数学考分',
`heroscore` INT(2) UNSIGNED NOT NULL COMMENT '英语考分',
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8
SELECT tellscore, fatescore, heroscore FROM `fraction`;
---------------------------------------------------------------------------------------------------------
PS: 在剔出的一些相关数据后,需要将导出出具表对应的数据(例如类型、品牌等)更新为剔出数据表对应的 id 值,甚至修改导出表对应的字段类型及名字,推荐使用 ALTER - CHANGE 同时修改表字段名称及字段类型,同样可以设置对应的外键属性
数据表条件:比较条件、逻辑条件、布尔条件、相似条件、正则匹配、查询条件
数据表条件:SELECT field, … FROM WHERE condition;
比较条件:= (相等)、> (大于)、< (小于)、>= (大于等于)、<= (小于等于)、!= | <> (不等)
逻辑条件:AND 逻辑与,要求逻辑与左右两边都相等,OR 逻辑或,要求满足最少一个条件
布尔条件:IS NULL 为空,IS NOT NULL 非空,IN 在内存在,NOT IN 在内不存在
模糊之间:LIKE 模糊查询,BETWEEN - AND 两者之间
正则表达式:REGEXP 正则匹配,^ 以什么开头,$ 以什么结尾
-- 多表联合查询,表之间具有共同条件
SELECT a.username, a.`password`, b.sex, b.realname, b.birthday FROM `user` a, person b WHERE b.userid = a.id;
-- 通过关键字处理子查询多条件问题,可以通过使用 IN 或 NOT IN 来处理相同需求功能查询
SELECT * FROM person WHERE id >= ANY (SELECT personid FROM fraction WHERE tellscore >= 60);
SELECT * FROM person WHERE id >= SOME (SELECT personid FROM fraction WHERE tellscore >= 60);
SELECT * FROM person WHERE id >= ALL (SELECT personid FROM fraction WHERE tellscore >= 60);
区域条件:ANY、SOME、ALL 根据条件运算符判断,取最大值或最小值作条件
运算符 | ANY | SOME | ALL |
---|---|---|---|
>、>= | 最小值 | 最小值 | 最大值 |
<、<= | 最大值 | 最大值 | 最小值 |
= | 任意值 | 任意值 | |
<>、!= | 任意值 |
包含:主键自增、字段唯一、默认取值、非空约束、外键约束
主键自增空表时以 1 开始自增,没插入一个递增加一
主键自增字段在插入表数据时是不需要录入表字段值的
主键自增字段被删除最后一个时,不会重置被删除那条主键字段的值
AUTO_INCREMENT = 1 定义了 user 的 id 从 1 开始,每 INSERT 插入一条数据,id 都自增加 1
确保数据的一致性、完整性,实现一对一或一对多的表数据关系
两表必须使用相同的存储引擎且都为 InnoDB (如果不是 InnoDB 需要设置数据库配置文件),而且禁止使用临时表
外键列和参照列必须具有相似的数据类型,数值类型长度需要相同,有符号位也必须相同
外键列和参照列必须创建索引,如果外键列不存在索引的话,MYSQL 将自动创建索引
通过 CONSTRAINT _ibfk_1 声明一个约束
FOREIGN KEY () 定义那个字段为外键列
REFERENCES (id) 定义外键列参考表 ID 字段
ON DELETE 当参考表发生删除事件时,同时执行某种事件
ON UPDATE 当参考表发生更新事件时,同时执行某种事件
性别设置了默认值为 男,如果在 INSERT 插入用户表数据时,不录入性别字段值或使用 DEFAULT,生成插入数据性别字段为 ‘男’
表数据进行排序、分组、筛选、分页、连接及表字段操作
语法:SELECT field, … FROM ORDER BY field, … ASC | DESC;
语法:SELECT field, … FROM GROUP BY field [HAVING ];
语法:SELECT field, … FROM LIMIT [, ];
语法:ALTER TABLE EXTRACT 可取值如下: 语法:CREATE FUNCTION 函数名([参数列表]) RETURNS 数据类型 BEGIN sql语句; return 值; END; 函数的查看:SHOW CREATE FUNCTION ; 函数的修改:ALTER FUNCTION option; 函数的删除:DROP FUNCTION ; 存储过程是 SQL 语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理 语法:CREATE PROCEDURE 存储过程名 ([参数列表]) BEGIN 过程体; END; 存储过程与函数的区别 MySQL 可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎 包含:MyISAM、InnoDB、Memory、CSV、Archive(推荐在创建表时进行存储引擎设置) 事务是一个最小的不可分割的工作单元,能够保证一个业务的完整性 手动开启:BEGIN 或 START TRANSACTION 用来开启事务回滚功能 InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE SQL 编写顺序 MySQL 解析器顺序 MySQL 索引的建立对于数据库的高效运行是很重要的,可以大大提高数据库的检索速度 MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间MySQL 内置
字符函数
函数
描述
结果
CONCAT(s1,s2,…,sn)
字符连接
返回多个字符串拼接的结果
CONCAT_WS(x,s1,s2,…,sn)
使用指定的分隔符进行字符连接
返回多个字符串拼接并添加分隔符的结果
FORMAT(x,n)
实现字符格式化操作
返回格式化后的字符串
LOWER(s)
转换成小写字符
返回字符串转换为小写的字符串
LCASE(s)
转换成小写字符
返回字符串转换为小写的字符串
UPPER(s)
转换成大写字符
返回字符串转换为大写的字符串
UCASE(s)
转换成大写字符
返回字符串转换为大写的字符串
LEFT(s,n)
获取左侧字符
返回字符串左侧截取的几个字符
RIGHT(s,n)
获取右侧字符
返回字符串右侧截取的几个字符
函数
描述
结果
LENGTH(s)
字符长度
返回字符串的总字符数
CHAR_LENGTH(s)
字符长度
返回字符串的总字符数
CHARACTER_LENGTH(s)
字符长度
返回字符串的总字符数
LTRIM(s)
去除左侧空格
返回去除左侧空格的字符串
RTRIM(s)
去除右侧空格
返回去除右侧空格的字符串
TRIM(s)
去除左右两侧空格
返回去除左右两侧空格的字符串
SUBSTRING(s,start,length)
裁剪固定位置长度字符
返回裁剪后的剪切字符
SUBSTR(s,start,length)
裁剪固定位置长度字符
返回裁剪后的剪切字符
MID(s,n,length)
裁剪固定位置长度字符
返回裁剪后的剪切字符
REPLACE(s,s1,s2)
替换字符串某个字符
返回替换字符后的字符串
INSERT(s1,x,len,s2)
替换字符串某段字符
返回替换字符后的字符串
函数
描述
结果
REVERSE(s)
将字符串反转
返回反转后的字符串
STRCMP(s1,s2)
比较两个字符串
返回比较结果:0 相等、1 大于、-1 小于
LPAD(s1,len,s2)
在字符串开始处填充字符
返回填充后的字符串
RPAD(s1,len,s2)
在字符串结尾处填充字符
返回填充后的字符串
REPEAT(s,n)
将字符串重复几次拼接
返回拼接后的字符串
POSITION(s1 IN s)
获取某个字符在字符串中的索引
返回某个字符的索引值
LOCATE(s1,s)
获取某个单词在字符串中的索引
返回某个单词的位置
FIND_IN_SET(s1,s2)
获取某个字符在字符串中的索引
返回某个字符的索引值
FIELD(s,s1,s2…)
获取某个字符在多个字符列中的位置
返回当前字符在字符列中的位置
ASCII(s)
首字符的 ASCII 码
返回字符串首字符的 ASCII 码
SPACE(n)
设置几个空格
返回几个空格字符串
SUBSTRING_INDEX(s, delimiter, number)
获取字符串分隔符前或后面索引字符
返回分隔符前或后面的索引字符
数学函数
函数
描述
结果
CEIL(x)
取最小整数
返回浮点数靠近最小整数,大于浮点数
CEILING(x)
取最小整数
返回浮点数靠近最小整数,大于浮点数
FLOOR(x)
取最大整数
返回浮点数靠近最大整数,小于浮点数
ROUND(x)
取整
返回就近整数,小数位四舍五入
TRUNCATE(x,y)
保留几位小数
返回保留几位小数,不执行四舍五入
m DIV n
整除,m 被除数,n 除数
返回整除结果
MOD(x,y)
求余
返回余数
POWER(x,y)
求次方
返回次方的结果
POW(x,y)
求次方
返回次方的结果
SQRT(x)
求开方
返回平方根
RAND()
随机数
返回 0 到 1 的随机数
PI()
取圆周率
返回圆周率
ABS(x)
绝对值
返回绝对值
函数
描述
结果
EXP(x)
求 e 的次方
返回 e 的几次方
LN(n)
求 e 的对数
返回 e 的对数
LOG(base,x)
求某个数的对数
返回某个数的数
LOG2(x)
求 2 的对数
返回 2 的对数
LOG10(x)
求 10 的对数
返回 10 的对数
SIGN(x)
判断值是正数、负数还是为 0
返回判断结果:1 正数、-1 负数、0 即为 0
GREATEST(expr1, expr2, expr3, …)
求列表中的最大值
返回列表中的最大值
LEAST(expr1, expr2, expr3, …)
求列表中的最小值
返回列表中的最小值
函数
描述
结果
DEGREES(x)
将弧度转换为角度
返回角度值
RADIANS(x)
将角度转换为弧度
返回弧度
SIN(x)
正弦值
返回正弦值
COS(x)
余弦值
返回余弦值
TAN(x)
正切值
返回正切值
COT(x)
余切值
返回余切值
ASIN(x)
反正弦值
返回反正弦值
ACOS(x)
反余弦值
返回反余弦值
ATAN(x)
反正切值
返回反正切值
ATAN2(n, m)
反正切值
返回反正切值
函数
描述
结果
SUM(expression)
求和
返回总和
AVG(expression)
求平均值
返回平均值
COUNT(expression)
求总数
返回总条数
MAX(expression)
求最大值
返回最大值
MIN(expression)
求最小值
返回最小值
日期函数
函数
描述
结果
NOW()
当前日期和时间
返回当前日期和时间
SYSDATE()
当前日期和时间
返回当前日期和时间
CURRENT_DATE()
当前日期
返回当前日期
CURRENT_TIME()
当前时间
返回当前时间
CURRENT_TIMESTAMP()
当前日期和时间
返回当前日期和时间
LOCALTIME()
当前日期和时间
返回当前日期和时间
LOCALTIMESTAMP()
当前日期和时间
返回当前日期和时间
CURDATE()
当前日期
返回当前日期
CURTIME()
当前时间
返回当前时间
DATE_ADD(d,INTERVAL num EXTRACT)
修改时间段
返回修改后的日期时间
ADDDATE(d,n)
增加日期天数
返回增加后的日期
ADDTIME(t,n)
增加时间秒数
返回增加后的时间
SUBDATE(d,n)
减少日期天数
返回减少后的日期
SUBTIME(t,n)
减少时间秒数
返回减少后的时间
DATEDIFF(d1,d2)
两日期之间间隔天数
返回两日期间隔天数
TIMEDIFF(time1, time2)
计算时间差值
返回两时间差值
DATE_FORMAT(d,f)
格式化日期时间
返回格式化后的日期时间
函数
描述
结果
YEAR(d)
获取日期年份
返回日期年份,格式:YYYY
MONTH(d)
获取日期月份
返回日期月份
DAY(d)
获取日期部分
返回日期部分
HOUR(t)
获取日期小时
返回日期小时
MINUTE(t)
获取日期分钟
返回日期分钟
SECOND(t)
获取日期秒数
返回日期秒数
WEEKDAY(d)
获取日期星期
返回日期星期
QUARTER(d)
获取日期季度
返回日期季度
MONTHNAME(d)
获取日期月份名称
返回日期月份名称
DAYNAME(d)
获取日期星期名称
返回日期星期名称
DAYOFYEAR(d)
获取日期是本年第几天
返回日期日期是本年第几天
DAYOFMONTH(d)
获取日期是本月第几天
返回日期是本月第几天
DAYOFWEEK(d)
获取日期是本周第几天
返回日期是本周第几天
WEEK(d)
计算日期是本年第几个星期
返回计算日期是本年第几个星期,范围:0~53
WEEKOFYEAR(d)
计算日期是本年第几个星期
返回计算日期是本年第几个星期,范围:0~53
函数
描述
结果
TIME_TO_SEC(t)
将时间转换为秒
返回转换后的秒数
SEC_TO_TIME(s)
将秒数转换为时间
返回转换后的时间
LAST_DAY(d)
查询月份的最后一天
返回月份的最后一天
PERIOD_ADD(period, number)
为 年-月 组合日期添加一个时段
返回添加后的结果
PERIOD_DIFF(period1, period2)
两个时段之间的月份差值
返回两个时段之间的月份差值
TIME_FORMAT(t,f)
按某个表达式的要求显示时间
返回符合要求的时间
系统函数
函数
描述
结果
CONNECTION_ID()
服务器的连接数
返回服务器的连接数
DATABASE()
当前数据库名
返回当前数据库名
LAST_INSERT_ID()
生成的 AUTO_INCREMENT 值
返回最近生成的 AUTO_INCREMENT 值
USER()
当前用户
返回当前用户
SYSTEM_USER()
当前用户
返回当前用户
SESSION_USER()
当前用户
返回当前用户
CURRENT_USER()
当前用户
返回当前用户
VERSION()
数据库的版本号
返回数据库的版本号
CAST(x AS type)
转换数据类型
返回转换数据类型的结果
ISNULL(expression)
判断表达式是否为 NULL
返回判断结果:1 为空,0 非空
IF(expr,v1,v2)
IF 分支语句
返回表达式成立的结果
CASE-WHEN-THEN-ELSE-END
CASE ( SWITCH ) 分支语句
返回表达式成立的结果
BIN(x)
二进制编码
返回二进制编码
CONV(x,f1,f2)
将一种进制数变成另一种进制数
返回转换后的进制数
加密函数
函数
描述
结果
MD5()
信息摘要算法
返回 MD5 加密数据
PASSWORD()
密码算法
返回密码加密数据
自定义函数
算术运算
运算符
作用
+
加法
-
减法
*
乘法
/ 或 DIV
除法
% 或 MOD
取余
比较运算
符号
描述
备注
=
等于
<>, !=
不等于
>
大于
<
小于
<=
小于等于
>=
大于等于
BETWEEN
在两值之间
>=min&&<=max
NOT BETWEEN
不在两值之间
IN
在集合中
NOT IN
不在集合中
<=>
严格比较两个NULL值是否相等
两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE
模糊匹配
REGEXP 或 RLIKE
正则式匹配
IS NULL
为空
IS NOT NULL
不为空
逻辑运算
运算符号
作用
NOT 或 !
逻辑非
AND
逻辑与
OR
逻辑或
XOR
逻辑异或
位运算
运算符号
作用
&
按位与
|
按位或
^
按位异或
!
取反
<<
左移
>>
右移
优先级
优先级顺序
运算符(从高到低)
1
!
2
-(一元减号),~(一元比特反转)
3
^
4
*,/,DIV,%,MOD
5
-,+
6
<<,>>
7
&
8
|
9
=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
10
BETWEEN,CASE,WHEN,THEN,ELSE
11
NOT
12
&&,AND
13
||,OR,XOR
14
:=
MySQL 存储
系统变量
自定义变量
流程控制
名称
语法
特点
位置
while
w:while condition do loop_list end while w;
先判断后执行
begin - end 中
repeat
r:repeat loop_list until condition end repeat r;
先执行后判断
begin - end 中
loop
l:loop loop_list end loop l;
没有条件的死循环
begin - end 中
存储过程
存储引擎
特点
MyISAM
InnoDB
Memory
Archive
存储限制
256TB
64TB
有
无
事务安全
-
支持
-
-
支持索引
支持
支持
支持
锁颗粒
表锁
行锁
表锁
行锁
数据压缩
支持
-
-
支持
支持外键
-
支持
-
-
MySQL 事务
提交方式
事务特性
事务隔离
MySQL 索引
索引概念
索引优化
优化策略
MySQL 视图
临时表
视图表
区别
表
临时表
视图
本质
内容
内容
窗口
虚实
实表
实表
虚表
物理记录
有
有
没有
物理空间
占用
占用
不占用
影响
-
不影响
不影响对应表
安全
低于视图
低于视图
高于表
关联
-
-
基于表