MySQL学习day-34:子查询与分页

一、子查询

可以将子查询放在许多的 SQL 子句中,包括:WHERE 子句; HAVING 子句;FROM 子句。

使用子查询的原则:

1)子查询放在圆括号中。 

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

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

1.单行子查询:

MySQL学习day-34:子查询与分页_第1张图片

语法:select  列名...  from 表名  where  列名 运算符(select查询语句)

2.多行子查询:

MySQL学习day-34:子查询与分页_第2张图片

3.MySQL 中的正则表达式:

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

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

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

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

(1)正则表达式的模式及其含义:

1)”^”:字符串的开始;

2)$:字符串的结尾;

3)’.’:任何一个字符;

4)[…]:在方括号内的任何字符列表;

5)[^...]:非列在方括号内的任何字符;

6)p1|p2|p3:交替匹配任何模式p1,p2或p3;

7)*:零个或多个前面的元素;

8)+:前面元素的一个或多个实例;

9){+}:前面的元素的n个实例;

10){m,n}:m到n个实例前面的元素。

二、索引

索引可以大大提高 MySQL 的检索速度。

1.MySQL索引的类型:

普通索引;唯一索引;主键索引;组合索引;全文索引。

2.普通索引:

是最基本的索引,它没有任何限制。创建索引时,可以指定索引长度。length 为可选参数,表示索引的长度,只有字符串 类型的字段才能指定索引长度,如果是 BLOB 和 TEXT 类型,必须指定 length。 

创建索引时需要注意: 如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。

查询索引:show index from  表名;

(1)直接创建索引:create index 索引名 on 表名(列名(长度));

(2)修改表添加索引:alter table 表名 add index 索引名(列名(长度));

(3)创建表时指定索引列:index index_name(列名(长度)));

(4)删除索引:drop index 索引名 on 表名;

3.唯一索引:

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

(1)创建唯一索引:create unique index 索引名 on 表名(列名(length));

(2)修改表添加唯一索引:alter table 表名 add unique 索引名(列名(length));

(3)创建表时指定索引列:unique index  索引名(列名(length);

4.主键索引:

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

(1)修改表添加的主键索引:alter table 表名 add primary key(列名);

(2)创建表时指定索引:primary key(列名);

5.组合索引:

组合索引是指使用多个字段创建的索引,只有在查询条件中使用了创建索引时的第一个 字段,索引才会被使用(最左前缀原则)。

(1)修改添加组合索引:

alter table 表名 add index 索引名(列名(length),列名2(length));

(2) 创建表时创建组合索引:index 索引名(列名(length),列名(length));

6. 全文索引:

全文索引(FULLTEXTINDEX)主要用来查找文本中的关键字,而不是直接与索引中的值 相比较。 FULLTEXT 索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的 where 语句的参数匹配。FULLTEXT 索引配合 match against 操作使用,而不是一般的 where 语句 加 like。

(1)创建全文索引:

1)修改添加全文索引:alter table 表名 add fulltext 索引名(content);

2)创建表时创建全文索引:FULLTEXTindex_name (column);

(2)删除全文索引:

drop 索引名 on 表名|alter table 表名 drop 索引名;

(3)使用全文索引:

全 文 索 引 的 使 用 与 其 他 索 引 不 同 。 在 查 询 语 句 中 需 要 使 用 match(column) against(‘content’) 来检索数据。

语法:SELECT 投影列 FROM 表名 WHEREMATCH(全文索引列名)AGAINST(‘搜索内容’);

三、用户管理:

MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种:root 用户,超级管 理员,和由 root 用户创建的普通用户。

1.MySQL创建用户:

CREATE USER 用户名  IDENTIFIED  BY '密码';

(1)查看用户:

SELECT USER,NOST FROM  用户名(该表位于 mysql 库中);

(2)删除用户:

DROPUSERusername@localhost;

2.分配权限:

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

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

(1)权限列表:

1)ALTER: 修改表和索引。 

2)CREATE: 创建数据库和表。 

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

4)DROP: 删除数据库和表。 

5)INDEX: 创建或删除索引。 

6)INSERT: 向表中插入新行。 

7)SELECT: 检索表中的记录。 

8)UPDATE: 修改现存表记录。

9)ALL: 所有权限,ALLPRIVILEGES 同义词。

3.通过 Navicat 工具管理用户:

(1)创建用户:

MySQL学习day-34:子查询与分页_第3张图片
MySQL学习day-34:子查询与分页_第4张图片

(2)分配权限:

MySQL学习day-34:子查询与分页_第5张图片

(3)连接数据库:

MySQL学习day-34:子查询与分页_第6张图片



四、MySQL 分页查询:

MySQL 分页查询原则:

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

2)MySQL 分页中开始位置为 0。

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

1.limit子句:

语法格式:

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

五、 MySQL 数据库存储引擎介绍

1.查看数据库引擎:

SHOW ENGINES;

2. MySQL 数据库引擎介绍:

(1)ISAM(IndexedSequentialAccessMethod):

ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数 据库被查询的次数要远大于更新的次数。因此,ISAM 执行读取操作的速度很快,而且不占 用大量的内存和存储资源。ISAM 的两个主要不足之处在于,它不支持事务处理,也不能够 容错。如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把 ISAM 用在关键任 务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL 能够支持 这样的备份应用程序。

(2)MyISAM:

MyISAM 是 MySQL 的 ISAM 扩展格式和缺省的数据库引擎。除了提供 ISAM 里所没有 的索引和字段管理的大量功能,MyISAM 还使用一种表格锁定的机制,来优化多个并发的 读写操作,其代价是你需要经常运行 OPTIMIZETABLE 命令,来恢复被更新机制所浪费的 空间。MyISAM 还有一些有用的扩展,例如用来修复数据库文件的 MyISAMCHK 工具和用 来恢复浪费空间的 MyISAMPACK 工具。MYISAM 强调了快速读取操作,这可能就是为什 么 MySQL 受到了 WEB 开发如此青睐的主要原因:在 WEB 开发中你所进行的大量数据操 作都是读取操作。所以,大多数虚拟主机提供商和 INTERNET 平台提供商只允许使用 MYISAM 格式。MyISAM 格式的一个重要缺陷就是不能在表损坏后恢复数据。 注意:MyISAM 引擎使用时必须经常使用 OptimizeTable 命令清理空间;必须经常备份 所有实时数据。工具有用来修复数据库文件的 MyISAMCHK 工具和用来恢复浪费空间的 MyISAMPACK 工具。

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

1) .frm:表结构信息 ;

2).MYD:数据文件 ;

3).MYI:表的索引信息;

(3)InnoDB:

InnoDB 数据库引擎都是造就MySQL 灵活性的技术的直接产品, 这项技术就是 MYSQL++ API。在使用 MYSQL 的时候,你所面对的每一个挑战几乎都源于 ISAM 和 MyISAM 数据库 引擎不支持事务处理(transactionprocess)也不支持外键。尽管要比 ISAM 和 MyISAM 引擎 慢很多,但是 InnoDB 包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。 如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中 的一个了。

MySQL 官方对 InnoDB 是这样解释的:InnoDB 给 MySQL 提供了具有提交、回滚和崩溃 恢复能力的事务安全(ACID 兼容)存储引擎。

(4)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,至少不会差。

六、三大范式

1.引入三大范式:

(1) 必须保证数据库设计的合理性?

1)数据库设计关系整个系统的架构,关系到后续的开发效率和运行效率;

2)数据库的设计主要包含了设计表结构和表之间的联系。

(2)如何是合理数据库?

1)结构合理;

2)冗余较小;

3)尽量避免插入删除修改异常;

(3)如何才能保证数据库设计水平?

1)遵循一定的规则;

2)在关系型数据库中这种规则就称为范式;

(4)什么是范式(NF= NormalForm)?

1)范式是符合某一种设计要求的总结。

2)要想设计一个结构合理的关系型数据库,必须满足一定的范式 。

(5)范式的分类:

1)第一范式;第二范式;第三范式;Boyce Codd范式=NCNF;由Boyce和Codd提出的; 比3NF又进了一步;通常认为是修正的第三范式.;第四范式;第五范式

2)各个范式是依次嵌套包含的;

3)范式越高,设计质量越高,在现实设计中也越难实现;

4)一般数据库设计,只要达到第三范式,即可避免异常的出现;

2.第一范式:

最基本的范式;

1)数据库表每一列都是不可分割的基本数据项,同一列中不能有多个值;

2)简单说就是要确保每列保持原子性;

3)第一范式的合理遵循需要根据系统的实际需求来定;

示例:

1)用户表(用户名,家庭地址);

2)用户表(用户名,省,城市,详细地址);

3.第二范式:

1) 第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

2)即在一个数据库表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

示例:

学号和课程编号作为联合主键;课程名称只依赖于课程编号,而和学号没有关系。

MySQL学习day-34:子查询与分页_第7张图片
MySQL学习day-34:子查询与分页_第8张图片
MySQL学习day-34:子查询与分页_第9张图片
MySQL学习day-34:子查询与分页_第10张图片

4.第三范式:

1)确保数据表中的每一列数据都和主键直接相关,而不能间接相关;

2)属性不依赖于其他非主属性。


MySQL学习day-34:子查询与分页_第11张图片
MySQL学习day-34:子查询与分页_第12张图片

5.范式的优缺点:

(1)优点:

1)结构合理;

2)冗余较小;

3)尽量避免插入删除修改异常;

(2)缺点:

1)性能降低;

2)多表查询比单表查询速度慢;

(3)数据库表之间的关系:

1)一对一:学生和学生证;

2)一对多:学生和班级;

3)多对多:学生和课程;

(4)总结:

1)使用范式可以减少冗余,但是会降低性能;

2)特定表的的设计可以违反第三范式,增加冗余提高性能;

你可能感兴趣的:(MySQL学习day-34:子查询与分页)