第069次(MySQL)
学习主题:MySQL
学习目标:
1 掌握 聚合函数和分组
2 掌握子查询
3 掌握正则
对应作业
- MySQL中的聚合函数
- MySQL5.7是否支持SQL99标准?
支持。
- MySQL中的数据分组
- MySQL中有哪些常用的聚合函数(组函数)?
AVG (arg)函数
对分组数据做平均值运算,参数只能是 数字类型。
SUM(arg)函数
对分组数据求和,参数只能是数字。、
MIN(arg)函数
求分组中最小数据,参数可以是数字,字符,日期。
MAX(arg)函数 最大值
COUNT(arg) 获取数据的行数
- 每个聚合函数的作用是什么?
AVG (arg)函数
对分组数据做平均值运算,参数只能是 数字类型。
SUM(arg)函数
对分组数据求和,参数只能是数字。、
MIN(arg)函数
求分组中最小数据,参数可以是数字,字符,日期。
MAX(arg)函数 最大值
COUNT(arg) 获取数据的行数
- 在MySQL中通过什么子句来创建数据分组?
Group by 进行数据分组
在分组数据中不能使用where 来约束数据,只能使用 HAVING 。
select avg(salary) from emp group by department_id
select avg(salary) 薪水 from emp group by department_id having 薪水>5000
- 如何约束数据分组?
select avg(salary) 薪水 from emp group by department_id having 薪水>5000
- 计算每个部门的平均薪水
select avg(salary) 薪水 from emp group by department_id having 薪水>5000
- 显示那些最高薪水大于 5000 的部门的部门号和最高薪水。
select avg(salary) 薪水 from emp group by department_id having 薪水>5000
- MySQL中的子查询
- MySQL的子查询可以放到SQL语句中的什么位置?
可以将子查询放在寻多SQL子句中,包括:
WHERE 子句
HAVING 子句
FROM 子句
- 使用子查询的原则是什么?
子查询放在括号中
将子查询放在比较条件的右边
在单行子查询中用单行运算符,在多行子查询中用多行运算符。
- 在MySQL中如何处理多行子查询?
select name ,salary from emp where salary =(select salary from emp where name = “小黄”)
- MySQL中的正则表达式
- MySQL中正则表达式的特点是什么?
MySQL 中允许使用正则表达式定义字符串的搜索条件,性能高于like
Mysql 中的正则表达式可以对整数或者字符检索。
使用 regexp 关键字表示正则匹配
默认忽略大小写,如果要区分大小写,使用 binary 关键字。
- MySQL中使用正则表达式的语法结构是什么?
select name from emp where name regexp “^小”
- MySQL中支持哪些正则表达式的模板?其对应的含义是什么?
- 查询雇员表中名字是以小开头的雇员名字与薪水。
select name from emp where name regexp “^小”
- 查询雇员表中名字是以明结尾的雇员名字与薪水。
select name from emp where name regexp “明$”
- MySQL中创建普通索引
- MySQL中的索引类型有哪些?
普通索引
唯一索引
主键索引
组合索引
全文索引
- 什么是索引?
MySQL 索引的建立对于MySQL 的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
- 在MySQL中创建普通索引的方式有些?
普通索引是最基本的索引,他没有任何限制。
在创建索引时,可以指定索引长度。Length 为可选参数,表示索引的长度, 只有字符串类型的字段再能指定索引长度,如果是 BLOB 和TEXT 类型,必须指定length
创建索引注意:
如果指定单列索引长度,length 必须小于这个字段允许的最大字符个数。
- 如何查询一个表中的索引?
Show index from table_name
- 如何删除一个索引?
Drop index index_name ON table
创建索引的3种方式:
create index emp_index on emp(name) 直接创建索引
alter table emp add index emp_index_d (department_id) 设置存在列为索引
create table emp4(id int , name varchar(30) , index indx_name( NAME)) 创建表设置索引
第070次(MySQL )
学习主题:MySQL
学习目标:
1 掌握Mysql索引
2 掌握用户管理
3 掌握分页 查询过程 执行计划
4 了解mysql的引擎
对应作业
- MySQL中创建唯一索引
- 什么是唯一索引?
唯一索引与普通索引类型,不同的就是:索引列的值必须唯一,但允许有空值。
- 在MySQL中如何创建唯一索引?
create unique index emp_index on emp(name) 直接创建索引
alter table emp add unique index emp_index_d (department_id) 设置存在列为索引
create table emp4(id int , name varchar(30) , unique index indx_name( NAME)) 创建表设置索引
- MySQL中创建主键索引
- 什么是主键索引?
主键索引是一种特殊的唯一索引,一个表只能有一个主键索引,不允许有空值,一般是在建表的时候同时创建主键索引。
- 在MySQL中如何创建主键索引?
创建主键 = 创建主键索引
- MySQL中创建组合索引
- 什么是组合索引?
组合索引是指使用多个字段创建的索引,只有在查询条件中使用了创建索引的第一个字段,索引才会被使用(最左前缀原则)
- 什么是最左前缀原则?
就是最左优先
- MySQL中如何创建组合索引?
ALTER TABLE table_name ADD INDEX index_name (column(length),column(length))
普通索引是一个列,组合索引是多个列。
- MySQL中创建全文索引
- 什么是全文索引?
全文索引(FULLTEXT INDEX)主要用来查找文本中的关键字,而不是直接与索引中的值相比较。FULLTEXT 索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的 where 语句的参数匹配。FULLTEXT 索引配合 match against 操作使用,而不是一般的 where 语句加 like。
全文索引可以从 CHAR、VARCHAR 或 TEXT 列中作为 CREATE TABLE 语句的一部分被创建,或是随后使用 ALTER TABLE 添加。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
- 如何创建全文索引?
ALTER TABLE table_name ADD FULLTEXT index_content(content)
- 如何删除全文索引?
DROP INDEX index_name ON table
- MySQL中使用全文索引
- 在MySQL中如何使用全文索引?
全文索引的使用与其他索引不同。在查询语句中需要使用 match(column) against(‘content’) 来检索数据。
- 什么是全文解析器?
全文索引中基本单位是”词”。分词,全文索引是以词为基础的,MySQL 默认的分词是
所有非字母和数字的特殊符号都是分词符。在检索数据时我们给定的检索条件也是词。
MySQL 中默认的全文解析器不支持中文分词。如果数据含有中文需要更换全文解析器 NGRAM。
- 在创建全文索引时如何指定解析器?
SELECT 投影列 FROM 表名 WHERE MATCH(全文索引列名) AGAINST(‘搜索内容’)
- MySQL中的用户管理
- MySQL中有几种用户类型?
root 用户,超级管理员,和由 root 用户创建的普通用户
- 在MySQL中如何创建用户?
CREATE USER username IDENTIFIED BY ‘password’;
- 在MySQL中如何查看用户信息?
SELECT USER,NOST FROM USER(该表位于 mysql 库中)
- 在MySQL中如何为用户分配权限?
新用户创建完后是无法登陆的,需要分配权限。
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
- MySQL中有哪些权限?
ALTER: 修改表和索引。
CREATE: 创建数据库和表。
DELETE: 删除表中已有的记录。
DROP: 删除数据库和表。
INDEX: 创建或删除索引。
INSERT: 向表中插入新行。
SELECT: 检索表中的记录。
UPDATE: 修改现存表记录。
FILE: 读或写服务器上的文件。
PROCESS: 查看服务器中执行的线程信息或杀死线程。
RELOAD: 重载授权表或清空日志、主机缓存或表缓存。
SHUTDOWN: 关闭服务器。
ALL: 所有权限,ALL PRIVILEGES 同义词。 USAGE: 特殊的 “无权限” 权限
- 在MySQL中如何刷新权限?
FLUSH PRIVILEGES
- 在MySQL中如何删除用户?
DROP USER username@localhost
- MySQL中使用Navicat管理用户
- 使用Navicat创建u_bjsxt用户并分配权限。
- 使用Navicat删除u_bjsxt用户。
- MySQL中的分页查询
- MySQL中的分页原则是什么?
- 在 MySQL 数据库中使用 LIMIT 子句进行分页查询。
- MySQL 分页中开始位置为 0。
- 分页子句在查询语句的最后侧。
- MySQL中分页语法是什么?
SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 开始位置,查询数量。
- MySQL执行查询过程介绍
- MySQL执行计划的作用是什么?
在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL 语句,从而知道 MySQL 是如何处理 SQL 语句的。
- MySQL执行查询处理过程是什么?
客户端向 MySQL 服务器发送一条查询请求
服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段
服务器进行 SQL 解析、预处理、再由优化器生成对应的执行计划
MySQL 根据执行计划,调用存储引擎的 API 来执行查询
将结果返回给客户端,同时缓存查询结果
- MySQL的执行计划
- 执行计划中包含哪些列?
ID select_type table type possible_keys Key key_len
Ref rows Fitered extra
- 在执行计划中每个列的作用是什么?
ID
查询执行顺序: id 值相同时表示从上向下执行 id 值相同被视为一组如果是子查询,id 值会递增,id 值越高,优先级越高
select_type
simple:表示查询中不包含子查询或者 union
primary:当查询中包含任何复杂的子部分,最外层的查询被标记成 primary derived:在 from 的列表中包含的子查询被标记成 derived subquery:在 select 或 where 列表中包含了子查询,则子查询被标记成 subquery union:两个 select 查询时前一个标记为 PRIMARY,后一个标记为 UNION。union 出现在 from 从句子查询中,外层 select 标记为 PIRMARY,union 中第一个查询为 DERIVED,第二个子查询标记为 UNION
unionresult:从 union 表获取结果的 select 被标记成 union result 。
table
显示这一行的数据是关于哪张表的。
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:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。
possible_keys
查询条件字段涉及到的索引,可能没有使用。
Key
实际使用的索引。如果为 NULL,则没有使用索引。
key_len
表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len 是根据表定义计算而得的,不是通过表内检索出的。
ref 显示索引的哪一列被使用了,如果可能的话,是一个常量 const。
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。
Fitered
显示了通过条件过滤出的行数的百分比估计值。
extra
MYSQL 如何解析查询的额外信息。
Distinct:MySQL 发现第 1 个匹配行后,停止为当前的行组合搜索更多的行。
Not exists:MySQL 能够对查询进行 LEFT JOIN 优化,发现 1 个匹配 LEFT JOIN 标准的行后,不再为前面的的行组合在该表内检查更多的行。
range checked for each record (index map: #):MySQL 没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
Using filesort:MySQL 需要额外的一次传递,以找出如何按排序顺序检索行。
Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
Using temporary:为了解决查询,MySQL 需要创建一个临时表来容纳结果。
Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
Using sort_union(…), Using union(…), Using intersect(…): 这 些 函 数 说 明 如 何 为 index_merge 联接类型合并索引扫描。
Using index for group-by:类似于访问表的 Using index 方式,Using index for group-by 表示 MySQL 发现了一个索引,可以用来查 询 GROUP BY 或 DISTINCT 查询的所有列,而不要额外搜索硬盘访问实际的表。
- MySQL的存储引擎介绍
- 如何查看MySQL的存储引擎?
- MySQL5.7中提供了哪些存储引擎?
SAM(Indexed Sequential Access Method)
MyISAM
InnoDB
- 如何修改数据库级别的存储引擎?
修改 MySQL 的 my.ini 配置文件
C:\ProgramData\MySQL\MySQL Server 5.7
default-storage-engine=数据库引擎名称重启 MySQL
- 如何修改标级别的存储引擎?
ALTER TBALE tableName engine=InnoDB 查询表的存储引擎
show create table table_name;