目录

数据字段属性

一、对数据库的操作

二、对表的操作

数据表的类型

数据表的存储位置

三、对数据库表记录进行操作(修改)

1.插入记录

2.修改表的记录

3.删除表记录

4.查询操作

5.执行顺序

6.内连接(类似于取交集)

7.外连接

8.排序和分页

9.子查询

10.乐观锁和悲观锁

四、数据库的备份和还原(命令行和图形化界面)

1.数据库的备份

2.数据库的还原

五、数据库的问题排查手段

六、MySql的存储引擎

存储引擎分类

七、字符集

1. 字符集的由来

2. ASSCII

2. unicode

3. UTF-16

4. UTF-8

5. 汉字的一些常见字符集

八、数据库的优化手段

九、explain

十、常用函数

MySQL 字符串函数

MySQL 数字函数

MySQL 日期函数

MySQL 高级函数

经常使用的函数

聚合函数(注意不能直接在where后面使用)

十一、事务

十二、索引

索引的作用

分类

主键索引

唯一索引

常规索引

全文索引

索引准则

索引的数据结构

十三、权限管理

基本命令


在DOS命令窗口输入 mysql -h localhost -u root -p回车 进入mysql数据库,其中-h表示服务器名,localhost表示本地;-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,可直接在-p后链接输入,如:-p123456,用户没有设置密码,显示Enter password时,直接回车即可。注意,如果你的mysql没有安装在C盘下,你需要先使用DOS命令进入mysql的安装目录下的bin目录中。以我的电脑为例,方法如下:输入D:进入D盘,在输入cd D:\Tools\MySQL5.5.25\bin进入到mysql的bin目录下才可以输入 mysql -hlocalhost -uroot -p

sql功能分类

1. DDL:数据定义语言

用来定义数据库对象:创建库,表,列等。

(CREATE、DROP、ALTER)

2. DML:数据操作语言

用来操作数据库表中的记录

(INSERT、UPDATE、DELETE)

3. DQL:数据查询语言

用来查询数据

(SELECT)

4. DCL:数据控制语言

用来定义访问权限和安全级别

(GRANT、commit、rollback)

几个基本的数据库操作命令:

update user set password=password('123456')where user='root'; 修改密码
flush privileges; 刷新数据库
show databases; 显示所有数据库
use [dbname]; 打开某个数据库
show tables; 显示数据库mysql中所有的表
describe user; 显示表mysql数据库中user表的列信息  简写是desc user
create database name; 创建数据库
use databasename; 选择数据库
exit; 退出Mysql
? 命令关键词 : 寻求帮助
-- 表示注释
 

SQL数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持所有标准SQL数值数据类型。

MySQL支持多种类型,大致可以分为三类:

1. 数值类型

在这里插入图片描述

2. 字符串类型

在这里插入图片描述

3. 日期和时间类型

在这里插入图片描述

NULL值

  • 理解为 "没有值" 或 "未知值"
  • 不要用NULL进行算术运算 , 结果仍为NULL

数据字段属性


UnSigned

  • 无符号的
  • 声明该数据列不允许负数 .

ZEROFILL

  • 0填充的
  • 不足位数的用0来填充 , 如int(3),5则为005
     

Auto_InCrement

  • 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
  • 通常用于设置主键 , 且为整数类型
  • 可定义起始值和步长

              当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
               SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)


NULL 和 NOT NULL

  • 默认为NULL , 即没有插入该列的数值
  • 如果设置为NOT NULL , 则该列必须有值

DEFAULT

  • 默认的
  • 用于设置默认值
  • 例如,性别字段,默认为"男" , 否则为 "女" ; 若无指定该列的值 , 则默认值为"男"的值
     

一、对数据库的操作

1.创建一个库

create database [if not exists] 库名           -----这里得if not exists 表示如果没有就创建,有就不创建

 create database 库名 character set 编码

创建带有编码的(如果是utf-8的需要写utf8)

查看编码数据库编码:

show variables like 'character_set_database';

2.删除一个库

drop database 库名

3.使用库

use 库名

4.查看当前正在操作的库

二、对表的操作

1.创建一张表

create table 表名(

    字段名 类型(长度) [约束],

    字段名 类型(长度) [约束],

    字段名 类型(长度) [约束]

);

create table [if not exists] `表名`(
'字段名1' 列类型 [属性][索引][注释],
'字段名2' 列类型 [属性][索引][注释],
#...
'字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];

说明 : 反引号用于区别MySQL保留字与普通字符而引入的 (键盘esc下面的键).
 

如果要自定义自增是从哪里开始,例如下面的建表

create table a(
id int primary key auto_increment,
name varchar(20)
)engine=INNODB DEFAULT charset=utf8 auto_increment=10

2.查看数据库表

创建完成之后,我们可以查看数据库表

show tables

查看表的结构

desc 表名

3.删除一张表

drop table 表名

4.修改表

4.1添加一列alter

alter table 表名 add 字段名 类型(长度)[约束]

4.2修改列的类型(长度,约束)

alter table 表名 modify 要修改的字段名 类型(长度) [约束]

4.3修改列的列名

alter table 表名 change 旧列名 新列名 类型(长度) [约束]

4.4删除表的列

alter table 表名 drop 列名

4.5修改表名

rename table 表名 to 新表名

4.6修改表的字符集

alter table 表名 character set 编码

查看当前表的编码

数据表的类型

CREATE TABLE 表名(
-- 省略一些代码
-- Mysql注释
-- 1. # 单行注释
-- 2. /*...*/ 多行注释
)ENGINE = MyISAM (or InnoDB)
-- 查看mysql所支持的引擎类型 (表类型)
SHOW ENGINES;

MySQL的数据表的类型 : MyISAM , InnoDB , HEAP , BOB , CSV等...
常见的 MyISAM 与 InnoDB 类型:
 

除了上面的这些区别外,还有就是存储文件的区别,MyISAM的索引文件的存储时以非聚集的方式进行存储,也就是index索引文件和data数据是分开存储,只是index的索引文件的叶子节点存储了数据的物理地址,通过这个存储的物理地址来找到对应的数据,所以有MYI和MYD文件。而InnnoDB的主键索引是以聚集索引的存储格式,也就是在索引文件B+树的叶子节点中存储了数据,所有只有一个idb文件

经验 ( 适用场合 ) :

  • 适用 MyISAM : 节约空间及相应速度
  • 适用 InnoDB : 安全性 , 事务处理及多用户操作数据表

数据表的存储位置

MySQL数据表以文件方式存放在磁盘中

  • 包括表文件 , 数据文件 , 以及数据库的选项文件
  • 位置 : Mysql安装目录\data\下存放数据表 . 目录名对应数据库名 , 该目录下文件名对应数据表

.
注意 :

  • InnoDB类型数据表只有一个 *.frm文件 , 以及上一级目录的ibdata1文件
  • MyISAM类型数据表对应三个文件 :

              * . frm -- 表结构定义文件
             * . MYD -- 数据文件 ( data )
             * . MYI -- 索引文件 ( index )

设置数据表字符集
我们可为数据库,数据表,数据列设定不同的字符集,设定方法 :

  • 创建时通过命令来设置 , 如 : CREATE TABLE 表名()CHARSET = utf8;
  • 如无设定 , 则根据MySQL数据库配置文件 my.ini 中的参数设定
     

三、对数据库表记录进行操作(修改)

1.插入记录

insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)

insert into 表名 values(值1,值2,值3……)

1.1插入数据中文乱码问题解决方法

方式一:【不建议!

直接修改数据库安装目录里面的my.ini文件的第57行

方式二:

    set names gbk;

2.修改表的记录

2.1 不带条件

update 表名 set 字段名=值, 字段名=值, 字段名=值……

它会将该列的所有记录都更改

2.2带条件的

update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件

3.删除表记录

3.1带条件的

delete from 表名 where 条件

注意,删除后,uid不会重置!

3.2 不带条件的

先准备数据

insert into tbl_user values(null,’老王’,’666’);

删除操作

delete from 表名;

3.3 面试题

说说delete与truncate的区别?

delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。

truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。

Delete操作演示:

Truncate操作演示

注意:delete删除,uid不会重置!而使用truncate操作,uid会重置。

4.查询操作

语法:

select [distinct] *| 列名,列名 from 表名 [where条件]

(distinct表示的是过滤掉重复的信息)

注意 : [ ] 括号代表可选的 , { }括号代表必选得
 

4.1 简单查询

1.查询所有商品

select * from product;

2. 查询商品名和商品价格

select pname,price from product;

3.查询所有商品信息使用表别名

select * from product as  p;

4.查询商品名,使用列别名

select pname as  p from product

5.去掉重复值(按照价格)

select distinct(price) from product;

先准备数据:

insert into product values (null,'李士雪',38,null);

6.将所有的商品的价格+10进行显示

select pname,price+10 from product;

4.2条件查询

1.查询商品名称为"左慈"的商品信息

2.查询价格>60元的所有商品信息

3.查询商品名称含有"士"字的商品信息

4.查询商品id在(3,6,9)范围内的所有商品信息

(in的话是表示指定的数值,如果是范围的话是用between 。。。and。。。)

5.查询商品名称含有"士"字并且id为6的商品信息

6.查询id为2或者6的商品信息

4.3排序

1.查询所有的商品,按价格进行排序(升序、降序)

2.查询名称有"士"的商品信息并且按照价格降序排序

4.4聚合函数

1.获得所有商品的价格的总和

2.获得所有商品的平均价格

3.获得所有商品的个数

4.5 分组操作

1.添加分类id (alter table product add cid varchar(32);)

2.初始化数据

update product set cid='1';

update product set cid='2' where  pid in (5,6,7);

1.根据cid字段分组,分组后统计商品的个数。

2.根据cid分组,分组统计每组商品的平均价格,并且平均价格大于20000元。

注意:这里要注意的一点就是聚合函数是不能写在where后面的,但是可以写在having后面

4.6查询总结

select  一般在的后面的内容都是要查询的字段

from  要查询到表

where

group by

having  分组后带有条件只能使用having

order by 它必须放到最后面

5.执行顺序

书写顺序
在这里插入图片描述

执行顺序
在这里插入图片描述

详细的执行顺序

连接数据库

1.使用jar包

mysql的测试代码,并不是通用方法

package com.gdut;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class MysqlT {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet res = null;
		chaxun(conn, pstm, res);
		
	}
	public static void chaxun(Connection conn,PreparedStatement pstm,ResultSet res) 
	{
		try {
			//加载驱动
			Class.forName("com.mysql.cj.jdbc.Driver");
			//创建连接
			conn=  DriverManager.getConnection("jdbc:mysql://101.200.132.173:3306/erp","root","123456");
			//sql语句
			String sql = "select * from dep";
			//准备执行语句
			pstm = conn.prepareStatement(sql);
			res = pstm.executeQuery();
			List<Dep> list = new ArrayList<Dep>();
			while(res.next()) 
			{
				Dep dep = new Dep();
				dep.setId(res.getInt("id"));
				dep.setName(res.getString("name"));
				dep.setNum(res.getInt("num"));
				list.add(dep);
			}
			for(Dep dep1:list) 
			{
				System.out.println(dep1.getId()+"姓名:"+dep1.getName()+" "+dep1.getNum());
			}
			close(conn, pstm, res);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	public static void zsg(Connection conn,PreparedStatement pstm,ResultSet res) {
		try {
		
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			conn=  DriverManager.getConnection("jdbc:mysql://101.200.132.173:3306/erp","root","123456");
			//sql语句
			String sql = "insert into dep(id,name,num) values(?,?,?)";
			//准备执行语句
			pstm = conn.prepareStatement(sql);
			//这里的第一个参数表示的就是上面sql语句的?的位置,不是索引
			pstm.setObject(1, 5);
			pstm.setObject(2, "e");
			pstm.setObject(3, 5);
			int num = pstm.executeUpdate();
			if(num>0) 
			{
				System.out.println("数据库增加或更新成功");
			}
			
			close(conn, pstm, res);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void close(Connection conn,PreparedStatement pstm,ResultSet res) 
	{
		try {
			if(conn!=null) {
				conn.close();
				}
			if(pstm!=null) 
			{
				pstm.close();
			}
			if(res!=null) 
			{
				res.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

6.内连接(类似于取交集)


隐式内连接:
       1.等值内连接 where e.deptno = d.deptno
       2.不等值内连接 where e.deptno <> d.deptno 
       3.自连接:自己连接自己
显示内连接:
       select * form 表1 inner join 表2 on 连接条件
       inner可以省略

select b.* from tb_brand b inner JOIN tb_category_brand tb on b.id=tb.brand_id where tb.category_id=76


7.外连接


        左外连接:left outer join   左表中所有记录,如果右表中没有对应记录,就显示为空
        右外连接: right outer join  右表中所有记录,如果左表中没有对应记录,就显示为空
        outer 可以省略
        oracle中的外连接(+)实际上如果没有对应的记录就加上空值,和左外连接相同
        select * from emp e1,dept d1 where e1.deptno=d1.deptno(+)

一些注意事项看下这篇博客

SQL语法——left join on 多条件_minixuezhen的博客-CSDN博客_join on 多个条件

8.排序和分页

这里注意一下order后面是可以跟多个字段的,例如

select * from emp order by age,count desc

(这里的排序是先根据age进行升序排序,假设age相同在根据count进行降序排序)

9.子查询

10.乐观锁和悲观锁

什么是乐观锁,什么是悲观锁 - 简书

四、数据库的备份和还原(命令行和图形化界面)

1.数据库的备份

命令行模式:

语法:  mysqldump -u用户名  -p密码  数据库名称 > 保存的路径

例如:mysqldump -u root -p123456 mytest > d://a.sql

图形化界面

2.数据库的还原

步骤:

1.登录数据库(mysql -u 用户名 -p )

2.创建数据库(create database 数据库名字)

3.使用数据库(use 数据库名字)

4.执行文件(source 文件路径)

五、数据库的问题排查手段

1.使用show processlist命令查看所有的连接信息

2.使用explain命令查询语句的执行计划(主要看type、key、key_len、extra)

3.开启慢查询慢日志,查看慢查询的sql

(慢查询能记录所有执行时间超过long_query_time时间的sql语句,方便我们对sql语句进行优化)

六、MySql的存储引擎

1.什么是存储引擎

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
不同的存储引擎性能是不一样的

2.什么是事务
是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

存储引擎分类

MYISAM:

  1. 它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。
  2. 每个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名分别为:
    .frm(存储表定义)
    MYD(MYData,存储数据)
    MYI(MYIndex,存储索引)

INNODB:

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

MEMORY:

  1. memory使用存在内存中的内容来创建表。每个MEMORY表实际对应一个磁盘文件,格式是.frm
  2. MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。

InnoDB和MyISAM两种存储引擎的区别?

InnoDB支持事务, MyISAM不支持.
InnoDB支持行级锁, MyISAM支持表级锁.
InnoDB支持多版本并发控制(MVVC), MyISAM不支持.
InnoDB支持外键, MyISAM不支持.
MyISAM支持全文索引, InnoDB部分版本不支持(但可以使用Sphinx插件)
 

七、字符集

1. 字符集的由来

  1. 计算机只能识别二进制代码无论是计算机程序还是数据,最终都会转换成二进制,计算机才能认识。
  2. 为了计算机不只能做科学计算,也能处理文字信息。
    人们想出了给每一个文字符号编码以便于计算识别处理的办法,这就是计算机字符集的由来。

2. ASSCII

一套文字符号及其编码,比较规则 的集合。 20世纪60年代初。美国标准化组织ANSI发布了第一个字符集。ASCII
后来又进一步变成了国际标准ISO-646

  1. 各大字符集:
    自ASCII后。为了处理不同的文字。各大计算机公司,各国,标准化**,组织先后发明了几百种字符集。
    1. ISO-8859
    2. GB2312-80
    3. GBK
    4. BIG5

2. unicode

  1. 为了统一字符编码。国际标准化组织ISO的一些成员国于1984年发起制定了新的国际字符集标准。容纳全世界各种语言,文字,和 符号。最后这个标准ISO-10646
  2. ISO-10646发布后,遭到了美国计算机公司的反对。
  3. 1988年,Xerox公司提议制定了新的以16位编码人统一字符集。并联合不Apple,IBM,SUN,Microsoft等公司成立了Unicode技术委员会。专门负责收集,整理,和编码。于1991年推出了Unicode1.0
  4. 都是为了字符编码统一问题,ISO和Unicode协会推出了连个不同人标准。这显然是不利的。后来双方开始谈判。1991年10月达成协议。ISO将Unicode收编。起了个名BMP

3. UTF-16

  1. ISO-10646编码空间足以容纳从古自今使用过的文字和字符。但很多文字字符已经很少用了。 超过99%的在用文字字符都编入了BMP.因此,绝大部分情况下。
    Unicode双字节方式都能满足需求。而且比双字节编码方式4字节原始编码来说,更节省内存和处理时间 。这也是Unicode流行的原因。
  2. 万一使用了BMP以这后文字怎么办? Unicode提出了UTF-16的解决办法。

4. UTF-8

  1. 虽然UTF-16解决了上面问题。但当时的计算机和网络世界还是ASCII的天下。只能处理单字节数据流。UTF-16离开了Unicode环境后。在传输和处理中,都存在问题。
  2. 于是又提出了UTF-8的解决文案,
  3. UTF-8按一定的规则,将一个ISO10646或Unicode转换成1至4个字节的编码
  4. 其中ASCII转成单字节编码。也就严格兼容了ASCII字符集。
  5. UTF-8的2,3,4字节用以转换ISO-10646标准的UCS-4原始码。

5. 汉字的一些常见字符集

  1. GB2312
  2. GB13000
  3. GBK
  4. GB18030

八、数据库的优化手段

1.为搜索字段创建索引

2.避免使用select * ,一般使用select +要查询的字段(覆盖索引)

3.垂直分割表和水平分割表

4.选择正确的存储引擎

5.分页

九、explain

explain显示了MySQL如何使用索引来处理select语句以及连接表。他可以帮助我们选择更好的索引和写出更优化的查询语句。

我们这里有张表user

使用创建索引的语句对name进行索引的创建

create index index_name on user(name);

mysql索引失效的情况以及参数的意思可以参考这篇文章

https://blog.csdn.net/wangbo1998/article/details/79580805?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.control

oracle索引失效的情况参考这篇文章

SQL优化避免索引失效_史迪阳的博客-CSDN博客_sql优化索引失效

十、常用函数

菜鸟教程上面的所有的mysql函数

MySQL 字符串函数

函数描述实例
ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。

返回 CustomerName 字段第一个字母的 ASCII 码:

SELECT ASCII(CustomerName) AS NumCodeOfFirstChar
FROM Customers;
CHAR_LENGTH(s)返回字符串 s 的字符数

返回字符串 RUNOOB 的字符数

SELECT CHAR_LENGTH("RUNOOB") AS LengthOfString;
CHARACTER_LENGTH(s)返回字符串 s 的字符数,等同于 CHAR_LENGTH(s)

返回字符串 RUNOOB 的字符数

SELECT CHARACTER_LENGTH("RUNOOB") AS LengthOfString;
CONCAT(s1,s2...sn)字符串 s1,s2 等多个字符串合并为一个字符串

合并多个字符串

SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedString;
CONCAT_WS(x, s1,s2...sn)同 CONCAT(s1,s2,...) 函数,但是每个字符串之间要加上 x,x 可以是分隔符

合并多个字符串,并添加分隔符:

SELECT CONCAT_WS("-", "SQL", "Tutorial", "is", "fun!")AS ConcatenatedString;
FIELD(s,s1,s2...)返回第一个字符串 s 在字符串列表(s1,s2...)中的位置

返回字符串 c 在列表值中的位置:

SELECT FIELD("c", "a", "b", "c", "d", "e");
FIND_IN_SET(s1,s2)返回在字符串s2中与s1匹配的字符串的位置

返回字符串 c 在指定字符串中的位置:

SELECT FIND_IN_SET("c", "a,b,c,d,e");
FORMAT(x,n)函数可以将数字 x 进行格式化 "#,###.##", 将 x 保留到小数点后 n 位,最后一位四舍五入。

格式化数字 "#,###.##" 形式:

SELECT FORMAT(250500.5634, 2);     -- 输出 250,500.56
INSERT(s1,x,len,s2)字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串

从字符串第一个位置开始的 6 个字符替换为 runoob:

SELECT INSERT("google.com", 1, 6, "runoob");  -- 输出:runoob.com
LOCATE(s1,s)从字符串 s 中获取 s1 的开始位置

获取 b 在字符串 abc 中的位置:

SELECT LOCATE('st','myteststring');  -- 5

返回字符串 abc 中 b 的位置:

SELECT LOCATE('b', 'abc') -- 2
LCASE(s)将字符串 s 的所有字母变成小写字母

字符串 RUNOOB 转换为小写:

SELECT LCASE('RUNOOB') -- runoob
LEFT(s,n)返回字符串 s 的前 n 个字符

返回字符串 runoob 中的前两个字符:

SELECT LEFT('runoob',2) -- ru
LOWER(s)将字符串 s 的所有字母变成小写字母

字符串 RUNOOB 转换为小写:

SELECT LOWER('RUNOOB') -- runoob
LPAD(s1,len,s2)在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len

将字符串 xx 填充到 abc 字符串的开始处:

SELECT LPAD('abc',5,'xx') -- xxabc
LTRIM(s)去掉字符串 s 开始处的空格

去掉字符串 RUNOOB开始处的空格:

SELECT LTRIM("    RUNOOB") AS LeftTrimmedString;-- RUNOOB
MID(s,n,len)从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len)

从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:

SELECT MID("RUNOOB", 2, 3) AS ExtractString; -- UNO
POSITION(s1 IN s)从字符串 s 中获取 s1 的开始位置

返回字符串 abc 中 b 的位置:

SELECT POSITION('b' in 'abc') -- 2
REPEAT(s,n)将字符串 s 重复 n 次

将字符串 runoob 重复三次:

SELECT REPEAT('runoob',3) -- runoobrunoobrunoob
REPLACE(s,s1,s2)将字符串 s2 替代字符串 s 中的字符串 s1

将字符串 abc 中的字符 a 替换为字符 x:

SELECT REPLACE('abc','a','x') --xbc
REVERSE(s)将字符串s的顺序反过来

将字符串 abc 的顺序反过来:

SELECT REVERSE('abc') -- cba
RIGHT(s,n)返回字符串 s 的后 n 个字符

返回字符串 runoob 的后两个字符:

SELECT RIGHT('runoob',2) -- ob
RPAD(s1,len,s2)在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len

将字符串 xx 填充到 abc 字符串的结尾处:

SELECT RPAD('abc',5,'xx') -- abcxx
RTRIM(s)去掉字符串 s 结尾处的空格

去掉字符串 RUNOOB 的末尾空格:

SELECT RTRIM("RUNOOB     ") AS RightTrimmedString;   -- RUNOOB
SPACE(n)返回 n 个空格

返回 10 个空格:

SELECT SPACE(10);
STRCMP(s1,s2)比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1

比较字符串:

SELECT STRCMP("runoob", "runoob");  -- 0
SUBSTR(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串

从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:

SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString; -- UNO
SUBSTRING(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串,等同于 SUBSTR(s, start, length)

从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:

SELECT SUBSTRING("RUNOOB", 2, 3) AS ExtractString; -- UNO
SUBSTRING_INDEX(s, delimiter, number)返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 number 是正数,返回第 number 个字符左边的字符串。
如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。
SELECT SUBSTRING_INDEX('a*b','*',1) -- a
SELECT SUBSTRING_INDEX('a*b','*',-1)    -- b
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1)    -- c
TRIM(s)去掉字符串 s 开始和结尾处的空格

去掉字符串 RUNOOB 的首尾空格:

SELECT TRIM('    RUNOOB    ') AS TrimmedString;
UCASE(s)将字符串转换为大写

将字符串 runoob 转换为大写:

SELECT UCASE("runoob"); -- RUNOOB
UPPER(s)将字符串转换为大写

将字符串 runoob 转换为大写:

SELECT UPPER("runoob"); -- RUNOOB

MySQL 数字函数

函数名描述实例
ABS(x)返回 x 的绝对值  

返回 -1 的绝对值:

SELECT ABS(-1) -- 返回1
ACOS(x)求 x 的反余弦值(单位为弧度),x 为一个数值
SELECT ACOS(0.25);
ASIN(x)求反正弦值(单位为弧度),x 为一个数值
SELECT ASIN(0.25);
ATAN(x)求反正切值(单位为弧度),x 为一个数值
SELECT ATAN(2.5);
ATAN2(n, m)求反正切值(单位为弧度)
SELECT ATAN2(-0.8, 2);
AVG(expression)返回一个表达式的平均值,expression 是一个字段

返回 Products 表中Price 字段的平均值:

SELECT AVG(Price) AS AveragePrice FROM Products;
CEIL(x)返回大于或等于 x 的最小整数 
SELECT CEIL(1.5) -- 返回2
CEILING(x)返回大于或等于 x 的最小整数 
SELECT CEILING(1.5); -- 返回2
COS(x)求余弦值(参数是弧度)
SELECT COS(2);
COT(x)求余切值(参数是弧度)
SELECT COT(6);
COUNT(expression)返回查询的记录总数,expression 参数是一个字段或者 * 号

返回 Products 表中 products 字段总共有多少条记录:

SELECT COUNT(ProductID) AS NumberOfProducts FROM Products;
DEGREES(x)将弧度转换为角度  
SELECT DEGREES(3.1415926535898) -- 180
n DIV m整除,n 为被除数,m 为除数

计算 10 除于 5:

SELECT 10 DIV 5;  -- 2
EXP(x)返回 e 的 x 次方  

计算 e 的三次方:

SELECT EXP(3) -- 20.085536923188
FLOOR(x)返回小于或等于 x 的最大整数  

小于或等于 1.5 的整数:

SELECT FLOOR(1.5) -- 返回1
GREATEST(expr1, expr2, expr3, ...)返回列表中的最大值

返回以下数字列表中的最大值:

SELECT GREATEST(3, 12, 34, 8, 25); -- 34

返回以下字符串列表中的最大值:

SELECT GREATEST("Google", "Runoob", "Apple");   -- Runoob
LEAST(expr1, expr2, expr3, ...)返回列表中的最小值

返回以下数字列表中的最小值:

SELECT LEAST(3, 12, 34, 8, 25); -- 3

返回以下字符串列表中的最小值:

SELECT LEAST("Google", "Runoob", "Apple");   -- Apple
LN返回数字的自然对数,以 e 为底。

返回 2 的自然对数:

SELECT LN(2);  -- 0.6931471805599453
LOG(x) 或 LOG(base, x)返回自然对数(以 e 为底的对数),如果带有 base 参数,则 base 为指定带底数。  
SELECT LOG(20.085536923188) -- 3
SELECT LOG(2, 4); -- 2
LOG10(x)返回以 10 为底的对数  
SELECT LOG10(100) -- 2
LOG2(x)返回以 2 为底的对数

返回以 2 为底 6 的对数:

SELECT LOG2(6);  -- 2.584962500721156
MAX(expression)返回字段 expression 中的最大值

返回数据表 Products 中字段 Price 的最大值:

SELECT MAX(Price) AS LargestPrice FROM Products;
MIN(expression)返回字段 expression 中的最小值

返回数据表 Products 中字段 Price 的最小值:

SELECT MIN(Price) AS MinPrice FROM Products;
MOD(x,y)返回 x 除以 y 以后的余数 

5 除于 2 的余数:

SELECT MOD(5,2) -- 1
PI()返回圆周率(3.141593)  
SELECT PI() --3.141593
POW(x,y)返回 x 的 y 次方 

2 的 3 次方:

SELECT POW(2,3) -- 8
POWER(x,y)返回 x 的 y 次方 

2 的 3 次方:

SELECT POWER(2,3) -- 8
RADIANS(x)将角度转换为弧度  

180 度转换为弧度:

SELECT RADIANS(180) -- 3.1415926535898
RAND()返回 0 到 1 的随机数  
SELECT RAND() --0.93099315644334
ROUND(x)返回离 x 最近的整数
SELECT ROUND(1.23456) --1
SIGN(x)返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1 
SELECT SIGN(-10) -- (-1)
SIN(x)求正弦值(参数是弧度)  
SELECT SIN(RADIANS(30)) -- 0.5
SQRT(x)返回x的平方根  

25 的平方根:

SELECT SQRT(25) -- 5
SUM(expression)返回指定字段的总和

计算 OrderDetails 表中字段 Quantity 的总和:

SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails;
TAN(x)求正切值(参数是弧度)
SELECT TAN(1.75);  -- -5.52037992250933
TRUNCATE(x,y)返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)
SELECT TRUNCATE(1.23456,3) -- 1.234

MySQL 日期函数

函数名描述实例
ADDDATE(d,n)计算起始日期 d 加上 n 天的日期
SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY);
->2017-06-25
ADDTIME(t,n)n 是一个时间表达式,时间 t 加上时间表达式 n

加 5 秒:

SELECT ADDTIME('2011-11-11 11:11:11', 5);
->2011-11-11 11:11:16 (秒)

添加 2 小时, 10 分钟, 5 秒:

SELECT ADDTIME("2020-06-15 09:34:21", "2:10:5"); 
-> 2020-06-15 11:44:26
CURDATE()返回当前日期
SELECT CURDATE();
-> 2018-09-19
CURRENT_DATE()返回当前日期
SELECT CURRENT_DATE();
-> 2018-09-19
CURRENT_TIME返回当前时间
SELECT CURRENT_TIME();
-> 19:59:02
CURRENT_TIMESTAMP()返回当前日期和时间
SELECT CURRENT_TIMESTAMP()
-> 2018-09-19 20:57:43
CURTIME()返回当前时间
SELECT CURTIME();
-> 19:59:02
DATE()从日期或日期时间表达式中提取日期值
SELECT DATE("2017-06-15");    
-> 2017-06-15
DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数
SELECT DATEDIFF('2001-01-01','2001-02-02')
-> -32
DATE_ADD(d,INTERVAL expr type)计算起始日期 d 加上一个时间段后的日期,type 值可以是:
  • MICROSECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR
  • SECOND_MICROSECOND
  • MINUTE_MICROSECOND
  • MINUTE_SECOND
  • HOUR_MICROSECOND
  • HOUR_SECOND
  • HOUR_MINUTE
  • DAY_MICROSECOND
  • DAY_SECOND
  • DAY_MINUTE
  • DAY_HOUR
  • YEAR_MONTH
SELECT DATE_ADD("2017-06-15", INTERVAL 10 DAY);    
-> 2017-06-25

SELECT DATE_ADD("2017-06-15 09:34:21", INTERVAL 15 MINUTE);
-> 2017-06-15 09:49:21

SELECT DATE_ADD("2017-06-15 09:34:21", INTERVAL -3 HOUR);
->2017-06-15 06:34:21

SELECT DATE_ADD("2017-06-15 09:34:21", INTERVAL -3 MONTH);
->2017-04-15
DATE_FORMAT(d,f)按表达式 f的要求显示日期 d
SELECT DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r')
-> 2011-11-11 11:11:11 AM
DATE_SUB(date,INTERVAL expr type)函数从日期减去指定的时间间隔。

Orders 表中 OrderDate 字段减去 2 天:

SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY) AS OrderPayDate
FROM Orders
DAY(d)返回日期值 d 的日期部分
SELECT DAY("2017-06-15");  
-> 15
DAYNAME(d)返回日期 d 是星期几,如 Monday,Tuesday
SELECT DAYNAME('2011-11-11 11:11:11')
->Friday
DAYOFMONTH(d)计算日期 d 是本月的第几天
SELECT DAYOFMONTH('2011-11-11 11:11:11')
->11
DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推
SELECT DAYOFWEEK('2011-11-11 11:11:11')
->6
DAYOFYEAR(d)计算日期 d 是本年的第几天
SELECT DAYOFYEAR('2011-11-11 11:11:11')
->315
EXTRACT(type FROM d)从日期 d 中获取指定的值,type 指定返回的值。 
type可取值为: 
  • MICROSECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR
  • SECOND_MICROSECOND
  • MINUTE_MICROSECOND
  • MINUTE_SECOND
  • HOUR_MICROSECOND
  • HOUR_SECOND
  • HOUR_MINUTE
  • DAY_MICROSECOND
  • DAY_SECOND
  • DAY_MINUTE
  • DAY_HOUR
  • YEAR_MONTH
SELECT EXTRACT(MINUTE FROM '2011-11-11 11:11:11') 
-> 11
FROM_DAYS(n)计算从 0000 年 1 月 1 日开始 n 天后的日期
SELECT FROM_DAYS(1111)
-> 0003-01-16
HOUR(t)返回 t 中的小时值
SELECT HOUR('1:2:3')
-> 1
LAST_DAY(d)返回给给定日期的那一月份的最后一天
SELECT LAST_DAY("2017-06-20");
-> 2017-06-30
LOCALTIME()返回当前日期和时间
SELECT LOCALTIME()
-> 2018-09-19 20:57:43
LOCALTIMESTAMP()返回当前日期和时间
SELECT LOCALTIMESTAMP()
-> 2018-09-19 20:57:43
MAKEDATE(year, day-of-year)基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期
SELECT MAKEDATE(2017, 3);
-> 2017-01-03
MAKETIME(hour, minute, second)组合时间,参数分别为小时、分钟、秒
SELECT MAKETIME(11, 35, 4);
-> 11:35:04
MICROSECOND(date)返回日期参数所对应的微秒数
SELECT MICROSECOND("2017-06-20 09:34:00.000023");
-> 23
MINUTE(t)返回 t 中的分钟值
SELECT MINUTE('1:2:3')
-> 2
MONTHNAME(d)返回日期当中的月份名称,如 November
SELECT MONTHNAME('2011-11-11 11:11:11')
-> November
MONTH(d)返回日期d中的月份值,1 到 12
SELECT MONTH('2011-11-11 11:11:11')
->11
NOW()返回当前日期和时间
SELECT NOW()
-> 2018-09-19 20:57:43
PERIOD_ADD(period, number)为 年-月 组合日期添加一个时段
SELECT PERIOD_ADD(201703, 5);   
-> 201708
PERIOD_DIFF(period1, period2)返回两个时段之间的月份差值
SELECT PERIOD_DIFF(201710, 201703);
-> 7
QUARTER(d)返回日期d是第几季节,返回 1 到 4
SELECT QUARTER('2011-11-11 11:11:11')
-> 4
SECOND(t)返回 t 中的秒钟值
SELECT SECOND('1:2:3')
-> 3
SEC_TO_TIME(s)将以秒为单位的时间 s 转换为时分秒的格式
SELECT SEC_TO_TIME(4320)
-> 01:12:00
STR_TO_DATE(string, format_mask)将字符串转变为日期
SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");
-> 2017-08-10
SUBDATE(d,n)日期 d 减去 n 天后的日期
SELECT SUBDATE('2011-11-11 11:11:11', 1)
->2011-11-10 11:11:11 (默认是天)
SUBTIME(t,n)时间 t 减去 n 秒的时间
SELECT SUBTIME('2011-11-11 11:11:11', 5)
->2011-11-11 11:11:06 (秒)
SYSDATE()返回当前日期和时间
SELECT SYSDATE()
-> 2018-09-19 20:57:43
TIME(expression)提取传入表达式的时间部分
SELECT TIME("19:30:10");
-> 19:30:10
TIME_FORMAT(t,f)按表达式 f 的要求显示时间 t
SELECT TIME_FORMAT('11:11:11','%r')
11:11:11 AM
TIME_TO_SEC(t)将时间 t 转换为秒
SELECT TIME_TO_SEC('1:12:00')
-> 4320
TIMEDIFF(time1, time2)计算时间差值
mysql> SELECT TIMEDIFF("13:10:11", "13:10:10");
-> 00:00:01
mysql> SELECT TIMEDIFF('2000:01:01 00:00:00',
    ->                 '2000:01:01 00:00:00.000001');
        -> '-00:00:00.000001'
mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001',
    ->                 '2008-12-30 01:01:01.000002');
        -> '46:58:57.999999'
TIMESTAMP(expression, interval)单个参数时,函数返回日期或日期时间表达式;有2个参数时,将参数加和
mysql> SELECT TIMESTAMP("2017-07-23",  "13:10:11");
-> 2017-07-23 13:10:11
mysql> SELECT TIMESTAMP('2003-12-31');
        -> '2003-12-31 00:00:00'
mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
        -> '2004-01-01 00:00:00'
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)计算时间差,返回 datetime_expr2 − datetime_expr1 的时间差
mysql> SELECT TIMESTAMPDIFF(DAY,'2003-02-01','2003-05-01');   // 计算两个时间相隔多少天
        -> 89
mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');   // 计算两个时间相隔多少月
        -> 3
mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');    // 计算两个时间相隔多少年
        -> -1
mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');  // 计算两个时间相隔多少分钟
        -> 128885
TO_DAYS(d)计算日期 d 距离 0000 年 1 月 1 日的天数
SELECT TO_DAYS('0001-01-01 01:01:01')
-> 366
WEEK(d)计算日期 d 是本年的第几个星期,范围是 0 到 53
SELECT WEEK('2011-11-11 11:11:11')
-> 45
WEEKDAY(d)日期 d 是星期几,0 表示星期一,1 表示星期二
SELECT WEEKDAY("2017-06-15");
-> 3
WEEKOFYEAR(d)计算日期 d 是本年的第几个星期,范围是 0 到 53
SELECT WEEKOFYEAR('2011-11-11 11:11:11')
-> 45
YEAR(d)返回年份
SELECT YEAR("2017-06-15");
-> 2017
YEARWEEK(date, mode)返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推
SELECT YEARWEEK("2017-06-15");
-> 201724

MySQL 高级函数

函数名描述实例
BIN(x)返回 x 的二进制编码

15 的 2 进制编码:

SELECT BIN(15); -- 1111
BINARY(s)将字符串 s 转换为二进制字符串
SELECT BINARY "RUNOOB";
-> RUNOOB
CASE expression
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
   ...
    WHEN conditionN THEN resultN
    ELSE result
END
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
SELECT CASE 
  WHEN 1 > 0
  THEN '1 > 0'
  WHEN 2 > 0
  THEN '2 > 0'
  ELSE '3 > 0'
  END
->1 > 0
CAST(x AS type)转换数据类型

字符串日期转换为日期:

SELECT CAST("2017-08-29" AS DATE);
-> 2017-08-29
COALESCE(expr1, expr2, ...., expr_n)返回参数中的第一个非空表达式(从左向右)
SELECT COALESCE(NULL, NULL, NULL, 'runoob.com', NULL, 'google.com');
-> runoob.com
CONNECTION_ID()返回唯一的连接 ID
SELECT CONNECTION_ID();
-> 4292835
CONV(x,f1,f2)返回 f1 进制数变成 f2 进制数
SELECT CONV(15, 10, 2);
-> 1111
CONVERT(s USING cs)函数将字符串 s 的字符集变成 cs
SELECT CHARSET('ABC')
->utf-8    

SELECT CHARSET(CONVERT('ABC' USING gbk))
->gbk
CURRENT_USER()返回当前用户
SELECT CURRENT_USER();
-> guest@%
DATABASE()返回当前数据库名
SELECT DATABASE();   
-> runoob
IF(expr,v1,v2)如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
SELECT IF(1 > 0,'正确','错误')    
->正确
IFNULL(v1,v2)如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
SELECT IFNULL(null,'Hello Word')
->Hello Word
ISNULL(expression)判断表达式是否为 NULL
SELECT ISNULL(NULL);
->1
LAST_INSERT_ID()返回最近生成的 AUTO_INCREMENT 值
SELECT LAST_INSERT_ID();
->6
NULLIF(expr1, expr2)比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1
SELECT NULLIF(25, 25);
->
SESSION_USER()返回当前用户
SELECT SESSION_USER();
-> guest@%
SYSTEM_USER()返回当前用户
SELECT SYSTEM_USER();
-> guest@%
USER()返回当前用户
SELECT USER();
-> guest@%
VERSION()返回数据库的版本号
SELECT VERSION()
-> 5.6.34

经常使用的函数

数据函数

字符串函数

日期和时间函数

系统信息函数

聚合函数(注意不能直接在where后面使用)

函数名称描述
COUNT()返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
SUM()返回数字字段或表达式列作统计,返回一列的总和。
AVG()通常为数值字段或表达列作统计,返回一列的平均值
MAX()可以为数值字段,字符字段或表达式列作统计,返回最大的值。
MIN()可以为数值字段,字符字段或表达式列作统计,返回最小的值。

十一、事务

什么是事务
事务就是将一组SQL语句放在同一批次内去执行
如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
MySQL事务处理只支持InnoDB和BDB数据表类型


事务的ACID原则 


原子性(Atomic)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执
行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(Consist)
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不
管在任何给定的时间并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务
一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五
个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多
个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之
间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。

隔离性(Isolated)
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相
同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系
统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同
一时间仅有一个请求用于同一数据。

持久性(Durable)
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
 

十二、索引

索引的作用

  • 提高查询速度
  • 确保数据的唯一性
  • 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
  • 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间
  • 全文检索字段进行搜索优化
     

分类

  • 主键索引 (Primary Key)
  • 唯一索引 (Unique)
  • 常规索引 (Index)
  • 全文索引 (FullText)
     

主键索引

主键 : 某一个属性组能唯一标识一条记录
特点 :
最常见的索引类型
确保数据记录的唯一性
确定特定数据记录在数据库中的位置

唯一索引

作用 : 避免同一个表中某数据列中的值重复
与主键索引的区别:

  • 主键索引只能有一个
  • 唯一索引可能有多个

常规索引

作用 : 快速定位特定数据
注意 :

  • index 和 key 关键字都可以设置常规索引
  • 应加在查询找条件的字段
  • 不宜添加太多常规索引,影响数据的插入,删除和修改操作

全文索引

百度搜索:全文索引
作用 : 快速定位特定数据
注意 :

  • 只能用于MyISAM类型的数据表
  • 只能用于CHAR , VARCHAR , TEXT数据列类型
  • 适合大型数据集

索引准则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段

索引的数据结构

十三、权限管理

基本命令

权限解释

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐