数据库Database

like模糊查询

-- like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效
-- %表示任意长度字符
where name lile '%鱼';
-- _表示任意一个字符
where name lile '_鱼';

DQL:查询语句

1. 排序查询

语法:order by 子句
		order by 排序字段1 排序方式1 ,  排序字段2 排序方式2...

	排序方式:
		ASC:升序,默认的。
		DESC:降序。
select * from student order by math desc,english asc;
	注意:
		如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

2. 聚合函数:将一列数据作为一个整体,进行纵向的计算。

1. count:计算个数
	1. 一般选择非空的列:主键 count(id)
	2. count(*)	*指任何不为空的字段	SELECT COUNT(*) FROM emp;
	3. 	select count(*) from RADAR_IMG1;//50
		select count(1) from RADAR_IMG1;//50
		select count(id) from RADAR_IMG1;//50
		select count(station) from RADAR_IMG1;//49
		一般执行时间:count(*)=count(1)<count(id)<count(station)
		
2. max:计算最大值	SELECT MAX(IFNULL(math,0)) FROM emp;
3. min:计算最小值
4. sum:计算和	SELECT SUM(IFNULL(math,0)) FROM emp;
5. avg:计算平均值	SELECT AVG(IFNULL(math,0)) FROM emp;
注意:聚合函数的计算,排除null值。
解决方案:
	1. 选择不包含非空的列进行计算
	2. IFNULL函数	SELECT COUNT(IFNULL(dept_id,0)) FROM emp;

3. 分组查询

语法:group by 分组字段

1,分组之后查询的字段:分组字段、聚合函数
-- 按照性别分组。分别查询男、女同学的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数
SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
--  按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;

2,where 和 having 的区别?
	1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
	-- 当salary>5000时,以job_id分组,查询每个job_id个数,和平均salary
	SELECT job_id,COUNT(job_id),AVG(salary) FROM emp WHERE salary>5000 GROUP BY job_id;
	2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math),COUNT(id) num FROM student WHERE math > 70 GROUP BY sex HAVING num > 2; 	--聚合函数起了个别名

4. 分页查询

1. 语法:limit 开始的索引,每页查询的条数;
2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
	-- 每页显示3条记录 
	SELECT * FROM student LIMIT 0,3; -- 第1页
	SELECT * FROM student LIMIT 3,3; -- 第2页
	SELECT * FROM student LIMIT 6,3; -- 第3页
3. limit 是一个MySQL"方言"

约束

概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。	
分类:
1. 主键约束:primary key
2. 非空约束:not null
3. 唯一约束:unique
4. 外键约束:foreign key

非空约束

非空约束:not null,某一列的值不能为null
1. 创建表时添加约束
	CREATE TABLE stu(
		id INT,
		NAME VARCHAR(20) NOT NULL -- name为非空
	);
2. 创建表完后,添加非空约束
	ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
3. 删除name的非空约束(其实就是修改表字段)
	ALTER TABLE stu MODIFY NAME VARCHAR(20);
4. 删除表	drop table stu;

唯一约束:unique,某一列的值不能重复

1. 注意:
唯一约束可以有NULL值,但是只能有一条记录为null
2. 在创建表时,添加唯一约束
	CREATE TABLE stu(
		id INT,
		phone_number VARCHAR(20) UNIQUE -- 手机号
	);
3. 删除唯一约束
	ALTER TABLE stu DROP INDEX phone_number;
4. 在表创建完后,添加唯一约束
	ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

主键约束:primary key

1. 注意:
	1. 含义:非空且唯一
	2. 一张表只能有一个字段为主键
	3. 主键就是表中记录的唯一标识

2. 在创建表时,添加主键约束
	create table stu(
		id int primary key,-- 给id添加主键约束
		name varchar(20)
	);

3. 删除主键
	-- 错误 alter table stu modify id int ;
	ALTER TABLE stu DROP PRIMARY KEY;

4. 创建完表后,添加主键
	ALTER TABLE stu MODIFY id INT PRIMARY KEY;
 
5. 自动增长:
	1.  概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

	2. 在创建表时,添加主键约束,并且完成主键自增长
	create table stu(
		id int primary key auto_increment,-- 给id添加主键约束
		name varchar(20)
	);
3. 删除自动增长
ALTER TABLE stu MODIFY id INT;
4. 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

外键约束

外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
1. 在创建表时,可以添加外键
语法:
	create table 表名(
		....
		外键列
		constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
	);
例子:
CREATE TABLE dept(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT, -- 外键对应主表的主键
-- 创建外键约束
CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES dept(id)
)

2. 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
例如:ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

3. 创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
例如:ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES dept(id);

4. 级联操作
	1. 添加级联操作
		语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
				FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
		例如:添加外键,设置级联更新,设置级联删除
		ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE;
	2. 分类:
		1. 级联更新:ON UPDATE CASCADE 
		2. 级联删除:ON DELETE CASCADE 

在这里插入图片描述

视图

-- 原sql
SELECT * FROM emp;
-- 视图
-- 视图:用来方便查询,通用语法
-- 创建视图: CREATE VIEW <视图名> AS <SELECT语句>
CREATE VIEW view_emp AS SELECT * FROM emp;
-- 查看视图内容: SELECT * FROM 视图名;
SELECT * FROM view_emp;
-- 查看视图: DESC 视图名;
DESC view_emp; -- 查看视图中表的结构
-- 修改视图: ALTER VIEW <视图名> AS <SELECT语句>
-- 删除视图: DROP VIEW 视图名;

索引

普通索引与联合索引的区别
如何创建联合索引

-- 索引
-- alter table 表名 add index 索引名(字段名);
ALTER TABLE emp ADD INDEX index_salary(salary);

-- 创建普通索引
CREATE INDEX title_index ON test(title);
CREATE INDEX INDEX_DAY_ELEMENT_PROPERTY ON SURF_CHN_MUL_DAY_TEMP(ELEMENT_PROPERTY);
CREATE INDEX INDEX_DAY_STATION_ID_C ON SURF_CHN_MUL_DAY_TEMP(STATION_ID_C);

-- 查看表中索引,有主键索引和普通索引
SHOW INDEX FROM test;

-- 创建联合索引
-- 查询时经常包括两个以上条件时,把这个创建成联合索引
-- 最左前缀原则,比如创建联合索引a,b,其实创建了索引a和索引a,b
-- 把经常查询的字段往左放

如果一个组合索引的第一个字段使用了 IN 操作符,并且 IN 中只有一个值,那么该字段可以使用索引,并且查询效率相对较高。因为索引已经按照第一个字段进行排序了,此时查询只需要查找该字段等于该值的记录即可。
如果 IN 中包含多个值,则通常情况下索引就无法进行有效利用了,因为一个索引只能用于匹配一种值,如果查找的值无法在索引中连续地排列,那么索引的效率就会降低。

创建联合索引时,发现索引失效,后改为将DAY,MON,YEAR放在最前面,索引生效。
create index INDEX_DAY_EXTREME_PROP_STATION
    on SURF_CHN_MUL_DAY_EXTREME_TEMP(ELEMENT_PROPERTY, STATION_ID_C, YEAR, MON, DAY);
create index INDEX_DAY_AVG_PROP_STATION 
    on SURF_CHN_MUL_DAY_AVG_TEMP(DAY,MON,YEAR,ELEMENT_PROPERTY, STATION_ID_C);

EXPLAIN
select temp.PROVINCE,temp.CITY,temp.CNTY,temp.ADMIN_CODE_CHN,temp.STATION_NAME,temp.STATION_ID_C,temp.YEAR,temp.MON,temp.DAY,temp.ELEMENT_VALUE,temp.ELEMENT_FRONT,temp.ELEMENT_COLUMN,temp.FENG_XIANG
from SURF_CHN_MUL_DAY_EXTREME_TEMP temp where
ELEMENT_PROPERTY in('WIN_S_Inst_Max','TEM_Min')
and STATION_ID_C in ('53735','57036')
and YEAR<='2020' and year >='2010'
and mon='6'
and day='1'

EXPLAIN前后调试结果,当组合索引第一个字段查询多个值时,使用全表查询
SeqScan(1 1) cost=16114423,result_num=1935
BtIdxScan[(1 1) cost=3420,result_num=1935](table=SURF_CHN_MUL_DAY_EXTREME_TEMP)(index=INDEX_DAY_MON_YEAR_ELE_STA)

索引查询失效?

1,like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
2,or语句前后没有同时使用索引。
3,如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
4,在索引列上使用 IS NULL 或 IS NOT NULL操作。
5,在索引字段上使用not,<>,!=,它的处理只会产生全表扫描
6,当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效

sql优化explain调试

分析sql,进行explain调试,查看语句执行时间
-- 执行计划
-- 语法: explain sql语句
-- type:查询类型,SQL优化中非常重要的指标
type :查询类型  system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
-- type=ref
EXPLAIN
select *
from SURF_CHN_MUL_YER_TEMP
where
ELEMENT_PROPERTY ='SSH' and
STATION_ID_C='57034'
and year='1999';

-- type=all
EXPLAIN
select *
from SURF_CHN_MUL_YER_TEMP
where
-- ELEMENT_PROPERTY ='SSH' and
STATION_ID_C='57034'
and year='1999';

在这里插入图片描述

数据库设计的范式

概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

1. 第一范式(1NF):每一列都是不可分割的原子数据项
每一列不能表示两列数据,比如系(系名,系主任)需要分开表示
存在的问题:
存在严重的数据冗余(学生,系名,系主任)
添加数据存在问题:添加新开设的系名,系主任时(不添加学生),数据不合法
数据删除存在问题:某同学毕业了,需要删除数据,同时相对应的系数据也被删除了

在这里插入图片描述

2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
其实就是说表中必须消除部分依赖,比如(系名,系主任)
	几个概念:
	1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
		例如:学号-->姓名。  (学号,课程名称) --> 分数
	2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
		例如:(学号,课程名称) --> 分数
	3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
		例如:(学号,课程名称) -- > 姓名
	4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
		例如:学号-->系名,系名-->系主任
	5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
		例如:该表中码为:(学号,课程名称)
		* 主属性:码属性组中的所有属性
		* 非主属性:除过码属性组的属性

存在的问题:
添加数据存在问题:添加新开设的系名,系主任时(不添加学生),数据不合法
数据删除存在问题:某同学毕业了,需要删除数据,同时相对应的系数据也被删除了

在这里插入图片描述

3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
解决了第二范式中存在的问题

在这里插入图片描述

数据库的备份和还原

备份
任意路径打开cmd执行
备份命令: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
如:mysqldump -uroot -proot benjamin > d://backup.sql
删除数据库:drop database 数据库名称;
展示数据库:show database;
还原
1,创建数据库:create database 数据库名称;
2,使用数据库:use 数据库名称;
3,执行 :source d://backup.sql
图形化工具
直接在SQLyog中
备份:右击某个数据库–>备份/导出–>备份数据库,转储到sql…–>选择导出路径
还原:空白处右击–>执行sql脚本–>选择备份路径

笛卡尔积

有两个集合A,B .取这两个集合的所有组成情况(比如A表3条数据,B表5条数据,笛卡尔积就是15条数据,其中包括了无用的数据)。
要完成多表查询,需要消除无用的数据

多表查询

原始表数据

emp表数据
id,		name,		age,	dept_id
1,		zhangsan,	18,			1
2,		lisi,		20,			2
3,		wangwu,		22,			null

dept表数据
id,		name
1,		市场部
2,		研发部
3,		离退办

内连接

内连接时emp表id=3,因为dept_id=null,会被认为此数据不合法,所以内连接时不显示emp表id=3的数据。
# 隐式内连接
SELECT t1.name,t1.age,t2.name FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id`;
# 显式内连接
语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件
SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;

内连接结果如下:
1,zhangsan,18,1,1,市场部
2,lisi,20,2,2,研发部

左外连接


# 左外连接
语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
	查询的是左表所有数据以及其交集部分,主表是表1
	左外连接以左表为主,显示没有dept_id的wangwu
SELECT 	t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;

右外连接

# 右外连接
语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
	查询的是右表所有数据以及其交集部分,主表是表2。
	右外连接以右表为主,显示没有emp的部门3
SELECT 	* FROM emp t1 RIGHT JOIN dept t2 ON t1.`dept_id` = t2.`id`;

子查询

查询中嵌套查询,称嵌套查询为子查询。

-- 查询工资最高的员工信息
-- 1 查询最高的工资是多少 9000
SELECT MAX(salary) FROM emp;
-- 2 查询员工信息,并且工资等于9000的
SELECT * FROM emp WHERE emp.`salary` = 9000;

-- 一条sql就完成这个操作。子查询
SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
  1. 子查询的结果是单行单列的:
	子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
	-- 查询员工工资小于平均工资的人
	SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
  1. 子查询的结果是多行单列的:
子查询可以作为条件,使用运算符in来判断
-- 查询'财务部''市场部'所有的员工信息
SELECT id FROM dept WHERE NAME in ('财务部','市场部');
SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;
-- 子查询
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME in ('财务部','市场部'));
  1. 子查询的结果是多行多列的:
子查询可以作为一张虚拟表参与查询
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
-- 子查询
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2
WHERE t1.id = t2.dept_id;
-- 普通内连接
SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` >  '2011-11-11'

查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
SELECT t1.`id`,t1.`dname`,t1.`loc` , t2.total
FROM dept t1,(SELECT dept_id,COUNT(id) total FROM emp GROUP BY dept_id) t2
WHERE t1.`id` = t2.dept_id;

事务

如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。

操作:
1. 开启事务: start transaction;
2. 回滚:rollback;
3. 提交:commit;
-- 0. 开启事务
START TRANSACTION;
-- 1. 张三账户 -500
UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
-- 2. 李四账户 +500
-- 出错了...
UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';

-- 发现执行没有问题,提交事务
COMMIT;

-- 发现出问题了,回滚事务
ROLLBACK;
MySQL数据库中事务默认自动提交
	一条DML(增删改)语句会自动提交一次事务。
	修改事务的默认提交方式:
			查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交  0 代表手动提交
			修改默认提交方式: set @@autocommit = 0;
Oracle 数据库默认是手动提交事务
	需要先开启事务,再提交

事务的四大特征

1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
3. 隔离性:多个事务之间。相互独立。
4. 一致性:事务操作前后,数据总量不变

事务的隔离级别

多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
存在问题:
	1. 脏读:一个事务,读取到另一个事务中没有提交的数据
			事务a,转账了,但是没有提交;事务b查询到的是转账后的数据
	2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
			事务a,转账了,但是没有提交;事务b查询到的是转账前的数据;事务a提交后,事务b查到的转账后数据
	3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
隔离级别:
	1. read uncommitted:读未提交
		产生的问题:脏读、不可重复读、幻读
	2. read committed:读已提交 (Oracle)
		产生的问题:不可重复读、幻读
	3. repeatable read:可重复读 (MySQL默认)
		产生的问题:幻读
	4. serializable:串行化
		可以解决所有的问题,事务a操作表b时,表b被锁定,别的事务就不能操作表b了,但是效率最低

	注意:隔离级别从小到大安全性越来越高,但是效率越来越低
	数据库查询隔离级别:
		select @@tx_isolation;
	数据库设置隔离级别:
		set global transaction isolation level  级别字符串;

演示:
	set global transaction isolation level read uncommitted;
	start transaction;
	-- 转账操作
	update account set balance = balance - 500 where id = 1;
	update account set balance = balance + 500 where id = 2;

DCL管理用户,授权

SQL分类:
	1. DDL:操作数据库和表
	2. DML:增删改表中数据
	3. DQL:查询表中数据
	4. DCL:管理用户,授权
DCL:管理用户,授权
	1. 管理用户
		1. 添加用户:
			语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
		2. 删除用户:
			语法:DROP USER '用户名'@'主机名';
		3. 修改用户密码:
			UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
			UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
			SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
			SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');

			mysql中忘记了root用户的密码?
				1. cmd -- > net stop mysql 停止mysql服务
					* 需要管理员运行该cmd
				2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
				3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
				4. use mysql;
				5. update user set password = password('你的新密码') where user = 'root';
				6. 关闭两个窗口
				7. 打开任务管理器,手动结束mysqld.exe 的进程
				8. 启动mysql服务
				9. 使用新密码登录。
		4. 查询用户:
			-- 1. 切换到mysql数据库
			USE myql;
			-- 2. 查询user表
			SELECT * FROM USER;
	2. 权限管理:
		1. 查询权限:
			-- 查询权限
			SHOW GRANTS FOR '用户名'@'主机名';
			SHOW GRANTS FOR 'lisi'@'%';
			通配符: % 表示可以在任意主机使用用户登录数据库
		2. 授予权限:
			-- 授予权限
			grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
			-- 给张三用户授予查询,修改权限,在数据库db3 account表上
			GRANT SELECT,DELETE ON db3.account TO 'zhangsan'@'localhost';
			-- 给张三用户授予所有权限,在任意数据库任意表上
			GRANT ALL ON *.* TO 'zhangsan'@'localhost';
		3. 撤销权限:
			-- 撤销权限:
			revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
			REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';

sql优化

在这里插入图片描述
1,select * from user;客户端会常用tcp协议发送给数据库,
先将sql语句转变成hash值当成key与查询缓存中key进行比较,如果相同直接返回value结果
2,如果key不同,就到了解析器(判断语法关键字拼写顺序),如果解析成功生成解析树(select是一行,*是一行 。。。 )
3,预处理器(表、列是否存在,分析是否有歧义),如果处理成功生成新的解析树
4,查询优化器(对客户端发送的sql进行优化)
5,生成执行计划
6,查询执行引擎(InnoDB、MyISAM)
7,由存储引擎访问实际的物理文件
8,返回结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值