MySQL数据库学习笔记

MySQL数据库

    • MySQL数据类型
    • SQL 语法
      • 约束:
        • 主键约束 PRIMARY KEY
        • 唯一约束 UNIQUE KEY
        • 默认约束 DEFAULT
        • 外键约束
      • 数据表的修改
        • 添加列
        • 添加约束
        • 删除约束
        • 修改 列 & 表
    • 数据库的增删改查
      • 插入记录
      • 更新记录
      • 删除记录
      • 查找记录
        • 查询表达式
        • 对查询结果分组
        • 对查询结果排序
        • 限制查询结果返回的数量 LIMIT
        • 将一个表的记录插入另一个表
      • 子查询与连接
        • 子查询
          • 使用比较运算符的子查询
          • 使用[NOT] IN的子查询
          • 使用[NOT] EXISTS的子查询
          • 使用 INSERT 的自查询
          • 多表更新
          • 多表更新一步到位
        • 连接关系
          • 多表连接
          • 自身连接
        • 多表删除
    • 运算符和函数
      • 字符函数
        • LIKE 模糊查询
      • 数值函数
      • 比较函数
      • 日期时间函数
      • 信息函数
      • 聚合函数
      • 加密函数
    • 自定义函数
    • MySQL存储过程
      • 创建存储过程
        • 存储过程与自定义函数的区别
    • 存储引擎
        • MySQL支持的存储引擎
        • 相关知识点

MySQL数据类型

MySQL数据库学习笔记_第1张图片

整数型

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值

浮点型&定点型

类型 大小 范围(有符号) 范围(无符号) 用途
FLOAT 4 字节 (-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 字节 (-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的值 小数值

日期&时间

类型 大小 范围 格式 用途
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-01-19 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串

类型 大小 用途
CHAR 0-255 定长字符串
VARCHAR 0-65535 变长字符串
TINYBLOB 0-255 不超过255个字符的二进制字符串
TINYTEXT 0-255 短文本字符串
BLOB 0-65535 二进制形式的长文本数据
TEXT 0-65535 长文本数据
MEDIUMBLOB 0-167777215 二进制形式的中等长度文本数据
MEDIUMTEXT 0-167777215 中等长度文本数据
LONGBLOG 0-4294967295 二进制形式极大文本数据
LONGTEXT 0-4294967295 极大文本数据

SQL 语法

行:记录
列:字段

/*创建数据库*/
CREATE DATABASE [ IF NOT EXISTS ] db_name (CHARACTER SET = charset_name);   

/*修改数据库编码*/
ALTER DATABASE db_name CHARACTER SET = charset_name;

/*查看数据库相关信息*/
SHOW CREATE DATABASE db_name;

/*删除数据库*/
DROP DATABASE db_name;

/*查看所有数据库列表*/
SHOW DATABASES;

/*展示警告信息*/
SHOW WARNINGS;

/*打开数据库*/
USE db_name;

/*查看当前数据库*/
SELECT DATABASE();

/*创建数据表*/
CREATE TABLE [IF NOT EXISTS] tabel_name(
    column_name data_type1 [NULL],                     //该字段可为空,默认
    column_name data_type2 [ NOT NULL],                //字段不能为空
    ···
);

/*查看数据表*/
SHOW TABLES FROM db_name;

/*查看数据表的结构*/
SHOW COLUMNS FROM tb_name;

/*插入记录*/
INSERT table_name [(col_name,···)] VALUES(val,···);

/*查找全部记录*/
SELECT * FROM table_name;

约束:

主键约束 PRIMARY KEY

  • 每张数据表只能存在一个主键
  • 主键保证记录的唯一性,不得存在相同的值
  • 主键自动为NOT NULL
  • 不一定与AUTO_INCREMENT同时使用

AUTO_INCREMENT

  • 自动编号赋值,须与主键同时使用
  • 仅限于整型,第一个为1

唯一约束 UNIQUE KEY

  • 可保证记录的唯一性
  • 每张数据表可存在多个唯一约束
  • 唯一约束的字段可为NULL值

默认约束 DEFAULT

  • 设置默认值

例:

CREATE TABLE tb(
    id SMALLINT PRIMARY KEY,
    name VARCHAR(10) UNIQUE,
    sex ENUM('male','female') DEFAULT male
)

外键约束

  • 父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
  • 数据表的存储引擎只能为InnoDB
  • 外键列二和参照列必须具有相同的数据类型,其中数据的长度和符号位必须相同,字符长度可不同
  • 外键列和参照列必须创建索引,如果外检不存在索引,MySQL将自动创建索引。

eg:

CREATE TABLE provinces (
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20),
)

CREATE TABLE users(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    pname VARCHAT(10),
    pid SMALLINT UNSIGNED,
    FOREIGN KEY (pid) REFERENCES provinces (id)
)

/*查看表是否有索引*/
SHOW INDEXS FROM table_name;

数据表的修改

添加列

ALTER TABLE table_name ADD column_name column_definition [FIRST / AFTER column_name];

/*在name列后面添加password列*/
ALTER TABLE users ADD password CARCHAR(16) NOT NULL AFTER name;

注释:添加多列时需要加括号,将每列隔开,且不能指定位置(默认加在最后)

添加约束

/*添加主键约束*/
ALTER TABLE table_name ADD PRIMARY KEY (column_name);

/*添加唯一约束*/
ALTER TABLE table_name ADD UNIQUE KEY (column_name,...);

/*添加外键约束*/
ALTER TABEL table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (column_name) REFERENCES table_name2 (column_name2);

/*添加 or 删除默认约束*/
ALTER TABLE table_name ALTER column_name SET DEFAULT default_value;
ALTER TABLE table_name ALTER column_name DROP DEFAULT;

删除约束

/*删除主键约束*/
ALTER TABLE table_name DROP PRIMARY KEY;

/*删除唯一约束*/
ALTER TABLE table_name DROP KEY column_name;

/*删除外键约束*/
ALTER TABLE table_name DROP FOREIGN KEY fk_symbol;

/*可通过查看表信息得到外键约束名称 constraint:fk_symbol,默认tabname_ibfk_1;*/

/*删除外键残余的索引*/
ALTER TABLE table_name DROP INDEX index_name;

修改 列 & 表

/*修改列定义*/
ALTER TABLE table_name MODIFY column_name column_definition [FIRST / AFTER column_name2]

/*修改列名称*/
ALTER TABLE table_name CHANGE column_name new_column_name column_definition [FIRST / AFTER column_name2]

/*重命名表*/
ALTER TABLE table_name RENAME new_table_name;

RENAME TABLE table_name TO new_table_name [, table_name2 TO table_name2...];

数据库的增删改查

插入记录

INSERT table_name [(column_name1,...)] VALUES(value1,value2...),(...)...;

/*一次只能插入一条记录,可用子查询 SubQuery*/
INSERT table_name SET column_name1=value1,...;

/*此方法可将查询结果插入数据表中*/
INSERT table_name [(col_name1,...)] SELECT...;

注:若列为AUTO_INCREMENT,则值设为NULL或DEFAULT;

更新记录

UPDATE tab_reference SET col_name = expr / default [,col_name2=...] [WHERE where_condition]

e.g
UPDATE tab_reference SET age = age+10,sex=male;
UPDATE tab_reference SET age = id+age WHERE id%2=0;

删除记录

DELETE FROM tab_name WHERE where_condition;                  //若不添加条件,则删除全部记录

查找记录

查询表达式

  • 每一个表达式表示查找的一列,且至少一个
  • 多列之间以逗号分隔
  • 星号(*)表示所有的列
  • 查询表达式可以使用AS alias_name为其赋予别名
  • 别名可用于GROUP BY, ORDRE BY或HAVING子句

一般格式

SELECT [ALL|DISTINCT] <目标列表表达式>
FROM <表或视图>|<SELECT 语句> [AS 别名]
[WHERE <条件表达式>]
[GROUP BY <列名1>] [HAVING <条件表达式>]
[ORDER BY <列名2>ASC|DESC]

eg:

SELECT id,name FROM users;

SELECT users.id,user.name FROM users;

SELECT id AS usersID FROM users;

对查询结果分组

/*按照某列队查询结果分组,或者按位置分组,ASC升序,DESC降序*/
SELECT col_name FROM tab_name GROUP BY col_name1/position [ASC/DESC];

/* 对分组进行选择, 相当与 where, 但 where 在 group 前 */
HAVING where_condition          // 条件字段应该出现在查询列中或者条件式为聚合函数

eg:
SELECT sex,age FROM users GROUP BY 1 HAVING age>35;
SELECT sex,age FROM users GROUP BY 1 HAVING count(id)>10;

对查询结果排序

SELECT __ FROM __ ORDER BY col-name/expr/position [ASC/DESC];

SELECT * FROM users ORDER BY age,id DESC;         //按照age-id降序

限制查询结果返回的数量 LIMIT

SELECT * FROM users LIMIT 3;            //只显示前3条
SELECT * FROM users LIMIT 2,3;          //只显示查询结果的第3~5条

注:mysql个数计数从0开始

将一个表的记录插入另一个表

INSERT tab_name (col_name1,...) SELECT (col_name_1,...) FROM tab_name2 WHERE ____ ;

/**/
INSERT users2 (name) SELECT username FROM users WHERE age>20;

子查询与连接

子查询

  • 子查询是指嵌套在查询内部,切必须始终出现在圆括号内。
  • 子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、SET、LIMIT、函数等。
  • 子查询的外层查询可以是:SELECT、INSERT、UPDATA、SET或者DO。
  • 子查询可以返回值:标量、一行、一列或者子查询。
使用比较运算符的子查询

运算符:=、>、<、>=、<=、<>、!=、<=>

语法结构: operand comparison_operator subquery

/*查询出高于平均价格的商品*/
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
//ROUND(X,2)x保留两位小数,AVG(x)对x求平均值。

关键字:ANY、SOME、ALL

  • SOME、ANY:满足其中一个就行。
  • ALL:必须满足全部。
/*查询到的商品价格大于超级本的最低价*/
SELECT goods_name,goods_price FROM tdb_goods WHERE goods_price > ANY (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');

/*查询到的商品价格大于超级本的最高价*/
SELECT goods_name,goods_price FROM tdb_goods WHERE goods_price > ALL (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');
使用[NOT] IN的子查询

语法结构:operand comparison_operator [NOT] IN (subquery)

  • =ANY 运算符与IN等效
  • !=ALL或<>ALL云算法与NOT IN等效
使用[NOT] EXISTS的子查询

如果子查询返回结果,EXISTS将返回TRUE;否则返回FALSE

使用 INSERT 的自查询

将查询结果写入数据表
INSERT tbl_name [(col_name,…)] SELECT …

多表更新
UPDATE teble_references
SET col_name1=expr
WHERE where_condition;

其中多表关系table_references为

table_name1 连接类型 table_2 ON conditional_ecpr

连接类型

  • 内连接:JOIN/CROSS JOIN/INNER JOIN等价
  • 左外连接LEFT [OUTER] JOIN
  • 右外连接RIGHT [OUTER] JOIN

例:

/*把表tdb_goods_cates中cate_name与tdb_goods中goods_cate相对应的部分,用cate_id代替goods_cate*/
UPDATE tdb_goods INNER JOIN tdb_goods_cate ON goods_cate=cate_name
SET goods_cate = cate_id;
多表更新一步到位
/*创建的同时将查询的记录插入到新表中*/
CREATE TABLE tdb_goods_brands(
    brand_id SMALLINT UNSIGNED PRIMARY AUTO_INCREMENT,
    brand_name VARCHAR(30) NOT NULL
)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;

连接关系

  • 内连接:仅表示符合条件的连接
  • 左外连接: 表示全部左边条件的连接, 结果中右边不符合的对应为null,若定义为NOT NULL,则停止查找
  • 右外连接: 同上
多表连接
SELECT tdb_goods_name,tdb_goods_cate,tdb_goods_price FROM tdb_goods AS g
    INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
    INNER JOIN tdb_goods_Brands AS b ON g.brand_id = b.brand_id;
自身连接
/*必须使用别名,得到的结果用名称代替 parent_id*/
SELECT s.type_id,type_name,p.type_name FROM tdb_goods_types AS s JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;

/**显示(直接)子类数量/
SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_id;

多表删除

DELETE tbl_name1[.* ] [,tbl_name.* ]…
FROM table_references
[ WHERE where_condition ]

/*复制记录*/
INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);

/*查找重复记录*/
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;

/*删除一个表中重复的记录*/
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2  ON t1.goods_name = t2.goods_name  WHERE t1.goods_id > t2.goods_id;

运算符和函数

字符函数

函数名称 描述 用法
CONCAT() 字符连接 CONCAT('a','-','b' )=a-b ,参数数量不定
CONCAT_WS() 使用指定的分隔符进行字符连接 CONCAT_WS(‘分隔符’, , …)
FORMAT() 数字格式化 FORMAT(1234.134,2)=1,234.13 (确定小数位,产生千分位逗号)
LOWER() 转换成小写字母 LOWER('MYSQL')=mysql
UPPER() 转换成大写字母
LEFT() 获取左侧字符 LEFT('MYSQL', 2)=MY
RIGHT() 获取右侧字符
LENGTH() 获取字符长度 LENGTH('MY SQL')=6,(空格也算)
LTRIM() 删除前导空格 LTRIM(' MYS QL')=MYS QL
RTRIM() 删除后续空格 RTRIM(' MYS QL ')=_MYS QL
TRIM() 删除前导和后续空格 TRIM(' MY SQL ')=MY SQL
SUBSTRING() 字符串截取 SUBSTRING('MYSQL', 1, 2)=MY , SUBSTRING('MYSQL', 2)=SQL , 位置负值表示从后面取
[NOT] LIKE 模式匹配 %表示任意多个字符, _表示任意一个字符
REPLACE() 字符串 REPLACE('?MYS??QL?', '?', '')=MYSQL

TRIM 拓展

/*删除自定义前导字符*/
SELECT TRIM(LEADING '?' FROM '??MYS?QL?' ;      /*结果为 MYS?QL?*/

/*删除自定义后续字符*/
SELECT TRIM(TRAILING '?' FROM '??MYS?QL?' ;      /*结果为 ??MYS?QL*/

/*删除自定义前导和后续字符*/
SELECT TRIM(BOTH '?' FROM '??MYS?QL?' ;      /*结果为 ??MYS?QL*/

LIKE 模糊查询

/*查找test中first_name字段包含字母o的记录*/
SELECT * FROM test WHERE first_name LIKE '%o%';

/*查找test中first_name字段包含%的记录*/
SELECT * FROM test WHERE first_name LIKE '%1%%' ESCAPE '1';

数值函数

函数名称 描述 用法
CEIL() 进一取整 SELECT CEIL(3.01);=4
DIV 整数除法 SELECT 3 DIV 4;=0
FLOOR() 舍一取整 SELECT CEIL(3.99);=3
MOD 取余数(取模) SELECT 5.3 MOD 3;=2.3
POWER() 幂运算 SELECT POWER(2,3);=8
ROUND() 四舍五入 SELECT ROUND(3.65, 1);=3.7
TRUNCATE() 数字截取(不四舍五入) SELECT TRUNCATE(125.89, 0)=125.8 取负数: (125.89, -1)=120

比较函数

函数名称 描述 用法
[NOT]BETWEEN x AND y 是否在数字x与y之间 SELECT 35 BETWEEN 1 AND 40;=1
[NOT] IN() 是否在列出值范围内 SELECT 10 IN(5,10,15,20);=1
IS [NOT] NULL 是否为空 SELECT '' IS NULL;=0

日期时间函数

函数名称 描述 用法
NOW() 当前日期和时间
CURDATE() 当前日期
CURTIME() 当前时间
DATE_ADD() 日期变化 SELECT DATE_ADD('2018-6-2',INTERVAL 365 DAY);=2019-6-2 也可写成- 3 WEEK
DATEDIFF() 日期差值 SELECT DATEDIFF('2018-6-2','2019-6-2');=-365
DATE_FORMAT() 日期格式化 SELECT DATE_FORMAT('2018-6-2','%m/%d/%Y');=06/02/2018

信息函数

函数名称 描述 用法
CONNECTION_ID() 连接ID
DATABASE() 当前数据库
LAST_INSERT_ID() 最后插入记录的ID号 当最后一次同时输入多个时,取第一个
USER() 当前用户
VERSION() 版本信息

聚合函数

函数名称 描述 用法
AVG() 平均值 SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;
COUNT() 计数 SELECT COUNT(goods_id) as counts FROM tdb_goods;
MAX() 最大值 ELECT MAX(goods_price) as counts FROM tdb_goods;
MIN() 最小值
SUM() 求和 SELECT SUM(goods_price) as counts FROM tdb_goods;

加密函数

函数名称 描述 用法
MD5() 信息摘要算法,一般用于web密码 SELECT MD5('root')得到32位的数
PASSWORD() 密码算法,可以改密码 SET PASSWORD=PASSWORD(‘adimit’);

自定义函数

创建自定义函数

CREATE FUNCTION function_name   
RETURNS {STRING/ INTEGER/ REAL/ DECIMAL} routine_body

关于函数体

  • 函数体由合法的SQL语法构成;
  • 函数体可以是简单的SELECT或INSERT语句;
  • 函数体如果为复合结构则使用BEGIN…END语句;
  • 复合结构可以包括声明,循环,控制结构。

创建无参函数

CREATE FUNCTION f1() RETURNS VARCAHR(30)
RETURN DATE_FORMAT((NOW(),'%Y年%m月%d日 %H点%i分%s秒');

SELECT f1();

创建带参函数

CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;

复合结构的函数体

/* 需要同时执行多条语句,要把结束符号改掉,否则遇到';'就直接结束了 */
DELIMITER //

/*创建复合结构函数体,功能为在user表格中插入一条记录,并返回其id*/
CREATE FUNCTION ADD_USER(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT user(username) VALUES(username);
RETURN LAST_INSERT_ID();
END//
/*begin 和 end 中间执行多条语句*/

MySQL存储过程

存储过程:是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理(类似函数)。存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户申明变量以及进行流程控制。存储过程可以接受输入类型的参数和输出类型的参数,并且可以存在多个返回值。只在第一次调用时进行语法分析和编译,以后的调用直接调用编译的结果,效率大大提高。

优点:

  • 增强SQL语句的功能和灵活性:可以通过控制语句对流程进行控制和判断
  • 实现较快的执行速度:客户端第一次调用存储过程时,MySQL引擎会对其进行语法分析、编译等操作,然后将编译结果存储到内存中,所以第一次和之前的效率一样,然而以后会直接调用内存中的编译结果,效率提高
  • 减少网络流量:例如删除一个记录,我们原本要输入DELETE FROM xx WHERE …; 要传输的字符较多,如果写成存储过程,就只要调用存储过程的名字和相应参数就行,传输的字符数量较少,所以减少了网络流量。

创建存储过程

CREATE
[DEFINER = user / CURRENT_USER]  
PROCEDURE sp_NAME([proc_parameter[,..])  
[characteristic ...] routine_body

proc_parameter:
IN / OUT / INOUT param_name type

参数

  • IN : 参数的值必须在调用时指定
  • OUT : 参数的值可以被存储过程改变,并且可以返回
  • INOUT : 调用时指定,并且可以被改变和返回

过程体

  • 过程体有合法的sql语句构成
  • 如为复合结构,则需要使用Benin with 语句
  • 可以使用条件循环等控制语句
/*无参存储过程*/
CREATE PROCEDURE guocheng() SELECT VERSION();
/*调用*/
CALL guocheng();

/*有IN类型参数存储过程*/
CREATE PROCEDURE removeGoodsById(IN id INT UNSINGNED)
DELETE FROM tdb_goods WHERE goods_id = id;

CALL removeGoodsById(23);


/*带有IN和OUT类型参数, 删除传入id记录并返回剩余数量,*/
DELIMITER //
CREATE PROCEDURE removeByIdReturnNumber(IN id INT UNSIGNED, OUT nums UNSIGNED)
BEGIN
DELETE FROM tdb_goods WHERE goods_id = id;
SELECT COUNT(tdb_goods) FROM tdb_goods INTO nums;
END//

DELIMITER ;

CALL removeByIdReturnNumber(20, @num);
SELECT @num;        /*输出结果*/

/*删除并返回删除的数量和剩余数量*/
DELIMITER //
CREATE PROCEDURE RemoveCateReturnInfo(IN id SMALLINT UNSIGNED, OUT delNum INT UNSIGNED, OUT remainNum INT UNSIGNED)
BEGIN
DELECT FROM tdb_name WHERE cate_id = id;
SELECT ROW_COUNT() INTO delNum;
SELECT COUNT(goods_id) fROM tdb_goodsINTO remainNum;
END //
DELIMITER ;
CALL removeCateReturnInfo(6,@del,@rem);
SELECT @del,@rem;

声明变量
DECLARE @a INT;只能在BEGIN…END中声明局部变量,且只能写在第一行
SET @a = 7;用户变量,(类似全局变量)

存储过程与自定义函数的区别

  • 别存储过程实现的功能相对复杂,函数针对性较强
  • 存储过程可以返回多个值,函数只能有一个返回值
  • 存储过程一般独立执行,函数可以作为 sql 语句的组成部分来出现

存储引擎

定义: MySQL可以将数据以不同的技术存储在文件(内存)中。

MySQL支持的存储引擎

  • MyISAM
  • InnoDB
  • Memory
  • CSV
  • Archive

相关知识点

  • 并发控制 : 当多个连接对记录进行修改时保证数据的一致性和完整性
    1. 共享锁(读锁) : 在同一段时间内,多个用户可以读取同一个资源, 读取过程中数据不会发生任何变化.
    2. 排它锁(写锁) : 在任何时候只能有一个用户写入资源, 当进行写锁时会阻塞其他的读锁或者写锁操作.
  • 锁颗粒
    1. 表锁: 开销最小的锁策略
    2. 行锁: 开销最大的锁策略,也是支持最大并发处理的锁策略(每条记录上都加锁)
  • 事务 : 用于保证数据库的完整性, (保证多条同步操作的数据同成败)
    1. 原子性(Atomicity)
    2. 一致性(Consistency)
    3. 隔离性(Isolation)
    4. 持久性(Durability)
  • 索引 :是对数据表中一列或者多列的值进行排序的一种结构。使用索引可以快速访问数据表的特定信息。索引是进行记录快速定位的一种方法。索引好比目录。索引可以划分为:普通索引、唯一索引、全文索引。
特点 MyISAM InnoDB Memory Archive
存储限制 246TB 64TB
事务安全 - 支持 -
支持索引 支持 支持 支持
锁颗粒 表锁 行锁 表锁 行锁
数据压缩 支持 - - 支持
支持外键 - 支持 -

你可能感兴趣的:(笔记,数据库)