MySQL数据库

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


MySQL数据类型

mysql 创建或者修改一个函数_数据库

整数型

类型

大小

范围(有符号)

范围(无符号)

用途

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



事务安全

-

支持

-

支持索引

支持

支持

支持

锁颗粒

表锁

行锁

表锁

行锁

数据压缩

支持

-

-

支持

支持外键

-

支持

-