2019-06-29

续上篇:MySQL查询数据

9. 子查询

与oracle相同;mysql中子查询可以以将子查询放在许多的 SQL 子句中,包括:WHERE 子句,

HAVING 子句,FROM 子句

9.1使用子查询的原则

• 子查询放在圆括号中。

• 将子查询放在比较条件的右边。

• 在单行子查询中用单行运算符,在多行子查询中用多行运算符。

9.2单行子查询

查询的结果可以用=,<,<=,> >=,<>,单行运算符连接。

9.3多行子查询

查询的结果可以用in,any,all多行预算富连接:


2019-06-29_第1张图片

10 .MySQL中的正则表达式

• MySQL 中允许使用正则表达式定义字符串的搜索条件,性能要高于 like。

• MySQL 中的正则表达式可以对整数类型或者字符类型检索。

• 使用 REGEXP 关键字表示正则匹配。

• 默认忽略大小写,如果要区分大小写,使用 BINARY关键字

10.1正则表达式的模式及其含义


2019-06-29_第2张图片

“^”符号的使用;

2019-06-29_第3张图片

$的使用:


2019-06-29_第4张图片

.的使用;

2019-06-29_第5张图片

“|”:表示或者含义'


2019-06-29_第6张图片


2019-06-29_第7张图片

“[^....]”:匹配不包含在[]的字符


2019-06-29_第8张图片

“{n}”:固定次数。


2019-06-29_第9张图片

“{n,m}”:范围次数。


2019-06-29_第10张图片

"+":加号匹配 1个或多个字符,在它之前也必须有内容。


2019-06-29_第11张图片


MySQL中的其他对象

1 索引

MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL

的检索速度。

1.1MySQL中的索引类型

a.普通索引   b.唯一索引  c.主键索引  d.组合索引  e.全文索引

1.2普通索引

是最基本的索引,它没有任何限制。

在创建索引时,可以指定索引长度。length 为可选参数,表示索引的长度,只有字符串

类型的字段才能指定索引长度,如果是 BLOB 和 TEXT 类型,必须指定 length。

创建索引时需要注意:

如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。

查询索引:SHOW INDEX FROM table_name

1.3唯一索引

唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。

1.4主键索引

主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建

表的时候同时创建主键索引。

1.5组合索引

组合索引是指使用多个字段创建的索引, 只有在查询条件中使用了创建索引时的第一个

字段,索引才会被使用(最左前缀原则)。

1.5.1最左前缀原则

就是最左优先。

如:我们使用表中的 name,address,salary 创建组合索引,那么想要组合索引生效,

我们只能使用如下组合:

name/address/salary

name/address

name/

如果使用 addrees/salary 或者是 salary 则索引不会生效。

1.6全文索引

全文索引(FULLTEXT INDEX)主要用来查找文本中的关键字, 而不是直接与索引中的值

相比较。 FULLTEXT 索引跟其它索引大不相同, 它更像是一个搜索引擎, 而不是简单的 where语句的参数匹配。FULLTEXT 索引配合 match against 操作使用,而不是一般的 where 语句加 like。

全文索引可以从 CHAR、VARCHAR 或 TEXT 列中作为 CREATE TABLE 语句的一部分

被创建,或是随后使用 ALTER TABLE 添加。不过切记对于大容量的数据表,生成全文索

引是一个非常消耗时间非常消耗硬盘空间的做法。

添加索引:

普通索引:

  Create index索引名(列名(长度))on 表名

唯一索引:

Create unique 索引名on 表名(列名(长度))

主键索引:

[if !supportLists]1.  [endif]Create table (列名 类型primary key);

[if !supportLists]2.  [endif]Create table (列名 类型,primary key(列名(长度)))

复合索引

Create table (列名1 类型1,列名2 类型2 ,index 索引名(列1(长度),列2(长度)));

全文索引:

Create table (列名 类型,fulltext 索引名(列名))

修改索引

普通索引:

Alter table 表名add index 索引名(列名(长度))

唯一索引:

Alter table 表名 add unique 索引名(列名(长度))

主键索引:

Alter table 表名 add primary key(列名);

复合索引:

Alter table 表名 add index 索引名(列1(长度),列2(长度))

全文索引:

Alter table 表名 add fulltext 索引名(列名(长度));

删除索引:

Drop index 索引名 on 表名

1.7使用全文索引

全 文 索 引 的 使 用 与 其 他 索 引 不 同 。 在 查 询 语 句 中 需 要 使 用 match(column)

against(‘content’) 来检索数据。

1.7.1全文解析器

全文索引中基本单位是”词”。分词,全文索引是以词为基础的,MySQL 默认的分词是

所有非字母和数字的特殊符号都是分词符。在检索数据时我们给定的检索条件也是词。

MySQL 中默认的全文解析器不支持中文分词。如果数据含有中文需要更换全文解析器

NGRAM。

1.7.2使用全文索引

SELECT 投影列 FROM 表名 WHERE MATCH(全文索引列名) AGAINST(‘搜索内容’)

例:

2019-06-29_第12张图片
2019-06-29_第13张图片

2 MySQL中的用户管理

MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种:root 用户,超级管

理员,和由 root 用户创建的普通用户。

2.1MySQL创建用户

CREATE USER username IDENTIFIED BY 'password';

2.2查看用户

SELECT USER,NOST FROM USER(该表位于 mysql 库中)

2.3分配权限

新用户创建完后是无法登陆的,需要分配权限。

GRANT 权限 ON 数据库.表 TO 用户名@登录主机 IDENTIFIED BY "密码"

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password'

登陆主机:

% 匹配所有主机

localhost localhost不会被解析成 IP 地址,直接通过 UNIXsocket 连接

127.0.0.1 会通过 TCP/IP 协议连接,并且只能在本机访问;

::1 ::1 就是兼容支持 ipv6 的,表示同 ipv4 的 127.0.0.1

2.3.1权限列表

ALTER: 修改表和索引。

CREATE: 创建数据库和表。

DELETE: 删除表中已有的记录。

DROP: 删除数据库和表。

INDEX: 创建或删除索引。

INSERT: 向表中插入新行。

SELECT: 检索表中的记录。

UPDATE: 修改现存表记录。

FILE: 读或写服务器上的文件。

PROCESS: 查看服务器中执行的线程信息或杀死线程。

RELOAD: 重载授权表或清空日志、主机缓存或表缓存。

SHUTDOWN: 关闭服务器。

ALL: 所有权限,ALL PRIVILEGES 同义词。

USAGE: 特殊的 "无权限" 权限

2.4刷新权限

每当调整权限后,通常需要执行以下语句刷新权限

FLUSH PRIVILEGES

2.5删除用户

 MySQL分页查询

MySQL 分页查询原则

• 在 MySQL 数据库中使用 LIMIT 子句进行分页查询。

• MySQL 分页中开始位置为 0。

• 分页子句在查询语句的最后侧。

1 LIMIT子句

1.1语法格式

SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 开始位置, 查询数量。


2019-06-29_第14张图片

2 LIMIT OFFSET子句

2.1语法格式

SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 查询数量 OFFSET

开始位置。

2019-06-29_第15张图片

MySQL中的执行计划

1 MySQL执行计划

在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL 语句,从而知道 MySQL 是

如何处理 SQL 语句的。

2 MySQL整个查询执行过程

• 客户端向 MySQL 服务器发送一条查询请求

• 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进

入下一阶段

• 服务器进行 SQL 解析、预处理、再由优化器生成对应的执行计划

• MySQL 根据执行计划,调用存储引擎的 API 来执行查询

• 将结果返回给客户端,同时缓存查询结果

3 启动执行计划

EXPLAIN SELECT 投影列 FROM 表名 WHERE 条件

4 EXPLAIN列的解释

type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 system、const、

eq_reg、ref、range、index和 ALL。

system:表中只有一行数据。属于 const 的特例。如果物理表中就一行数据为 ALL

const :查询结果最多有一个匹配行。因为只有一行,所以可以被视为常量。const查询速度

非常快,因为只读一次。一般情况下把主键或唯一索引作为唯一条件的查询都是 const

eq_ref:查询时查询外键表全部数据。且只能查询主键列或关联列。且外键表中外键列中数

据不能有重复数据,且这些数据都必须在主键表中有对应数据(主键表中数据可以有没有用

到的)

ref:相比 eq_ref,不对外键列有强制要求,里面的数据可以重复,只要出现重复的数据取值

就是 ref。也可能是索引查询。

range:把这个列当作条件只检索其中一个范围。常见 where 从句中出现 between、<、in 等。

主要应用在具有索引的列中

index:这个连接类型对前面的表中的每一个记录联合进行完全扫描(比 ALL 更好,因为索

引一般小于表数据)。

ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该

尽量避免。

MySQL数据库存储引擎介绍

1 查看MySQL数据库中的数据库存储引擎

1.1查看数据库引擎

SHOW ENGINES

2019-06-29_第16张图片

2 MySQL数据库引擎介绍

2.1ISAM(Indexed Sequential Access Method)

ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数

据库被查询的次数要远大于更新的次数。因此,ISAM 执行读取操作的速度很快,而且不占

用大量的内存和存储资源。ISAM 的两个主要不足之处在于,它不支持事务处理,也不能够

容错。如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把 ISAM 用在关键任

务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL 能够支持

这样的备份应用程序。

注意:使用 ISAM 时必须经常备份所有实时数据。

2.2MyISAM

MyISAM 是 MySQL 的 ISAM 扩展格式和缺省的数据库引擎。 除了提供 ISAM 里所没有

的索引和字段管理的大量功能,MyISAM 还使用一种表格锁定的机制,来优化多个并发的

读写操作,其代价是你需要经常运行 OPTIMIZE TABLE 命令,来恢复被更新机制所浪费的

空间。MyISAM 还有一些有用的扩展,例如用来修复数据库文件的 MyISAMCHK 工具和用

来恢复浪费空间的 MyISAMPACK 工具。MYISAM 强调了快速读取操作,这可能就是为什

么 MySQL 受到了 WEB 开发如此青睐的主要原因:在 WEB 开发中你所进行的大量数据操

作都是读取操作。所以,大多数虚拟主机提供商和 INTERNET 平台提供商只允许使用

MYISAM 格式。MyISAM 格式的一个重要缺陷就是不能在表损坏后恢复数据。

注意:MyISAM 引擎使用时必须经常使用 Optimize Table 命令清理空间;必须经常备份

所有实时数据。工具有用来修复数据库文件的 MyISAMCHK 工具和用来恢复浪费空间的

MyISAMPACK工具。

如果使用该数据库引擎,会生成三个文件:

.frm:表结构信息

.MYD:数据文件

.MYI:表的索引信息

2.3InnoDB

InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品, 这项技术就是MYSQL++

API。在使用 MYSQL 的时候,你所面对的每一个挑战几乎都源于 ISAM 和 MyISAM 数据库

引擎不支持事务处理(transaction process)也不支持外键。尽管要比 ISAM 和 MyISAM 引擎

慢很多, 但是 InnoDB 包括了对事务处理和外来键的支持, 这两点都是前两个引擎所没有的。

如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中

的一个了。

MySQL 官方对 InnoDB 是这样解释的:InnoDB 给 MySQL 提供了具有提交、回滚和崩溃

恢复能力的事务安全(ACID 兼容)存储引擎。InnoDB 锁定在行级并且也在 SELECT 语句

提供一个 Oracle 风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在 InnoDB

中扩大锁定的需要, 因为在InnoDB中行级锁定适合非常小的空间。 InnoDB也支持FOREIGN

KEY 强制。在 SQL 查询中,你可以自由地将 InnoDB 类型的表与其它 MySQL 的表的类型

混合起来,甚至在同一个查询中也可以混合。

InnoDB 是为处理巨大数据量时的最大性能设计, 它的 CPU 效率可能是任何其它基于磁盘

的关系数据库引擎所不能匹敌的。

InnoDB 存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据

和索引而维持它自己的缓冲池。InnoDB 存储它的表&索引在一个表空间中,表空间可以包

含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被存

在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统

上。

innodb 与 myisam 区别

1. InnoDB 支持事务,MyISAM 不支持,对于 InnoDB 每一条 SQL 语言都默认封装成事

务,自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin 和 commit 之间,组

成一个事务;

2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM

会失败;

3. InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引

效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,

主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据

文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而

MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度

很快;

5. Innodb不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;(在

MySQL5.7 版本中已经支持全文索引)

如何选择:

1. 是否要支持事务,如果要请选择 innodb,如果不需要可以考虑 MyISAM

2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请

使用 InnoDB。

3. 系统奔溃后,MyISAM 恢复起来更困难,能否接受;

4. MySQL5.5 版本开始 Innodb 已经成为 Mysql 的默认引擎(之前是 MyISAM), 说明其优

势是有目共睹的,如果你不知道用什么,那就用 InnoDB,至少不会差。

默认状态:


2019-06-29_第17张图片

3 修改数据库级引擎

修改 MySQL 的 my.ini 配置文件

C:\ProgramData\MySQL\MySQL Server 5.7

default-storage-engine=数据库引擎名称

重启 MySQL服务

步骤:1打开C:\ProgramData\MySQL\MySQL Server 5.7文件

2019-06-29_第18张图片

2.将innodb修改为myisam

2019-06-29_第19张图片

3.重启mysql服务:

2019-06-29_第20张图片

4.搜索:SHOW ENGINES

2019-06-29_第21张图片

数据库设计范式

什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些

规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

第一范式

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

   1、每一列属性都是不可再分的属性值,确保每一列的原子性

   2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。

2019-06-29_第22张图片
2019-06-29_第23张图片

如果需求知道那个省那个市并按其分类,那么显然第一个表格是不容易满足需求的,也不符合第一范式。

第二范式

需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

 每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。

2019-06-29_第24张图片

一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。

2019-06-29_第25张图片

第三范式

需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

 数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c  属性之间含有这样的关系,是不符合第三范式的。

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)

这样的表结构,我们应该拆开来,如下。

(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

你可能感兴趣的:(2019-06-29)