以前使用数据库都是用的比较零散,最近重新系统复习了一下MySQL的相关操作,在此做一个笔记。
MySQL的数据类型
MySQL有很多的数据类型,可以参考这里来仔细阅读,这里就不搬运了。
重点记一下数值类型、字符串类型和时间类型。
- INT或者INTEGER是大整数类型,占用4个字节。FLOAT占用4个字节,DOUBLE8字节。与普通的数据类型没太大的区别。
- 字符串类型常用的主要是CHAR和VARCHAR。前者是定长字符串,后者长度不定,比较灵活。区别主要是查找的时候前者略快,总体上还是VARCHAR更为常用。此外,还有TEXT这种类型,可以储存长文本。
- 日期类型常用的主要是DATE、TIME和DATETIME。分别表示日期、时间和日期时间。
数据库常用命令
显示所有数据库:1
SHOW DATABASES;
创建数据库:1
CREATE DATABASE db_book;
删除数据库:1
DROP DATABASE db_book;
表操作
表是数据库存储数据的基本单位。每个表包含若干个字段。
创建表
创建表的操作是这样的:1
2
3CREATE TABLE 表名 (属性名 数据类型 [完整的约束条件],
属性名 数据类型 [完整的约束条件]...
);
注意,表中有一些约束条件:
约束条件 | 说明 |
---|---|
PRIMARY KEY | 标识该属性为该表的主键,可以唯一的标识对应的记录 |
FOREIGN KEY | 标识该属性为该表的外键,与某表的主键关联 |
NOT NULL | 标识该属性不能为空 |
UNIQUE | 标识该属性的值是唯一的 |
AUTO_INCREMENT | 标识该属性的值自动增加 |
DEFAULT | 为该属性设置默认值 |
下面来看一看创建表的例子:
1 | CREATE TABLE t_bookType ( |
改查删
查看表的结构:1
2
3
4#查看表的结构
DESC t_bookType;
#查看创建表的语句
SHOW CREATE TABLE t_bookType;
修改表:1
2
3
4修改表名: ALTER TABLE 旧表名 RENMAE 新表名 ;
修改字段: ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型
增加字段: ALTER TABLE 表名 ADD 属性名 1 数据类型 [完整性约束条件] [FIRST | AFTER 属性名 2]
删除字段: ALTER TABLE 表名 DROP 属性名
删除表:1
删除表: DROP TABLE 表名;
查询数据
查询数据主要使用的就是SELECT语句,结构是这样的:1
SELECT 查询字段1,2,... FROM 表名 [约束条件];
查询后显示出的结果为:
查询字段1 查询字段2 查询字段3
… … …
单表查询
查询所有字段
1
2SELECT 字段 1,字段 2,字段 3...FROM 表名;
SELECT * FROM 表名;查询指定字段
1
SELECT 字段 1,字段 2,字段 3...FROM 表名;
Where 条件查询
1
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 条件表达式;
带 IN 关键字 查询(表示多个字段同时查询)
1
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] IN (元素 1,元素 2,元素 3);
带 BETWEEN AND 的 范围查询
1
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] BETWEEN 取值 1 AND 取值 2;
带 LIKE 的 模糊查询
1
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 [NOT] LIKE ‘字符串’;
空值查询
1
SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 字段 IS [NOT] NULL;
带 AND 的多条件查询
1
SELECT 字段 1,字段 2...FROM 表名 WHERE 条件表达式 1 AND 条件表达式 2 [...AND 条件表达式 n]
带 OR 的多条件查询
1
SELECT 字段 1,字段 2...FROM 表名 WHERE 条件表达式 1 OR 条件表达式 2 [...OR 条件表达式 n]
“%”代表任意字符;
“_” 代表单个字符;DISTINCT 去重复查询
1
SELECT DISTINCT 字段名 FROM 表名;
对 查询结果排序 (注意,order必须放在一条语句的最后)ASC为升序,DESC为降序。
1
SELECT 字段 1,字段 2...FROM 表名 ORDER BY 属性名 [ASC|DESC]
GROUP BY 分组查询
1
GROUP BY 属性名 [HAVING 条件表达式][WITH ROLLUP]
- 单独使用(毫无意义),一般与聚合函数一起使用;
- 与 GROUP_CONCAT()函数一起使用;
- 与 HAVING 一起使用(限制输出的结果);
- 与 WITH ROLLUP 一起使用(最后加入一个总和行);
LIMIT 分页查询
1
SELECT 字段 1,字段 2...FROM 表名 LIMIT 初始位置,记录数;
聚合函数查询
聚合函数是汇总数据的函数。主要有求记录条数、求和、求平均值、求最值几个方法。
聚合函数一般使用形式如下:1
SELECT 函数(字段) [AS 别名] FROM 表;
COUNT()函数:统计记录的条数
与 GOUPE BY 关键字一起使用,表示对每个分组元素的统计信息:1
SELECT stuName,COUNT(*) FROM t_grade GROUP BY stuName;
SUN()函数:求和函数
1
2SELECT stuName, SUM(score) AS total FROM t_grade WHERE stuName = '张三';
SELECT stuName, SUM(score) AS total FROM t_grade GROUP BY stuName;AVG()函数:求平均值的函数;
1
2SELECT stuName, AVG(score) AS total FROM t_grade WHERE stuName = '张三';
SELECT stuName, AVG(score) AS total FROM t_grade GROUP BY stuName;MAX()函数:求最大值的函数
- MIN()函数:求最小值的函数
连接查询
连接查询是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据。
- 内连接获取两个表中字段匹配关系的记录,典型用法是这样的:
1
SELECT * FROM t_book, t_booktype WHERE t_book.`bookTypeId` = t_booktype.`id`;
此时,显示左表中bookTypeId和右表的id相同的部分。
但我们需要更多的功能,比如右表中即使没有相同的一项,也要列出来,那么就需要外连接。外连接分为左连接和右连接。分别是对左表取并集和对右表取并集。
这是左连接,如果右表没有对应的id,那么就用null代替。1
SELECT * FROM t_book LEFT JOIN t_booktype ON t_book.`bookTypeId` = t_booktype.`id`;
多条件连接查询就是在内连接的基础上,增加筛选语句,使用AND并列查询。
1
SELECT tb.bookName, tb.price, tb1.`bookTypeName` FROM t_book tb, t_booktype tb1 WHERE tb.`bookTypeId` = tb1.`id` AND tb.`price` > 80;
子查询
子查询是一个复查询,即将一个语句的运算结果带入另一个语句的查询之中。
In关键字:范围性的子查询,一个查询语句的条件可能落在另一个 SELECT 语句的查询结果中。
1
SELECT * FROM t_book WHERE bookTypeId IN( SELECT id FROM t_booktype );
带比较运算符的子查询:
1
SELECT * FROM t_pricelevel WHERE price <= (SELECT price FROM t_pricelevel WHERE priceLevel = 1);
exists子查询:判断性的子查询,若子查询查到记录,则进行外层查询,否则不执行外层查询。
1
SELECT * FROM t_book WHERE EXISTS (SELECT * FROM t_booktype);
any子查询:表示满足任一条件即可查询
1
SELECT * FROM t_pricelevel WHERE price >= ANY (SELECT price FROM t_pricelevel);
all子查询:表示满足所有的条件才可查询
合并查询结果
将两个查询结果放在一起1
SELECT id FROM t_book UNION SELECT id FROM t_booktype;
注意,UNION会自动去重,而UNION ALL则不会去重,将所有结果都显示。
别名
在查询的时候对表或字段起一个别名,从而可以直观方便的使用
为表取别名: 表名 表的别名
为字段取别名: 属性名 [AS] 别名
数据操作
在上一节学习了查询的相关操作,本次继续学习增删改的操作。
插入数据
给表的所有字段插入数据
1
INSERT INTO 表名 VALUES(值 1,值 2,值 3,...,值 n);
给表的指定字段插入数据
1
INSERT INTO 表名(属性 1,属性 2,...,属性 n) VALUES(值 1,值 2,值 3,...,值 n);
同时插入多条记录
1
INSERT INTO 表名 [(属性列表)] VALUES(取值列表 1),(取值列表 2)...;
更新数据
1 | UPDATE 表名 |
删除数据
1 | DELETE FROM 表名 [WHERE 条件表达式] |
索引
索引是数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度,类似于图书中的目录,方便快速定位,寻找指定的内容。
索引分类
- 普通索引
这类索引可以创建在任何数据类型中; - 唯一性索引
使用 UNIQUE 参数可以设置,在创建唯一性索引时,限制该索引的值必须是唯一的; - 全文索引
使用 FULLTEXT 参数可以设置,全文索引只能创建在 CHAR,VARCHAR,TEXT 类型的字段上。主要作用就是提高查询较大字符串类型的速度;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持; - 单列索引
在表中可以给单个字段创建索引,单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引; - 多列索引
多列索引是在表的多个字段上创建一个索引; - 空间索引
使用 SPATIAL 参数可以设置空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数
据的效率;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;
创建索引
创建表的时候创建索引
1
2
3
4
5
6
7CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件],
属性名 数据类型 [完整性约束条件],
....
属性名 数据类型
[UNIQUE | FULLTEXT | SPATIAL ] INDEX| KEY
[别名] (属性名 1 [(长度)] [ASC | DESC])
);在已经存在的表上创建索引
1
CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (属性名 [(长度)] [ ASC | DESC]);
5.3 用 ALTER TABLE 语句来创建索引1
ALTER TABLE 表名 ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (属性名 [(长度)] [ ASC | DESC])
删除索引
1 | DROP INDEX 索引名 ON 表名 ; |
更改索引
即删除+创建:1
ALTER TABLE `db_book`.`t_user4` DROP INDEX `index_userName_password`, ADD INDEX `index_userName_password` (`userName`);
视图
视图是一种虚拟的表,是从数据库中一个或者多个表中导出来的表。数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。
视图使操作简便化,增加数据的安全性以及提高表的逻辑独立性。
创建视图
1 | CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }] |
- ALGORITHM 是可选参数,表示视图选择的算法;
- “视图名”参数表示要创建的视图的名称;
- “属性清单”是可选参数,其指定了视图中各种属性的名词,默认情况下与 SELECT 语句中查询的属性相同;
- SELECT 语句参数是一个完整的查询语句,标识从某个表查出某些满足条件的记录,将这些记录导入视图中;
- WITH CHECK OPTION 是可选参数,表似乎更新视图时要保证在该视图的权限范围之内;
ALGORITHM 包括 3 个选项 UNDEFINED、MERGE 和 TEMPTABLE。其中,UNDEFINED 选项表示 MySQL 将自动选择所要使用的算法;MERGE 选项表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分;TEMPTABLE 选项表示将视图的结果存入临时表,然后使用临时表执行语句;CASCADED是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL 表示更新视图时,要满足该视图本身的定义条件即可。
查看视图
- DESCRIBE 语句查看视图基本信息
- SHOW TABLE STATUS LIKE ‘视图名’ 语句查看视图基本信息
- SHOW CREATE VIEW 视图名 语句查看视图详细信息
- 在 views 表中查看视图详细信息
修改视图
修改视图实际上就是修改视图中显示的字段
CREATE OR REPLACE VIEW 语句创建或修改视图
1
2
3
4CREATE OR REPLACE [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 视图名 [( 属性清单 )]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];ALTER 语句修改视图
1
2
3
4ALTER [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 视图名 [( 属性清单 )]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
更改视图
更新视图是指通过视图来插入(INSERT) 、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟的表,其中没有数据。通过视图更新时,都是转换基本表来更新,也就是在原表中进行更改。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。
增删改的操作同对普通表的操作类似。
删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据;1
DROP VIEW [ IF EXISTS ] 视图名列表 [ RESTRICT | CASCADE ]
触发器
触发器(TRIGGER)是由事件来触发某个操作。这些事件包括 INSERT 语句、UPDATE 语句和 DELETE 语句。
当数据库系统执行这些事件时,就会激活触发器执行相应的操作。
创建与使用触发器
- 创建只有一个执行语句的触发器
1
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句
典型用法是这样的:1
2
3CREATE TRIGGER trig_bookType AFTER INSERT
ON t_book FOR EACH ROW
UPDATE t_bookType SET bookNum=bookNum+1 WHERE new.bookTypeId=t_booktype.`id`;
其中需要注意的是,new表示过程对象,就是指代正在插入的这条语句。相应的,old表示正在删除的对象。
- 创建有多个执行语句的触发器
1
2
3
4
5CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
查看触发器
1 | SHOW TRIGGERS; |
删除触发器
1 | DROP TRIGGER 触发器名; |
MySQL相关函数
有很多的内置具体的用法可以在手册中详细查询。这里举几个典型的例子:
日期和时间函数
- NOW() 当前时间
- CURDATE() 返回当前日期;
- CURTIME() 返回当前时间;
- MONTH(d) 返回日期 d 中的月份值,范围是 1~12
字符串函数
- CHAR_LENGTH(s) 计算字符串 s 的字符数;
- UPPER(s) 把所有字母变成大写字母;
- LOWER(s) 把所有字母变成小写字母;
数学函数
- ABS(x) 求绝对值
- SQRT(x) 求平方根
- MOD(x,y) 求余
加密函数
- PASSWORD(str) 一般对用户的密码加密 不可逆
- MD5(str) 普通加密 不可逆
- ENCODE(str,pswd_str) 加密函数,结果是一个二进制数,必须使用 BLOB 类型的字段来保存它;
- DECODE(crypt_str,pswd_str) 解密函数;
存储过程和函数
存储过程和函数是在数据库中定义一些 SQL 语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的 SQL 语句。 存储过程和函数可以避免开发人员重复的编写相同的 SQL 语句。 而且,存储过程和函数是在 MySQL 服务器中存储和执行的,可以减少客户端和服务器端的数据传输。
总而言之,存储过程类似于方法的封装,存储过程简单、安全、高性能。
创建存储过程
创建存储过程的操作是这样:1
2CREATE PROCEDURE sp_name([proc_parameter[,...]])
[characteristic...] routine_body
其中:
- sp_name 参数是存储过程的名称;
- proc_parameter 表示存储过程的参数列表;
- characteristic 参数指定存储过程的特性;
- routine_body 参数是 SQL 代码的内容,可以用 BEGIN…END 来标志 SQL 代码的开始和结束。
- proc_parameter 中的每个参数由 3 部分组成。这 3 部分分别是输入输出类型、参数名称和参数类型。
[ IN | OUT | INOUT ] param_name type
其中,IN 表示输入参数;OUT 表示输出参数;INOUT 表示既可以是输入,也可以是输出;param_name 参数是
存储过程的参数名称;type 参数指定存储过程的参数类型,该类型可以是 MySQL 数据库的任意数据类型; - Characteristic 参数有多个取值。其取值说明如下:
创建存储函数
存储函数和存储过程非常相似,主要区别是存储函数更偏向函数1
2
3CREATE FUNCTION sp_name ( [func_parameter[,...]] )
RETURNS type
[ characteristic... ] routine_body
其中:
- sp_name 参数是存储函数的名称;func_parameter 表示存储函数的参数列表;
- RETURNS type 指定返回值的类型;
- characteristic 参数指定存储过程的特性,该参数的取值与存储过程中的取值是一样的;
- routine_body 参数是 SQL 代码的内容,可以用 BEGIN…END 来标志 SQL 代码的开始和结束;
- func_parameter 可以由多个参数组成,其中每个参数由参数名称和参数类型组成,其形式如下:
- param_name type 其中,param_name 参数是存储函数的参数名称;type 参数指定存储函数的参数类型,该类型可以是 MySQL 数据库的任意数据类型;
变量的使用
变量是在存储过程和函数中定义的中间变量。注意,只有在存储过程和存储函数中存在的中间变量才有意义,变量不能单独的存在。
定义变量1
DECLARE var_name [,...] type [ DEFAULT value ]
赋值:1
2SET var_name = expr [,var_name=expr] ...
SELECT col_name[,...] INTO var_name[,...] FROM table_name WHERE condition
游标
查询语句可能查询出多条记录,在存储过程和函数中使用游标来逐条读取查询结果集中的记录。
游标的使用包括声明游标、打开游标、使用游标和关闭游标。游标必须声明在处理程序之前,并且声明在变量和条件之后。
声明游标
1
DECLARE cursor_name CURSOR FOR select_statement ;
打开游标
1
OPEN cursor_name;
使用游标
1
FETCH cursor_name INTO var_name [,var_name ... ];
关闭游标1
CLOSE cursor_name;
流程控制的使用
存储过程和函数中可以使用流程控制来控制语句的执行。MySQL 中可以使用 IF 语句、CASE 语句、LOOP 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和 WHILE 语句来进行流程控制。这里就不再展开,详细的用法可以在手册进行查询。
调用存储过程和函数
调用存储过程
1
CALL sp_name( [parameter[,...]] )
调用存储函数
1
fun_name( [parameter[,...]] )
查看存储过程和函数
SHOW STATUS 语句查看存储过程和函数的状态
1
SHOW { PROCEDURE | FUNCTION } STATUS [ LIKE ‘pattern’ ] ;
SHOW CREATE 语句查看存储过程的函数的定义
1
SHOW CREATE { PROCEDURE | FUNCTION } sp_name ;
修改存储过程和函数
一般来说修改比较麻烦,不如重新建立函数关系。1
2
3
4
5ALTER { PROCEDURE | FUNCTION } sp_name [ characteristic ... ]
characteristic :
{ CONTAINS SQL } NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT ‘string’
- sp_name 参数表示存储过程或函数的名称;
- characteristic 参数指定函数的特性。
- CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句;
- NO SQL 表示子程序中不包含 SQL 语句;
- READS SQL DATA表 示 子 程 序 中 包 含 数 据 的 语 句 ;
- MODIFIES SQL DATA 表 示 子 程 序 中 包 含 写 数 据 的 语 句 。
- SQLSECURITY{ DEFINER | INVODER } 指明谁有权限来执行。
- DEFINER 表示只有定义者自己才能够执行;
- INVODER 表示调用者可以执行。
- COMMENT ‘string’ 是注释信息。
删除存储过程和函数
1 | DROP {PROCEDURE | FUNCTION } sp_name ; |
数据备份与还原
备份数据可以保证数据库中数据的安全,数据库管理员需要定期的进行数据库备份;
数据备份
在命令行中,执行这个语句:1
mysqldump -u username -p dbname table1 table2 ... > BackupName.sql
- dbname 参数表示数据库的名称;
- table1 和 table2 参数表示表的名称,没有该参数时将备份整个数据库;
- BackupName.sql 参数表示备份文件的名称,文件名前面可以加上一个绝对路径。通常以 sql 作为后缀。
数据还原
1 | Mysql -u root -p [dbname] < backup.sql |
dbname 参数表示数据库名称。该参数是可选参数,可以指定数据库名,也可以不指定。指定数据库名时,表示还原该数据库下的表。不指定数据库名时,表示还原特定的一个数据库。而备份文件中有创建数据库的语句。