MySQL臨時(shí)表的使用方法詳解
1. 寫在前面的話
在開發(fā)數(shù)據(jù)庫(kù)時(shí),特別是寫存儲(chǔ)過(guò)程,遇到比較復(fù)雜的需求,使用臨時(shí)表可以簡(jiǎn)化很多邏輯。曾經(jīng)在一家互聯(lián)網(wǎng)金融公司供職,公司數(shù)據(jù)組團(tuán)隊(duì)做數(shù)據(jù)清洗,寫SQL腳本時(shí),一個(gè)查詢語(yǔ)句可以套到數(shù)層查詢,甚至十幾層??雌饋?lái)幾百行上千行的腳本,其實(shí)他只是一個(gè)查詢,就是說(shuō)是一個(gè)select基于另一個(gè)select的結(jié)果。這樣層層疊疊,同時(shí)還包含了聚合、排序、關(guān)聯(lián)、聯(lián)合等,看起來(lái)是相當(dāng)?shù)馁M(fèi)勁,頭疼。
就如下列樣式:
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...
如果這里能使用臨時(shí)表,那么就會(huì)使邏輯清晰很多,查詢效率也會(huì)得到提升。比如在多處使用到同一個(gè)查詢的結(jié)果時(shí),就可以只執(zhí)行一次查詢,將結(jié)果保存為臨時(shí)表,在查詢過(guò)程中每次使用到時(shí),直接從臨時(shí)表查就可以了,不用每次使用都再去查詢一遍原始數(shù)據(jù),尤其是對(duì)于復(fù)雜關(guān)聯(lián)查詢結(jié)果。
當(dāng)時(shí)數(shù)據(jù)是來(lái)源于呼叫中心,每天都會(huì)產(chǎn)生幾百萬(wàn)行數(shù)據(jù),一個(gè)月就上億行的數(shù)據(jù)量,就當(dāng)時(shí)的機(jī)器性能基礎(chǔ)上,在這個(gè)數(shù)據(jù)量來(lái)做統(tǒng)計(jì)操作,如果沒(méi)有高效的腳本,是非常耗時(shí)間的。同時(shí),數(shù)據(jù)組職員并沒(méi)有專業(yè)數(shù)據(jù)庫(kù)設(shè)計(jì)能力。
本文以數(shù)據(jù)庫(kù)World為例進(jìn)行說(shuō)明。
2. 臨時(shí)表的使用
World數(shù)據(jù)庫(kù)中數(shù)據(jù)表country放著全世界國(guó)家的相關(guān)信息。
2.1 創(chuàng)建一個(gè)只存放亞洲國(guó)家信息的臨時(shí)表
2.1.1 創(chuàng)建臨時(shí)表
創(chuàng)建一個(gè)只存放亞洲國(guó)家信息的臨時(shí)表,命名為TempAsiaCountries。
這里臨時(shí)只取四個(gè)字段Code
,Name
,SufaceArea
,Population
,那么創(chuàng)建臨時(shí)表的腳本如下:
# 創(chuàng)建臨時(shí)表 CREATE TEMPORARY TABLE TempAsiaCountries ( `Code` VARCHAR (10), `name` VARCHAR (30), `SufaceArea` NUMERIC, `Population` NUMERIC );
創(chuàng)建完之后,會(huì)發(fā)現(xiàn)在數(shù)據(jù)庫(kù)的表目錄下并沒(méi)有這個(gè)表,因?yàn)楸硎桥R時(shí)的,所以不會(huì)出現(xiàn)在表目錄里。
2.1.2 向臨時(shí)表里寫數(shù)據(jù)
如同寫實(shí)體表數(shù)據(jù)一樣,可以通過(guò)INSERT INTO 關(guān)鍵字進(jìn)行表插入數(shù)據(jù)操作。
# 寫數(shù)據(jù)到臨時(shí)表 INSERT INTO TempAsiaCountries SELECT `Code`, `Name`, `SurfaceArea`, `Population` FROM country WHERE `Continent` = 'Asia';
此時(shí),可以通過(guò)SELECT操作查詢臨時(shí)表里的數(shù)據(jù)。
2.2 在查詢過(guò)程中直接創(chuàng)建臨時(shí)表
在實(shí)際使用臨時(shí)表時(shí),可以更快速便捷的創(chuàng)建臨時(shí)表,如下腳本,直接以查詢結(jié)果創(chuàng)建臨時(shí)表的方法。
CREATE TEMPORARY TABLE TempAsiaCountries SELECT `Code`, `Name`, `SurfaceArea`, `Population` FROM country WHERE `Continent` = 'Asia';
2.3 查詢臨時(shí)表中的數(shù)據(jù)
對(duì)臨時(shí)表的查詢操作與實(shí)體表一樣,如下是查詢前文中所創(chuàng)建的臨時(shí)表中的數(shù)據(jù)
# 查詢臨時(shí)表 SELECT * FROM TempAsiaCountries;
可以看到查詢結(jié)果
2.4 刪除臨時(shí)表
# 刪除臨時(shí)表 DROP TABLE TempAsiaCountries;
此時(shí)再查,就會(huì)返回表不存在的結(jié)果
3. 以上操作的全部代碼
# 創(chuàng)建臨時(shí)表 CREATE TEMPORARY TABLE TempAsiaCountries ( `Code` VARCHAR (10), `name` VARCHAR (30), `SufaceArea` NUMERIC, `Population` NUMERIC ); # 第一種 # 寫數(shù)據(jù)到臨時(shí)表 INSERT INTO TempAsiaCountries SELECT `Code`, `Name`, `SurfaceArea`, `Population` FROM country WHERE `Continent` = 'Asia'; # 查詢臨時(shí)表 SELECT * FROM TempAsiaCountries; # 第二種 # 查詢數(shù)據(jù)并寫到臨時(shí)表中 CREATE TEMPORARY TABLE TempAsiaCountries SELECT `Code`, `Name`, `SurfaceArea`, `Population` FROM country WHERE `Continent` = 'Asia'; # 刪除臨時(shí)表 DROP TABLE TempAsiaCountries;
總結(jié)
臨時(shí)表在使用上與實(shí)體表沒(méi)任何區(qū)別,實(shí)事他們的區(qū)別也就是”臨時(shí)“二字。臨時(shí)表是在查詢過(guò)程中依據(jù)需要?jiǎng)?chuàng)建,并在使用完后刪除的表結(jié)構(gòu)。表可以暫存于內(nèi)存中,也可以暫存在硬盤上。
在SqlServer中的臨時(shí)表操作有全局臨時(shí)表和局部臨時(shí)表區(qū)分,他們分別用**#表名和##表名**來(lái)表示,其中全局臨時(shí)表并不會(huì)隨著用戶的退出而消失,而且其它用戶也可使用。
在MySQL中似乎沒(méi)有這個(gè)區(qū)分。
到此這篇關(guān)于MySQL臨時(shí)表使用的文章就介紹到這了,更多相關(guān)MySQL臨時(shí)表使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql通過(guò)INSERT IGNORE INTO插入拼音字符無(wú)效問(wèn)題及解決
這篇文章主要介紹了mysql通過(guò)INSERT IGNORE INTO插入拼音字符無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08使MySQL能夠存儲(chǔ)emoji表情字符的設(shè)置教程
這篇文章主要介紹了使MySQL能夠存儲(chǔ)emoji表情字符的設(shè)置教程,關(guān)鍵在于utf8mb4字符集的設(shè)置,需要的朋友可以參考下2015-12-12Linux 安裝JDK Tomcat MySQL的教程(使用Mac遠(yuǎn)程訪問(wèn))
這篇文章主要介紹了Linux 安裝JDK Tomcat MySQL(使用Mac遠(yuǎn)程訪問(wèn)),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06MySQL delete刪除數(shù)據(jù)后釋放磁盤空間的操作方法
這篇文章主要介紹了MySQL delete刪除數(shù)據(jù)后,釋放磁盤空間,文中給大家介紹了優(yōu)化表空間的多種方法,每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05MySQL如何導(dǎo)入csv格式數(shù)據(jù)文件解決方案
本文將詳細(xì)介紹MySQL如何導(dǎo)入csv格式數(shù)據(jù)文件并提供詳細(xì)解決方案,需要了解的朋友可以參考下2012-11-11