MySQL
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。
所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:
- 数据以表格的形式出现
- 每行为各种记录名称
- 每列为记录名称所对应的数据域
- 许多的行和列组成一张表单
- 若干的表单组成database
RDBMS 术语
- 数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 - 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。 - 冗余: 存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键: 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键: 外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引: 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
MySQL的安装、卸载、启动、登录
https://blog.csdn.net/su2231595742/article/details/107972521
什么是SQL
Structured Query Language 结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,就成为“方言”
SQL 作用
- 是一种所有关系型数据库的查询规范,不同的数据库都支持。
- 通用的数据库操作语言,可以用在不同的数据库中。
- 不同的数据库 SQL 语句有一些区别
SQL 语句分类
- Data Definition Language (DDL数据定义语言)如:建库,建表
- Data Manipulation Language (DML数据操纵语言)如:对表中的记录操作增删改
- Data Query Language(DQL 数据查询语言)如:对表中的查询操作
- Data Control Language(DCL 数据控制语言)如:对用户权限的设置
SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾
- 可使用空格和缩进来增强语句的可读性
- MYSQL 数据库的SQL语句不区分大小写,关键字建议使用大写
- 3种注释
注释的语法 | 说明 |
---|---|
–空格 注释内容 | 单行注释 |
/* */ | 多行注释 |
#注释内容 | 这是 mysql 特有的注释方式 |
数据库的备份和还原
- 命令行:
- 语法:mysqldump -u用户名 -p密码 数据库名 > 保存的路径
- 还原:
- 登录数据库
- 创建数据库
- 使用数据库
- 执行文件。source文件路径
- 图形化工具
DDL 操作数据库
-
操作数据库:CRUD
- C(Create): 创建
1.CREATE DATABASE 数据库名;
- 判断数据库是否已经存在,不存在则创建数据库:
create detabase if not exists 数据库名;
- 创建数据库并指定字符集:
creare database 数据库名 character set 字符集;
- R(Retrieve): 查询
- 查询所有数据库的名称:
show databases;
- 查询某个数据库的字符集(查询某个数据库的创建语句):
show create database 数据库名称;
- U(Updata): 修改
- 修改数据库默认的字符集:
alter database 数据库名 character set 字符集;
- D(Delete): 删除
- 删除数据库:
drop database 数据库名;
- 判断数据库是否存在,存在则删除:
drop database if exists 数据库名;
- 使用数据库
- 查询当前正在使用额数据库名称:
select database();
- 使用数据库:
use 数据库;
- C(Create): 创建
-
操作表结构
- C(Create): 创建
- 创建表:
create table 表名( 列名1 数据类型1, 列名2 数据类型2, `` ```, 列名n 数据类型n );
- 数据类型
- R(Retrieve): 查询
- 查看某个数据库中的所有表:
show tables;
- 查询表结构:
desc 表名;
- 查看创建表:
show create table 表名;
- U(Updata): 修改
- 修改表名:
alter table 表名 rename to 新的表名;
- 修改表的字符集:
alter table 表名 character set 字符集;
- 添加一列:
alter table 表名 add 列名 数据类型;
- 修改列名 类型:
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型;
- 删除列:
alter table 表名 drop 列名;
- D(Delete): 删除
1.drop table 表名;
drop table if exists 表名;
- C(Create): 创建
DML: 增删改表中数据
- 添加数据:
1.insert into 表名(列名1,列名2,... 列名n) values(值1,值2, ... 值n)
- 注意:
- 列名和值要一 一对应
- 如果表名后补定义列名,则默认给所有列添加值
- 如果数据是字符型,必须使用单引号或者双引号,如:“value”。
- 注意:
- 删除数据:
1.delete from 表名 [where 条件]
- 如果没有指定 WHERE 子句,表中的所有记录将被删除。
- 如果要删除所有记录:
1.delete form 表名; -- 不推荐使用,有多少删多少
truncate table 报名; -- 先删表,再创建一张一样的表
- 修改数据:
1.update 表名 set 列名1=值1,列名2=值2,...[where 条件]
1. 如果不加条件,则会将表中所有记录全部修改
DQL: 查询表中的记录
- 基础查询:
- 多个字段查询:
select 字段名 1, 字段名 2, 字段名 3, ... form 表名;
- 查询表所有行和列的数据:
select * form 表名;
- 查询表所有行和列的数据:
- 去除重复:
- 查询指定列并且结果不出现重复数据:
select distinct 字段名 from 表名;
- 查询指定列并且结果不出现重复数据:
- 计算列
- 一般可以使用四则运算计算一些列的值。
- ifnull(表达式1,表达式2)
- 表达式1: 哪个字段需要判断是否为null
- 如果该字段为null后的替换值
- 起别名
- 对列指定别名:
select 字段名1 as 别名, 字段名2 as 别名... from 表名;
- 对列和表同时指定别名: 对列指定别名:
select 字段名1 as 别名, 字段名2 as 别名... from 表名 as 表别名;
- 使用别名的好处:显示的时候使用新的名字,并不修改表的结构。
- 对列指定别名:
- 多个字段查询:
- 条件查询
- select 字段名 form 表名 where 条件;
- 运算符
>、<、<=、>=、=、<> //<>在SQL中表示不等于,在mysql中也可以使用!= 没有==
BETWEEN...AND //在一个范围之内,如:between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾
IN(集合) //集合表示多个值,使用逗号分隔
LIKE '张%' //模糊查询
IS NULL //查询某一列为 NULL 的值,注:不能写=NULL
and 或 && //与,SQL 中建议使用前者,后者并不通用。
or 或 || //或
not 或 ! //非
模糊查询
- SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
- selcet * from 表名 where 字段名 between 100 and 200;
-
排序查询
- 单列排序:
select * from 表名 order by asc/ desc; 升序/降序,默认升序
- 组合排序:
select * from 表名 order by 字段名1[asc/desc], 字段名2[asc/desc],...;
- 单列排序:
-
聚合函数: 将一列数据作为一个整体,进行纵向的计算
- count 计算个数
1.select count(字段) from 表名;
- 一般选择非空的列:主键
- count(*)
- max: 计算最大值
- min:计算最小值
- sum: 计算和
- avg: 计算平均值
- 聚合函数的计算,自动排除null值
- 解决方案:
- 选择不包含非空的列进行计算
- ifnull函数
- 解决方案:
- count 计算个数
-
分组查询:
- 语法:group by 分组字段;
- select 字段1,字段2, … from 表名 group by 分组字段 [having 条件]
select sex, avg(math) from student3 group by sex; -- 按性别进行分组,求男生和女生数学的平均分
- where 和 having 的区别
- where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
- where 后不可以跟聚合函数,having可以进行聚合函数的判断。
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex having COUNT(*) >2; -- 查询年龄大于 25 岁的人,按性别分组,统计每组的人数,并只显示性别人数大于 2 的数据
-
分页查询
- select * from表名 limit字句;
- limit 开始的索引,每页查询的条数
- 公式: 开始的索引 = (当前的页码 - 1)*每页显示的条数
DCL
我们现在默认使用的都是 root 用户,超级管理员,拥有全部的权限。但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。
- 管理用户:
- 添加用户:
create user '用户名'@'主机名' identified by '密码';
- 删除用户:
drop user '用户名'@'主机名';
- 修改用户密码:
1. update user set password = password('新密码') where user = '用户名'; 2. set password for '用户名'@'主机名' = password('新密码');
- mysql中忘记了root用户的密码?
- 管理员身份运行cmd --> net stop mysql 停止mysql服务
- 使用无验证方式启动mysql服务:mysql --skip-grant-tables
- 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
- 改密码
- 关闭两个窗口
- 打开任务管理器,手动结束mysqld.exe进程
- 启动msql服务,使用新密码登录
- mysql中忘记了root用户的密码?
- 查询用户:
1. 切换到mysql数据库 use mysql; 2. 查询user表 select * from user;
- 添加用户:
- 权限管理:
- 查询权限:
show gtants for '用户名'@'主机名';
- 授予权限:
grant 权限 1, 权限 2... on 数据库名.表名 to '用户名'@'主机名'; grant all on *.* to 'user2'@'%';给 user2 用户分配所有权限,对任意数据库的所有表
- 撤销权限:
revoke 权限 1, 权限 2... on 数据库.表名 from '用户名'@'主机名';
- 查询权限:
约束
- 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
- 分类:
- 主键: primary key
- 唯一: unique
- 非空: not null
- 外键: foreign key
- 非空约束: not null,某一列的值不能为null
- 创建表时添加约束
create table st8 ( id int, name varchar(20) not null, gender char(1) )
- 创建表后,添加非空约束
alter table 表名 modify name varchar(20) not null
- 删除name的非空约束
alter table 表名 modify name varchar(20);
- 创建表时添加约束
- 唯一约束: unique,某一列的值不能重复
- 注意:
- 唯一约束可以有null值,但是只能有一条记录为null
- 在创建表时,条件唯一约束
create table stu( id int, phone_number varchar(11) unique );
- 删除唯一约束
alter table 表名 drop index phone_number;
- 在表创建完成后,添加唯一约束
alter table 表名 modify phone_number varchar(11) unique;
- 注意:
- 主键约束: primary key
- 注意:
- 含义: 非空切唯一
- 一张表只能有一个字段为主键
- 主键就是表中记录的唯一标识
- 在创建表时,添加主键约束
create table stu( id int primary key, name varchar(11) );
- 删除主键
alter table stu drop primary key;
- 创建完表后,添加主键
alter table stu modify id int primary key;
- 自动增长
- 概念: 如果某一列是数值类型的,使用auto_increment可以来完成值得自动增长
- 在创建表时,添加主键约束,并且完成主键自增长
create table stu( id int primary key auto_increment, name varchar(20) );
- 删除自动增长
alter table stu modify in int;
- 添加自动增长
alter table stu modify in int auto_increment;
- 注意:
- 外键约束:foreign key,让表与表产生关系,从而保证数据的正确性
- 在创建表时,可以添加外键
- 语法:
create table 表名( ... 外键列 constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名称) );
- 语法:
- 删除外键
alter table 表名 drop foreign key 外键名称;
- 创建表之后,添加外键
alter table 表名 add constarint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称);
- 级联操作:如果想在更新主表时,同步更新从表,就需要用到级联操作
-
添加级联操作
语法: alter table 表名 add constraint 外键全名``` foreign key(外键字段名称) references 主表名称(主表列名称) on update cascade on delete cascade; ```
-
分类:
- 级联更新: on update cascade
- 级联删除: on delete cascade
-
规则:
- 如果主表没有相关的记录,从表不能插入
- 先插入主表数据后再插入从表数据
- 删除时先删除从表记录再删除主表记录
-
- 在创建表时,可以添加外键
多表关系
- 多表之间的关系
- 分类:
- 一对一
- 一对多(多对一)
- 多对多
- 实现关系:
- 一对多(多对一):
- 如:部门和员工
- 实现方式: 在多的一方建立外键,指向一的一方的主键
- 多对多:
- 如:学生和课程
- 实现方式:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
- 一对一:
- 如:人和身份证
- 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键
- 一对多(多对一):
- 分类:
- 数据库设计的范式
- 概念: 设计数据时,需要遵循的一些规范
- 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
- 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
- 分类:
- 第一范式(1NF): 每一列都是不可分割的原子数据项
- 第二范式(2NF): 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
- 函数依赖:某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。
- 完全函数依赖: 在一个关系中,若某个非主属性数据项依赖于全部关键字称之为完全函数依赖。
- 部分函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
- 传递函数依赖:A–>B, B–>C. 如果通过A属性的值,可以确定唯一B属性的值,再通过B属性的值可以确定唯一C属性的值,则称 C 传递函数依赖于 A
- 码: 如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性为该表的码。
- 主属性: 码属性组中的所有属性
- 非主属性:除过码属性组的属性
- 第三范式(3NF): 在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
- 概念: 设计数据时,需要遵循的一些规范
多表查询
- 什么是多表查询:有时一个查询结果需要从两个或两个以上表中提取字段数据,此时需要使用的就是多表关联查询。
- 分类:
- 内连接查询:
- 隐式内连接:使用where
- 显式内连接:
select 字段列表 from 表名1 [inner] join 表名2 on 条件;
- 内连接查询:
- 从哪些表找那个查询数据
- 条件是什么
- 查询哪些字段
- 外连接查询:
-
左外连接:
select 字段名 from 左表 left[outer] join 右表 on 条件;
- 查询的是左表数据以及其交集部分
-
右外连接:
select 字段名 from 左表 right[outer] join 右表 on 条件;
- 查询的是右表所有数据以及其交集部分
-
- 子查询:
- 概念: 查询中嵌套查询,称嵌套查询为子查询
select 查询字段 from 表名 where 字段 = (子查询);
- 子查询不同情况:
- 子查询的结果是单行单列
- 子查询可以作为条件,使用运算符去判断
- 查询工资小于平均工资的员工有哪些?
select * from emp where salary < (select avg(salary) from emp);
- 子查询的结果是多行单列
- 子查询可以作为条件,使用运算符in来判断
- select 字段名 from 表 where 字段 in (子字段);
- 子查询的结果是多行多列
- select 查询字段 from (子查询) 表别名 where 条件;
- – 查询所有的部门信息,与上面的虚拟表中的信息组合,找出所有部门 id 等于的 dept_id
select * from dept d, (select * from emp where join_date >='2011-1-1') e where d.`id`= e.dept_id ;
- 子查询的结果是单行单列
- 小结:
- 子查询结果只要是单列,则在 WHERE 后面作为条件
- 子查询结果只要是多列,则在 FROM 后面作为表进行二次查询
- 内连接查询:
- 笛卡尔积现象:
- 有两个集合A,B 取这两个集合的所有组成情况
- 要完成多表查询,需要消除无用的数据
事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 事务的基本介绍
- 概念:如果一个包含多个步骤的业务操作,事务管理,那么这些操作要么同时成功,要是同时失败。
- 操作:
- 开始事务:begin 或 start transaction;
- 回滚: rollback;
- 提交: commit;
- MySQL数据库中事务默认自动提交
- 事务提交两种方式:
- 自动提交:
- mysql就是自动提交的
- 一条DML(增删改)语句会自动提交一次事务
- 手动提交:需要先开始事务,再提交
- 自动提交:
- 修改事务的默认提交方式:
- 查看事务的默认提交方式:select @@autocommit; – 1 代表自动提交, 0 代表手动提交
- set autocommit = 0 禁止自动提交
- set autocommit = 1 开启自动提交
- 事务提交两种方式:
- 事务的四大特征:
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 事务的隔离级别
- 概念:多个事务之间是隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
- 存在问题:
- 脏读: 一个事务,读取到另一个事务中没有提交的数据
- 不可重复读(虚读): 在同一个事务中,两次读取到的数据不一样
- 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
- 隔离级别:
- read uncommitted:读未提交
- 产生的问题:脏读、不可重复读、幻读
- read committed:读已提交
- 产生的问题:不可重复读、幻读
- repeatable read:可重复读(MySQL默认)
- 产生的问题:幻读
- serializable:串行化
- 可以解决所有的问题
- 隔离级别从小到大安全性越来越高,但是效率越来越低
- 数据库查询隔离级别:
select @@tx_isolation; - 数据库设置隔离级别:
set global transaction isolation level 级别字符串;
- read uncommitted:读未提交
视图
视图是由数据库中的一个表或多个表导出的虚拟表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库表中的数据,而只关心对自己有用的数据。
视图的作用:
- 使操作简单化
- 增加数据的安全性
- 提高表的逻辑独立性
- 创建视图
- 语法
create view 视图名 as select 语句 [with check option]
- 在单表上创建视图
create view 视图名 as select * from 表名;
- 在多表上创建视图
create view 视图名 as select 字段列表 from 表1,表2... where 条件
- 语法
- 查看视图
- 语法
describe 视图名; describe 可缩写为 desc
- 查看视图基本信息
show table status like 视图名;
- 查看视图详细信息
show create view 视图名;
- 语法
- 修改视图
create or replace view 视图名 as select语句; 或 alter view 视图名 as select语句;
- 更新视图
update 视图名 set ...;
- 删除视图
drop view [if exists] 视图名;
MySQL中视图和表的区别及联系是什么?
两者的区别:
- 视图是按照SQL语句生成的一个虚拟的表
- 视图不占世纪的物理空间。而表中的记录需要占用物理空间。
- 建立和删除视图只影响视图本身,不会影响实际的记录。而建立和删除表会影响实际的记录。
两者的联系:
- 视图是在基本表之上建立的表,其字段和记录都来自基本表,其依赖基本表而存在。
- 一个视图可以对应一个基本表,也可以对应多个基本表。
- 视图是基本表的抽象,在逻辑意义上建立的新关系。
索引
索引是创建在表上的,是对数据库表中一列或多列的值进行排序的一种结构,其作用是提高对表中数据的查询速度。
特点:
- 索引的优点是可以提高检索数据的速度,这是创建索引的最主要原因;对于有依赖关系的子表和父表之间的联合查询时,可以提高查询速度;使用分组和排序字句进行数据查询时,同样可以显著节省查询中分组和排序的时间。
- 索引的缺点是创建和维护索引需要耗费时间,好费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除、和修改数据时,要动态的维护索引,造成数据的维护速度降低了。
分类:
- 普通索引
- 在创建索引时,不附加任何限制条件。这类索引可以创建在任何数据类型中,其值是否唯一和非空由字段本身的完整性约束条件决定。建立索引以后,查询时可以通过索引进行查询。
- 唯一性索引
- 使用unique参数可以设置索引为唯一性索引。在创建唯一性索引时,限制改索引的值必须是唯一的。通过唯一性索引,可以更快速地确定某条记录。主键就是一种特殊唯一性索引。
- 全文索引
- 使用fulltext参数可以设置索引为全文索引。全文索引只能创建在char、varchar或text类型的字段上。查询数据量大的字符类型的字段时,使用全文索引可以调高查询速度。
- 单列索引
- 在表中的的那个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。
- 多列索引
- 多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中是用来这些字段中第一个字段时,索引才会被使用。
- 空间索引
- 使用spatial参数可以设置索引为空间索引。空间索引只能建立在空间数据类型上,遮掩可以提高系统获取空间数据的效率。MySQL中的空间数据类型包括geometry和point、linestring和polygon等。目前只有MyISAM存储引擎支持空间检索,而且索引的字段不能为空值。
创建索引:
- 创建表时创建索引:
create table 表名( 属性名 数据类型 ... [unique | fulltext | spatial] index|key [别名] --index和可以参数用来指定字段为索引的,选其一就可 (属性名1 [(长度)] [asc|desc]) --属性1 参数指定索引对应的字段名称,长度指索引的长度,必须是字符串类型才可以使用;asc/desc 升序\排序 );
- 创建普通索引: 创建普通索引时不需要添加任何 unique、fulltext、或者spatial参数。
- 创建唯一性索引:
需要用unique参数进行约束 - 创建全文索引:
全文索引只能创建在char、varchar或text 类型的字段上。而且,现在只有MyISAM存储引擎支持全文索引。 - 创建单列索引:
创建单列索引是在表的单个字段上创建索引。 - 创建多列索引:
创建多列索引是在表的多个字段上创建一个索引。 - 创建控件索引:
创建空间索引时必须使用spatial参数来设置。创建空间索引时,表的存储引擎必须是MyISAM类型。而且,索引字段必须有非空约束。
- 在已经存在的表上创建索引:
create [unique | fulltext | spatial] index 索引名 on 表名 (属性名 [(长度)] [asc|desc]);
- 用alter table语句来创建索引:
alter table 表名 add [unique | fulltext | spatial] index 索引名(属性名 [(长度)] [asc|desc]);
删除索引:
```
drop index 索引名 on 表名;
```
索引的设计原则:
- 选择唯一性索引
- 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
- 为经常需要排序、分组和联合操作的字段建立索引
- 经常需要order by、group by、distinct和union等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。
- 为常作为查询条件的字段建立索引
- 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。
- 限制索引的数目
- 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使跟新表变得很浪费时间。
- 尽量使用数据量少的索引
- 如果索引的值很长,那么查询的速度会受到影响。
- 尽量使用前缀来索引
- 如果索引字段的值很长,最好使用值的前缀来索引。
- 删除不再使用或者很少使用的索引
- 表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将他们删除,从而减少索引对更新操作的影响。
注意:选择索引的最终目的是为了使查询的额速度更快。上面给出的原则是最基本的准则,但不能拘泥于上面的准则。应根据应用的实际情况进行分析和判断,选择最合适的索引方式。
函数
- 数学函数:
函数 | 作用 |
---|---|
ABS(x) | 返回 x 的绝对值 |
CEIL(x) | 返回大于或等于 x 的最小整数 |
CEILING(x) | 返回大于或等于 x 的最小整数 |
FLOOR(x) | 返回小于或等于 x 的最大整数 |
RAND() | 返回 0 到 1 的随机数 |
ROUND(x) | 返回离 x 最近的整数 |
GREATEST(expr1, expr2, expr3, …) | 返回列表中的最大值 |
LEAST(expr1, expr2, expr3, …) | 返回列表中的最小值 |
MIN(expression) | 返回字段 expression 中的最小值 |
MAX(expression) | 返回字段 expression 中的最大值 |
TRUNCATE(x,y) | 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入) |
SUM(expression) | 返回指定字段的总和 |
AVG(expression) | 返回一个表达式的平均值,expression 是一个字段 |
COUNT(expression) | 返回查询的记录总数,expression 参数是一个字段或者 * 号 |
SIN(x) | 求正弦值(参数是弧度) |
ASIN(x) | 求反正弦值(参数是弧度) |
COS(x) | 求余弦值(参数是弧度) |
ACOS(x) | 求反余弦值(参数是弧度) |
TAN(x) | 求正切值(参数是弧度) |
ATAN(x) | 求反正切值(参数是弧度) |
ATAN2(n, m) | 求反正切值(参数是弧度) |
COT(x) | 求余切值(参数是弧度) |
DEGREES(x) | 将弧度转换为角度 |
RADIANS(x) | 将角度转换为弧度 |
n DIV m | 整除,n 为被除数,m 为除数 |
POW(x,y) POWER(x,y) | 返回 x 的 y 次方 |
EXP(x) | 返回 e 的 x 次方 |
SQRT(x) | 返回x的平方根 |
MOD(x,y) | 返回 x 除以 y 以后的余数 |
PI() | 返回圆周率(3.141593) |
LN | 返回数字的自然对数,以 e 为底。 |
LOG(x) 或 LOG(base, x) | 返回自然对数(以 e 为底的对数),如果带有 base 参数,则 base 为指定带底数。 |
LOG2(x) | 返回以 2 为底的对数 |
LOG10(x) | 返回以 10 为底的对数 |
- 字符串函数:
函数 | 描述 |
---|---|
ASCII(s) | 返回字符串 s 的第一个字符的 ASCII 码。 |
CHAR_LENGTH(s) , CHARACTER_LENGTH(s) | 返回字符串 s 的字符数 |
CONCAT(s1,s2…sn) | 字符串 s1,s2 等多个字符串合并为一个字符串 |
CONCAT_WS(x, s1,s2…sn) | 同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符 |
FIELD(s,s1,s2…) | 返回第一个字符串 s 在字符串列表(s1,s2…)中的位置 |
FIND_IN_SET(s1,s2) | 返回在字符串s2中与s1匹配的字符串的位置 |
FORMAT(x,n) | 函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入。 |
INSERT(s1,x,len,s2) | 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串 |
RPAD(s1,len,s2) | 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len |
MID(s,n,len) | 从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len) |
LOCATE(s1,s) | 从字符串 s 中获取 s1 的开始位置 |
POSITION(s1 IN s) | 从字符串 s 中获取 s1 的开始位置 |
LCASE(s) | 将字符串 s 的所有字母变成小写字母 |
LOWER(s) | 将字符串 s 的所有字母变成小写字母 |
UCASE(s),UPPER(s) | 将字符串转换为大写 |
LEFT(s,n) | 返回字符串 s 的前 n 个字符 |
RIGHT(s,n) | 返回字符串 s 的后 n 个字符 |
LPAD(s1,len,s2) | 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len |
LTRIM(s) | 去掉字符串 s 开始处的空格 |
RTRIM(s) | 去掉字符串 s 结尾处的空格 |
TRIM(s) | 去掉字符串 s 开始和结尾处的空格 |
REPEAT(s,n) | 将字符串 s 重复 n 次 |
REPLACE(s,s1,s2) | 将字符串 s2 替代字符串 s 中的字符串 s1 |
REVERSE(s) | 将字符串s的顺序反过来 |
SPACE(n) | 返回 n 个空格 |
STRCMP(s1,s2) | 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1< s2 返回 -1 |
SUBSTR(s, start, length),SUBSTRING(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 |
- 日期和时间函数:
函数名 | 描述 |
---|---|
ADDDATE(d,n) | 计算起始日期 d 加上 n 天的日期 |
ADDTIME(t,n) | 时间 t 加上 n 秒的时间 |
CURDATE() | 返回当前日期 |
CURRENT_DATE() | 返回当前日期 |
CURRENT_TIME | 返回当前时间 |
CURRENT_TIMESTAMP() | 返回当前日期和时间 |
CURTIME() | 返回当前时间 |
DATE() | 从日期或日期时间表达式中提取日期值 |
DATEDIFF(d1,d2) | 计算日期 d1->d2 之间相隔的天数 |
DATE_ADD(d,INTERVAL expr type) | 计算起始日期 d 加上一个时间段后的日期 |
DATE_FORMAT(d,f) | 按表达式 f的要求显示日期 d |
DATE_SUB(date,INTERVAL expr type) | 函数从日期减去指定的时间间隔。 |
DAY(d) | 返回日期值 d 的日期部分 |
DAYNAME(d) | 返回日期 d 是星期几,如 Monday,Tuesday |
DAYOFMONTH(d) | 计算日期 d 是本月的第几天 |
DAYOFWEEK(d) | 日期 d 今天是星期几,1 星期日,2 星期一,以此类推 |
DAYOFYEAR(d) | 计算日期 d 是本年的第几天 |
FROM_DAYS(n) | 计算从 0000 年 1 月 1 日开始 n 天后的日期 |
HOUR(t) | 返回 t 中的小时值 |
LAST_DAY(d) | 返回给给定日期的那一月份的最后一天 |
LOCALTIME(),LOCALTIMESTAMP() | 返回当前日期和时间 |
MAKEDATE(year, day-of-year) | 基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期 |
MAKETIME(hour, minute, second) | 组合时间,参数分别为小时、分钟、秒 |
MICROSECOND(date) | 返回日期参数所对应的微秒数 |
MINUTE(t) | 返回 t 中的分钟值 |
MONTHNAME(d) | 返回日期当中的月份名称,如 November |
MONTH(d) | 返回日期d中的月份值,1 到 12 |
NOW() | 返回当前日期和时间 |
PERIOD_ADD(period, number) | 为 年-月 组合日期添加一个时段 |
- 条件判断函数:
- 系统信息函数:
函数 | 作用 |
---|---|
VERSION() | 返回数据库的版本号 |
USER() | 返回当前用户 |
SESSION_USER() | 返回当前用户 |
SYSTEM_USER() | 返回当前用户 |
CURRENT_USER() | 返回当前用户 |
DATABASE() | 返回当前数据库名 |
LAST_INSERT_ID() | 返回最近生成的 AUTO_INCREMENT 值 |
- 加密函数:
函数名 | 描述 |
---|---|
password(str) | 加密函数,主要用来给用户的密码加密 |
md5(str) | 加密函数,主要对普通的数据进行加密 |
encode(str,pswd_str) | 使用pswd_str来加密字符串str,加密结果是二进制数,必须使用blob类型的字段来保存 |
decode(crypt_str, pswd_str) | 解密函数,可使用pswd_str来为crypt_str解密, crypt_str是通过encode(str,pswd_str)加密后的二进制数据。字符串pswd_str应该与加密是的字符串pswd_str是相同的 |
- 其他函数:
函数名 | 描述 |
---|---|
format(x,n) | 格式化函数,可以将数字x保留到小数点后n位,这个过程需要进行四舍五入 |
BIN(x) | 返回 x 的二进制编码 |
HEX(x) | 返回x的十六进制编码 |
oct(x) | 返回x的八进制编码 |
conv(x,f1,f2) | 将x从f1进制数变为f2进制数 |
CAST(x AS type) | 转换数据类型 |
存储过程和函数
存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。
- 创建存储过程和函数:
- 创建存储过程和函数是指将经常使用的一组SQL语句组合在一起,并将这些sql语句当做一个整体存储在MySQL服务器中。
- 创建存储过程:
create procedure 存储过程名(参数列表) [characteristic] begin 存储过程体(一组合法的SQL语句); end 注意: 1. 参数列表有三部分组成: 输入输出类型、参数名称和参数类型 [in|out|inout] param_name type in 表示输入参数;out表示输出参数;inout表示既可以输入,也可以输出。 type 指定存储过程的参数类型 2. 如果存储过程体仅仅只有一句话,begin end可以省略 存储过程中的每条SQL语句的结尾要求必须加分号。 为了避免冲突,首先用“delimiter $”将MySQL的结束符设置为 $,最后再用“delimiter;” 来将结束符恢复成分号。 delimiter $
- 创建存储函数:
create function 存储函数名([参数列表]) returns type [characteristic] begin return(SQL语句); end
- 调用存储过程和函数:
- 调用存储过程
call 存储过程名(存储列表)
- 调用存储函数
select 存储函数名
- 查看存储过程和函数:
- 查看存储过程和函数的状态:
show {procedure | function} status [link '存储过程或函数的名称'];
- 查看存储过程和函数的定义:
show create {procedure | function} 存储过程或函数的名称;
- 修改存储过程和函数:
alter {procedure | function} 存储过程或函数的名称 [characteristic] SQL security {definer | invokey};
- 删除存储过程和函数:
drop {procedure | function} 存储过程或函数的名称;
来源:oschina
链接:https://my.oschina.net/u/4399154/blog/4529473