MySQL臨時(shí)表的使用方法詳解
1. 寫在前面的話
在開發(fā)數(shù)據(jù)庫時(shí),特別是寫存儲(chǔ)過程,遇到比較復(fù)雜的需求,使用臨時(shí)表可以簡化很多邏輯。曾經(jīng)在一家互聯(lián)網(wǎng)金融公司供職,公司數(shù)據(jù)組團(tuán)隊(duì)做數(shù)據(jù)清洗,寫SQL腳本時(shí),一個(gè)查詢語句可以套到數(shù)層查詢,甚至十幾層??雌饋韼装傩猩锨械哪_本,其實(shí)他只是一個(gè)查詢,就是說是一個(gè)select基于另一個(gè)select的結(jié)果。這樣層層疊疊,同時(shí)還包含了聚合、排序、關(guān)聯(lián)、聯(lián)合等,看起來是相當(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í)表,在查詢過程中每次使用到時(shí),直接從臨時(shí)表查就可以了,不用每次使用都再去查詢一遍原始數(shù)據(jù),尤其是對(duì)于復(fù)雜關(guān)聯(lián)查詢結(jié)果。
當(dāng)時(shí)數(shù)據(jù)是來源于呼叫中心,每天都會(huì)產(chǎn)生幾百萬行數(shù)據(jù),一個(gè)月就上億行的數(shù)據(jù)量,就當(dāng)時(shí)的機(jī)器性能基礎(chǔ)上,在這個(gè)數(shù)據(jù)量來做統(tǒng)計(jì)操作,如果沒有高效的腳本,是非常耗時(shí)間的。同時(shí),數(shù)據(jù)組職員并沒有專業(yè)數(shù)據(jù)庫設(shè)計(jì)能力。
本文以數(shù)據(jù)庫World為例進(jìn)行說明。
2. 臨時(shí)表的使用
World數(shù)據(jù)庫中數(shù)據(jù)表country放著全世界國家的相關(guān)信息。
2.1 創(chuàng)建一個(gè)只存放亞洲國家信息的臨時(shí)表
2.1.1 創(chuàng)建臨時(shí)表
創(chuàng)建一個(gè)只存放亞洲國家信息的臨時(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ù)庫的表目錄下并沒有這個(gè)表,因?yàn)楸硎桥R時(shí)的,所以不會(huì)出現(xiàn)在表目錄里。
2.1.2 向臨時(shí)表里寫數(shù)據(jù)
如同寫實(shí)體表數(shù)據(jù)一樣,可以通過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í),可以通過SELECT操作查詢臨時(shí)表里的數(shù)據(jù)。
2.2 在查詢過程中直接創(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í)體表沒任何區(qū)別,實(shí)事他們的區(qū)別也就是”臨時(shí)“二字。臨時(shí)表是在查詢過程中依據(jù)需要?jiǎng)?chuàng)建,并在使用完后刪除的表結(jié)構(gòu)。表可以暫存于內(nèi)存中,也可以暫存在硬盤上。
在SqlServer中的臨時(shí)表操作有全局臨時(shí)表和局部臨時(shí)表區(qū)分,他們分別用**#表名和##表名**來表示,其中全局臨時(shí)表并不會(huì)隨著用戶的退出而消失,而且其它用戶也可使用。
在MySQL中似乎沒有這個(gè)區(qū)分。
到此這篇關(guān)于MySQL臨時(shí)表使用的文章就介紹到這了,更多相關(guān)MySQL臨時(shí)表使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL獲得當(dāng)前日期時(shí)間函數(shù)示例詳解
這篇文章主要給大家介紹了關(guān)于MySQL獲得當(dāng)前日期時(shí)間函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12mysql8.0.20安裝與連接navicat的方法及注意事項(xiàng)
這篇文章主要介紹了mysql8.0.20安裝與連接navicat的方法及注意事項(xiàng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05MySQL數(shù)據(jù)庫基本SQL語句教程之高級(jí)操作
對(duì)MySQL數(shù)據(jù)庫的查詢,除了基本的查詢外,有時(shí)候需要對(duì)查詢的結(jié)果集進(jìn)行處理,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫基本SQL語句教程之高級(jí)操作的相關(guān)資料,需要的朋友可以參考下2022-06-06如何把本地mysql遷移到服務(wù)器數(shù)據(jù)庫
這篇文章主要介紹了如何把本地mysql遷移到服務(wù)器數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11MySql子查詢IN的執(zhí)行和優(yōu)化的實(shí)現(xiàn)
本文主要介紹了MySql子查詢IN的執(zhí)行和優(yōu)化的實(shí)現(xiàn),詳細(xì)的介紹了為什么IN這么慢以及如何優(yōu)化,具有一定的參考價(jià)值,感興趣的可以了解一下2021-07-07MySQL server has gone away的問題解決
本文主要介紹了MySQL server has gone away的問題解決,意思就是指client和MySQL server之間的鏈接斷開了,下面就來介紹一下幾種原因及其解決方法,感興趣的可以了解一下2024-07-07