MySQL临时表的使用方法详解

目录
  • 1. 写在前面的话
  • 2. 临时表的使用
    • 2.1 创建一个只存放亚洲国家信息的临时表
      • 2.1.1 创建临时表
      • 2.1.2 向临时表里写数据
    • 2.2 在查询过程中直接创建临时表
    • 2.3 查询临时表中的数据
    • 2.4 删除临时表
  • 3. 以上操作的全部代码
  • 总结

1. 写在前面的话

在开发数据库时,特别是写存储过程,遇到比较复杂的需求,使用临时表可以简化很多逻辑。曾经在一家互联网金融公司供职,公司数据组团队做数据清洗,写SQL脚本时,一个查询语句可以套到数层查询,甚至十几层。看起来几百行上千行的脚本,其实他只是一个查询,就是说是一个select基于另一个select的结果。这样层层叠叠,同时还包含了聚合、排序、关联、联合等,看起来是相当的费劲,头疼。

就如下列样式:

SELECT
	T1.A1,
	T1.A2,
	T1.A3...
FROM
	(
		SELECT
			T2.B1,
			T2.B2,
			T2.B3...
		FROM
			(
				SELECT
					...
				UNION ALL
					SELECT
						...)
					WHERE
						...
					GROUP BY
						...) T1,
						(
							SELECT
								T3.C1,
								T3.C2,
								T3.C3...
							FROM
								(
									SELECT
										...)
									WHERE
										...
									GROUP BY
										...) T3
									WHERE
										T1.A1 = T3.C1...

如果这里能使用临时表,那么就会使逻辑清晰很多,查询效率也会得到提升。比如在多处使用到同一个查询的结果时,就可以只执行一次查询,将结果保存为临时表,在查询过程中每次使用到时,直接从临时表查就可以了,不用每次使用都再去查询一遍原始数据,尤其是对于复杂关联查询结果。

当时数据是来源于呼叫中心,每天都会产生几百万行数据,一个月就上亿行的数据量,就当时的机器性能基础上,在这个数据量来做统计操作,如果没有高效的脚本,是非常耗时间的。同时,数据组职员并没有专业数据库设计能力。

本文以数据库World为例进行说明。

2. 临时表的使用

World数据库中数据表country放着全世界国家的相关信息。

2.1 创建一个只存放亚洲国家信息的临时表

2.1.1 创建临时表

创建一个只存放亚洲国家信息的临时表,命名为TempAsiaCountries
这里临时只取四个字段Code,Name,SufaceArea,Population,那么创建临时表的脚本如下:

# 创建临时表
CREATE TEMPORARY TABLE TempAsiaCountries (
	`Code` VARCHAR (10),
	`name` VARCHAR (30),
	`SufaceArea` NUMERIC,
	`Population` NUMERIC
);

创建完之后,会发现在数据库的表目录下并没有这个表,因为表是临时的,所以不会出现在表目录里。

2.1.2 向临时表里写数据

如同写实体表数据一样,可以通过INSERT INTO 关键字进行表插入数据操作。

# 写数据到临时表
INSERT INTO TempAsiaCountries
SELECT
	`Code`,
	`Name`,
	`SurfaceArea`,
	`Population`
FROM
	country
WHERE
	`Continent` = 'Asia';

此时,可以通过SELECT操作查询临时表里的数据。

2.2 在查询过程中直接创建临时表

在实际使用临时表时,可以更快速便捷的创建临时表,如下脚本,直接以查询结果创建临时表的方法。

CREATE TEMPORARY TABLE TempAsiaCountries
SELECT
	`Code`,
	`Name`,
	`SurfaceArea`,
	`Population`
FROM
	country
WHERE
	`Continent` = 'Asia';

2.3 查询临时表中的数据

对临时表的查询操作与实体表一样,如下是查询前文中所创建的临时表中的数据

# 查询临时表
SELECT *
FROM TempAsiaCountries;

可以看到查询结果

2.4 删除临时表

# 删除临时表
DROP TABLE TempAsiaCountries;

此时再查,就会返回表不存在的结果

3. 以上操作的全部代码

# 创建临时表
CREATE TEMPORARY TABLE TempAsiaCountries (
	`Code` VARCHAR (10),
	`name` VARCHAR (30),
	`SufaceArea` NUMERIC,
	`Population` NUMERIC
);

# 第一种
# 写数据到临时表
INSERT INTO TempAsiaCountries
SELECT
	`Code`,
	`Name`,
	`SurfaceArea`,
	`Population`
FROM
	country
WHERE
	`Continent` = 'Asia';

# 查询临时表
SELECT *
FROM TempAsiaCountries;

# 第二种
# 查询数据并写到临时表中
CREATE TEMPORARY TABLE TempAsiaCountries
SELECT
	`Code`,
	`Name`,
	`SurfaceArea`,
	`Population`
FROM
	country
WHERE
	`Continent` = 'Asia';

# 删除临时表
DROP TABLE TempAsiaCountries;

总结

临时表在使用上与实体表没任何区别,实事他们的区别也就是”临时“二字。临时表是在查询过程中依据需要创建,并在使用完后删除的表结构。表可以暂存于内存中,也可以暂存在硬盘上。

在SqlServer中的临时表操作有全局临时表和局部临时表区分,他们分别用**#表名##表名**来表示,其中全局临时表并不会随着用户的退出而消失,而且其它用户也可使用。

在MySQL中似乎没有这个区分。

到此这篇关于MySQL临时表使用的文章就介绍到这了,更多相关MySQL临时表使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL 内存表和临时表的用法详解

    内存表: session 1 $ mysql -uroot root@(none) 10:05:06>use test Database changed root@test 10:06:06>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY; Query OK, 0 rows affected (0.00 sec) root@test 10:08:46>insert into tmp_memory values (1); Query OK,

  • MySQL中临时表的基本创建与使用教程

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. 创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字: CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL ) 临时表将在你连接MySQL期间存在.当

  • MySQL中关于临时表的一些基本使用方法

    临时表可能是非常有用的,在某些情况下,保持临时数据.最重要的是应该知道的临时表是,他们将当前的客户端会话终止时被删除. 临时表中添加MySQL版本3.23.如果您使用的是旧版本的MySQL比3.23,可以不使用临时表,但可以使用堆表. 如前所述临时表将只持续只要的会话是存在的.如果运行一个PHP脚本中的代码,该临时表将被销毁时,会自动执行完脚本后.如果已连接到MySQL数据库的服务器上,通过MySQL的客户端程序的临时表将一直存在,直到关闭客户端或手动破坏的表. 实例 下面是一个例子,使用临时表

  • MySQL使用临时表加速查询的方法

    本文实例讲述了MySQL使用临时表加速查询的方法.分享给大家供大家参考.具体分析如下: 使用MySQL临时表,有时是可以加速查询的,下面就为您详细介绍使用MySQL临时表加速查询的方法. 把表的一个子集进行排序并创建MySQL临时表,有时能加速查询.它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作.例如: 复制代码 代码如下: SELECT cust.name,rcVBles.balance,--other columns  SELECT cust.name,rcVBles.bala

  • mysql复制中临时表的运用技巧

    我们知道,临时表有以下特性: 1. SESSION 级别,SESSION 一旦断掉,就被自动DROP 了. 2. 和默认引擎有关.如果默认引擎是INNODB,而你又疯狂的使用临时表.那么,你的IBDATA会被无限的增大. 3. 和磁盘表一样,默认写入到binlog, 而且被动的加入了rollback 计划. 幻想如下场景: 数据库损坏,也没有备份.刚好二进制日志全部保存完好,幸福了.导入二进制日志到MYSQL. 有两种方法: 1) mysqlbinlog ..... *.log | mysql

  • mysql 临时表 cann't reopen解决方案

    当你创建临时表的时候,你可以使用temporary关键字.如: 复制代码 代码如下: create temporary table tmp_table(name varchar(10) not null,passwd char(6) not null); 或 复制代码 代码如下: create temporary table if not exists sp_output_tmp engine= memory select -from - where ID=current_id; 临时表只在当前

  • MySQL临时表的简单用法介绍

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. 创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字: CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL ) 临时表将在你连接MySQL期间存在.当

  • MySQL两种临时表的用法详解

    外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表.这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭.这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除). 内部临时表 内部临时表是一种特殊轻量级的临时表,用来进行性能优化.这种临时表会被MySQL自动创建并用来存储某些操作的中间结果.这些操作可能包括在优化阶段或者执行阶段.这种内部表对用户来说是不可见的,但是通过EXPLAIN或者SHOW S

  • 解析Mysql临时表及特点

    临时表是当连接没有断开时存在,一旦断开就不会存在,临时表的数据和结构都在内存中,可以做个测验,你创建一个临时表,但是到响应的数据目录下并不会找到.frm文件mysql> CREATE TEMPORARY TABLE tmp_table (    ->    -> name VARCHAR(10) NOT NULL,    -> value INTEGER NOT NULL    ->    -> ) ;Query OK, 0 rows affected (0.38 se

  • MySQL临时表的使用方法详解

    目录 1. 写在前面的话 2. 临时表的使用 2.1 创建一个只存放亚洲国家信息的临时表 2.1.1 创建临时表 2.1.2 向临时表里写数据 2.2 在查询过程中直接创建临时表 2.3 查询临时表中的数据 2.4 删除临时表 3. 以上操作的全部代码 总结 1. 写在前面的话 在开发数据库时,特别是写存储过程,遇到比较复杂的需求,使用临时表可以简化很多逻辑.曾经在一家互联网金融公司供职,公司数据组团队做数据清洗,写SQL脚本时,一个查询语句可以套到数层查询,甚至十几层.看起来几百行上千行的脚本

  • 查看mysql当前连接数的方法详解

    1.查看当前所有连接的详细资料: ./mysqladmin -uadmin -p -h10.140.1.1 processlist2.只查看当前连接数(Threads就是连接数.): ./mysqladmin -uadmin -p -h10.140.1.1 status .查看当前所有连接的详细资料: mysqladmin -uroot -proot processlist D:\MySQL\bin>mysqladmin -uroot -proot processlist| Id | User

  • zabbix监控MySQL主从状态的方法详解

    搭建MySQL主从后,很多时候不知道从的状态是否ok,有时候出现异常不能及时知道,这里通过shell脚本结合zabbix实现监控并告警 一般情况下,在MySQL的从上查看从的运行状态是通过Slave_IO_Running线程和Slave_SQL_Running线程是否ok,通过命令"show slave status\G;"即可查看.所以这里根据这两个值进行判断. agent端脚本编写及配置 说明:所有zabbix相关的脚本我都放在了/etc/zabbix/script/ 目录里面,下

  • Mysql之组合索引方法详解

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找.例如: 假设存在组合索引(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够使用该索引.查询语句select * from t1 where c1=1也能够使用该索引.但是,查询语句select * from t1

  • MySQL联合查询实现方法详解

    联合查询简单说 就是将两次查询合并在一起 例如 我们这里有一个用户表 我们先编写一段SQL select name from staff where age > 21; 查询年龄大于21的 输出结果如下 然后我们再写一段sql select name from staff where status =1; 查询 status 状态字段等于1 的 输出效果如下 然后我们可以二合一一下 select name from staff where age > 21 union all select n

  • MySQL关联查询优化实现方法详解

    目录 左外连接 内连接INNER JOIN 我们准备如下两个表,并插入数据. #分类 CREATE TABLE IF NOT EXISTS `type` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT(10) UNSIGNED NOT NULL, PRIMARY KEY (`id`) ); #图书 CREATE TABLE IF NOT EXISTS `book` ( `bookid` INT(10) UNSIGNED NO

  • MySQL binlog 远程备份方法详解

    以前备份binlog时,都是先在本地进行备份压缩,然后发送到远程服务器中.但是这其中还是有一定风险的,因为日志的备份都是周期性的,如果在某个周期中,服务器宕机了,硬盘损坏了,就可能导致这段时间的binlog就丢失了. 而且,以前用脚本对远程服务器进行备份的方式,有个缺点:无法对MySQL服务器当前正在写的二进制日志文件进行备份.所以,只能等到MySQL服务器全部写完才能进行备份.而写完一个binlog的时间并不固定,这就导致备份周期的不确定. 从MySQL5.6开始,mysqlbinlog支持将

  • MySQL主从数据库搭建方法详解

    本文实例讲述了MySQL主从数据库搭建方法.分享给大家供大家参考,具体如下: 主从服务器是mysql实时数据同步备份的一个非常好的方案了,现在各大中小型网都都会使用mysql数据库主从服务器功能来对网站数据库进行异步备份了,下面我们来给大家介绍主从服务器配置步骤. Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务. (1)首先确保主从服务器上的Mysql版本相同 (2)在主服务器上,设置一个从数据库的账户,使用R

  • MySQL延时复制库方法详解

    简单的说延迟复制就是设置一个固定的延迟时间,比如1个小时,让从库落后主库一个小时. MySQL延时复制库作用 存在即合理,延迟复制可以用来解决以下三类问题:  1.用来在数据库误操作后,快速的恢复数据. 比如有人误操作的表,那么这个操作在延迟时间内,从库的数据并没有发生变化,可以用从库的数据进行快速恢复. 把服务停了,把从库的表直接导入主库,补binlog,binglog不能恢复表  2.用来做延迟测试 比如你做好的数据库读写分离,把从库作为读库,那么你想知道当数据产生延迟的时候到底会发生什么.

  • mysql delete limit 使用方法详解

    mysql delete limit优点: 用于DELETE的MySQL唯一的LIMIT row_count选项用于告知服务器在控制命令被返回到客户端前被删除的行的最大值.本选项用于确保一个DELETE语句不会占用过多的时间.您可以只重复DELETE语句,直到相关行的数目少于LIMIT值为止. 如果DELETE语句包括一个ORDER BY子句,则各行按照子句中指定的顺序进行删除.此子句只在与LIMIT联用是才起作用.例如,以下子句用于查找与WHERE子句对应的行,使用timestamp_colu

随机推荐