MySQL 基础知识

基础知识

默认端口:3306

数据库连接格式:

基础语法:

-- CRUD
-- 添加数据
insert into [表名] ([字段], [字段], ...)  values ([值], [值], ...);
-- 删除数据
delete from [表名] where ...;
-- 修改数据
update [表名] set [字段]=[值], [字段]=[值], ...  where ... ;
-- 查询数据
select * from [表名] where ...;


-- 库操作
-- 创建库
create database [数据库名];
-- 删除库
drop database [数据库名];


-- 表操作
-- 创建表
create table [表名] ([字段名] [字段类型]);
-- 例子:
create table if not exists `表名` (					-- if not exists 判断表是否已存在
   `runoob_id` INT UNSIGNED AUTO_INCREMENT, 	 -- AUTO_INCREMENT 定义列的自增属性
   `runoob_title` VARCHAR(100) NOT NULL, 		      -- NOT NULL 字段不为NULL
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` ) 					     -- 定义列为主键 可以设置多主键 逗号隔开
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 		    -- ENGINE 设置存储引擎  CHARSET 设置编码
-- 删除表
drop table [表名] ;


-- 字段操作
-- 添加字段
alter table [表名] add [新字段名] [数据类型] [约束条件];
-- 删除字段
alter table [表名] drop [字段名];
-- 修改字段
alter table [表名] change [旧字段名] [新字段名] [新数据类型];

内置函数:

这里的内置函数 只整理了字符串和时间的 因为一般也就是需要对字符串和时间数据进行处理

-- 字符串函数
LENGTH(s) 计算字符串长度函数,返回字符串的字节长度
CONCAT(s1,s2...,sn)   合并字符串函数,返回结果为连接参数产生的字符串,参数可以是一个或多个
INSERT(str,x,y,instr)   将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
LOWER(str)   将字符串中的字母转换为小写
UPPER(str)   将字符串中的字母转换为大写
LEFT(str,x)   返回字符串str中最左边的x个字符
RIGHT(str,x)   返回字符串str中最右边的x个字符
TRIM(str)   删除字符串左右两侧的空格
REPLACE   字符串替换函数,返回替换后的新字符串
SUBSTRING   截取字符串,返回从指定位置开始的指定长度的字符换
REVERSE(str)   返回颠倒字符串str的结果

-- 时间函数
CURDATE 和 CURRENT_DATE   两个函数作用相同,返回当前系统的日期值
CURTIME 和 CURRENT_TIME   两个函数作用相同,返回当前系统的时间值
NOW 和 SYSDATE   两个函数作用相同,返回当前系统的日期和时间值
UNIX_TIMESTAMP   获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数
FROMUNIXTIME   将 UNIX 时间戳转换为时间格式,与UNIXTIMESTAMP互为反函数
MONTH   获取指定日期中的月份
MONTHNAME   获取指定日期中的月份英文名称
DAYNAME   获取指定曰期对应的星期几的英文名称
DAYOFWEEK   获取指定日期对应的一周的索引位置值
WEEK   获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53
DAYOFYEAR   获取指定曰期是一年中的第几天,返回值范围是1~366
DAYOFMONTH   获取指定日期是一个月中是第几天,返回值范围是1~31
YEAR   获取年份,返回值范围是 1970〜2069
TIMETOSEC   将时间参数转换为秒数
SECTOTIME   将秒数转换为时间,与TIMETOSEC 互为反函数
DATE_ADD 和 ADDDATE   两个函数功能相同,都是向日期添加指定的时间间隔
DATE_SUB 和 SUBDATE   两个函数功能相同,都是向日期减去指定的时间间隔
ADDTIME   时间加法运算,在原始时间上添加指定的时间
SUBTIME   时间减法运算,在原始时间上减去指定的时间
DATEDIFF   获取两个日期之间间隔,返回参数 1 减去参数 2 的值
DATE_FORMAT   格式化指定的日期,根据参数返回指定格式的值
WEEKDAY   获取指定日期在一周内的对应的工作日索引

聚合函数:

AVG()			 求平均值
COUNT()			统计行的数量
MAX()			求最大值
MIN()			 求最小值
SUM()			求累加和

流程控制:

IF(test,t,f)   如果test是真,返回t;否则返回f

IFNULL(arg1,arg2)   如果arg1不是空,返回arg1,否则返回arg2

NULLIF(arg1,arg2)   如果arg1=arg2返回NULL;否则返回arg1

CASE 
WHEN[test1] THEN [result1]
...
ELSE [default] 
END   如果testN是真,则返回resultN,否则返回default

CASE [test] 
WHEN[val1] THEN [result]
...
ELSE [default]
END   如果test和valN相等,则返回resultN,否则返回default

分页实现:

数据类型:

数值类型:
大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
时间类型:
类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
字符串类型:
类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

系统变量:

变量分为系统变量和用户自定义变量

  • 系统变量以 @@ 开头

    • 全局变量:全局变量影响 MySQL 服务的整体运行方式

    • 会话变量:会话变量影响具体客户端连接的操作

      -- 所有的全局变量信息
      SHOW GLOBAL VARIABLES; 
      -- 当前会话相关的所有会话变量以及全局变量
      SHOW SESSION VARIABLES;
      
  • 用户自定义变量以 @ 开头

MySQL结构:

image-20230623091053677

存储引擎:

存储引擎 描述
ARCHIVE 用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
CSV 在存储数据时,会以逗号作为数据项之间的分隔符。
BLACKHOLE 会丢弃写操作,该操作会返回空内容。
FEDERATED 将数据存储在远程数据库中,用来访问远程表的存储引擎。
InnoDB 具备外键支持功能的事务处理引擎
MEMORY 置于内存的表
MERGE 用来管理由多个 MyISAM 表构成的表集合
MyISAM 主要的非事务处理存储引擎
NDB MySQL 集群专用存储引擎
InnoDB:
简介:

InnoDB是事务型数据库的首选引擎 InnoDB是默认的MySQL引擎
支持行锁定和外键 支持事务安全表(ACID)

文件结构:

存储结构:InnoDB存储表时 会将表的定义和数据索引等信息分开存储

  • .frm 文件:
  • .ibd 文件:

持久化:

  • MySQL的表数据是存放在磁盘上的 大量的存取操作是非常消耗性能的
  • 为了提升性能InnoDB提供了缓冲池(Buffer Pool)
  • 读数据:会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取再放入缓冲池
  • 写数据:会首先写入缓冲池,缓冲池中的数据会定期同步到磁盘中(这一过程称为刷脏) 刷脏是随机IO 性能较差
逻辑存储结构:
  • 表空间:
    • 系统表空间: 包含数据字典、双写缓冲、变更缓冲区、undo日志
      以及在系统表空间创建的表的数据和索引
    • 独立表空间:5.6.6版本之后InnoDB会为每张表单独建立表空间
      表空间中
    • ...
  • 段:
    段分为索引段、数据段、回滚段等
    索引段:B+树的非叶子结点部分
    数据段:B+树的叶子结点部分
    回滚段:用于数据的回滚和多版本控制。一个段包含256个区(256M大小)。
  • 区:区是页的集合 一个区包含64个连续的页 默认大小为 1MB (64*16K)
  • 页:
    • InnoDB中页为基本单位 来管理存储空间
      默认大小:16KB
    • InnoDB中B+树的每个节点都是一个数据页 数据页之间不必要是物理连续的
      因为数据页之间有双向链表来维护着这些页的顺序
    • 常见类型有FSP_HDR、INODE、INDEX等类型
      所有类型页结构都一样 文件头、页数据、文件尾
      页数据根据类型不一样
  • 行:

图示:
image-20230625210212699

MyISAM:

MyISAM基于ISAM存储引擎 并对其进行扩展
它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一
MyISAM拥有较高的插入、查询速度 但不支持事务

posted @ 2023-07-25 17:12  熏晴微穗  阅读(5)  评论(0编辑  收藏  举报