一、子查询
可以将子查询放在许多的 SQL 子句中,包括:WHERE 子句; HAVING 子句;FROM 子句。
使用子查询的原则:
1)子查询放在圆括号中。
2)将子查询放在比较条件的右边。
3)在单行子查询中用单行运算符,在多行子查询中用多行运算符。
1.单行子查询:
语法:select 列名... from 表名 where 列名 运算符(select查询语句)
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)创建用户:
(2)分配权限:
(3)连接数据库:
四、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)即在一个数据库表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
示例:
学号和课程编号作为联合主键;课程名称只依赖于课程编号,而和学号没有关系。
4.第三范式:
1)确保数据表中的每一列数据都和主键直接相关,而不能间接相关;
2)属性不依赖于其他非主属性。
5.范式的优缺点:
(1)优点:
1)结构合理;
2)冗余较小;
3)尽量避免插入删除修改异常;
(2)缺点:
1)性能降低;
2)多表查询比单表查询速度慢;
(3)数据库表之间的关系:
1)一对一:学生和学生证;
2)一对多:学生和班级;
3)多对多:学生和课程;
(4)总结:
1)使用范式可以减少冗余,但是会降低性能;
2)特定表的的设计可以违反第三范式,增加冗余提高性能;