sql定義臨時表
A. 關於sql的臨時表、自定義函數、儲存過程的問題
如果你有編程基礎的話
那麼自定義函數和存儲過程的區別,就是程序裡面函數與過程的區別,函數只是為了實現某個功能,而過程是為了實現某個流程。
至於使用的時間
這個跟你的實際需求有關系的,一般系統帶的函數就能滿足需求。
存儲過程這個看你項目的訪問量,訪問量小的話
如果是快速開發不會用到存儲過程
直接在程序裡面寫SQL語句就OK。如果訪問量大,那麼必須使用存儲過程。
臨時表的好處是它可以是只對某個用戶的表,而且不具有實際意義,並且可以定義自動銷毀的臨時表。跟視圖在某種情況下有相同之處。
臨時表的試用時間也是跟你的需求有關系的。
創建語句差不多
都是T-SQL語句。
最後一個問題你得搜索一下才知道,一般情況下定義的臨時表都是自動銷毀的,使用完畢會drop掉(節省資源,如果是#開頭的臨時表
系統會自動在使用完畢後銷毀掉。)
B. SQL 創建一個臨時表#tabletemp 裡面有兩個欄位「cn」和「dt」分別用來存儲另一個表的欄位名和數據類型。
提到MySQL臨時表,我們都很熟悉了,一般來說,分為兩類:
1. MySQL 臨時表引擎,名字叫做 Memory。比如
create table tmp1(id int, str1 varchar(100) ) engine = memory;
由參數max_heap_table_size 來控制,超過報錯。
2. 非臨時表的引擎,這里又分為兩類:
用戶自定義的臨時表,比如:
- create temporary table (id int, str1 varchar(100) );
SQL執行過程中產生的內部臨時表,比如:UNION , 聚合類ORDER BY,派生表,大對象欄位的查詢,子查詢或者半連接的固化等等場景。
- mysql> show status like '%tmp_%tables%';``+-------------------------+-------+``| Variable_name | Value |``+-------------------------+-------+``| Created_tmp_disk_tables | 0 |``| Created_tmp_tables | 0 |``+-------------------------+-------+``2 rows in set (0.00 sec)
VARCHAR的變長存儲。那就是如果臨時表的欄位定義是 VARCHAR(200),那麼映射到內存里處理的欄位變為CHAR(200)。假設 VARCHAR(200) 就存里一個字元 "Y", 那豈不是很大的浪費。
大對象的默認磁碟存儲,比如 TEXT,BLOB, JSON等,不管裡面存放了啥,直接轉化為磁碟存儲。
- mysql> SELECT * FROM performance_schema. memory_summary_global_by_event_name WHERE event_name like '%temptable%'G*************************** 1. row *************************** EVENT_NAME: **memory/temptable/physical_disk** COUNT_ALLOC: 0 虛配 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 0 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 0 HIGH_COUNT_USED: 0 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 0 HIGH_NUMBER_OF_BYTES_USED: 0*************************** 2. row *************************** EVENT_NAME: **memory/temptable/physical_ram** COUNT_ALLOC: 1 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 1048576 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 1 HIGH_COUNT_USED: 1 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 1048576 HIGH_NUMBER_OF_BYTES_USED: 10485762 rows in set (0.03 sec)
默認內部臨時表引擎。
支持變長字元類型的實際存儲。
設置變數 temp_table_max_ram 來控制實際存儲內存區域大小。
那麼這兩種臨時表的計數器通常用show global status like '%tmp_%tables%' 來查看。比如
以上結果分別代表,只創建磁碟上的臨時表計數以及臨時表的總計數。這兩個計數器由參數 tmp_table_size 和 max_heap_table_size 兩個取最小值來控制。
那在 MySQL 5.7 之前,這個 SQL 運行中產生的臨時表是 MYISAM,而且只能是 MYISAM。那 MySQL 從 5.7 開始提供了參數 Internal_tmp_mem_storage_engine 來定義內部的臨時表引擎,可選值為 MYISAM 和 INNODB 。當然這里我們選擇 INNODB 。並且把內部的臨時表默認保存在臨時表空間 ibtmp1 (可以用參數 innodb_temp_data_file_path 設置大小以及步長等)下。當然這里我們得控制下 ibtmp1 的大小,要不然一個爛SQL就把磁碟整爆了。
但是MySQL 5.7 之前都沒有解決消升如下問題:
MySQL 8.0 開始,專門實現了一個臨時表的引擎 TempTable , 解決了 VARCHAR欄位的邊長存儲以及大對象的內存存儲。由變數 interal_tmp_mem_storage_engine來控制,可選差橋指值為 TempTable(默認)和 Memory;新引擎的大小由參數temp_table_max_ram 來控制,默認為1G。超過了則存儲在磁碟上(ibtmp1)。並且計數器由性能字典的表 memory_summary_global_by_event_name 來存儲。
以上 memory/temptable/physical_disk 代表放入磁碟上的臨時表計數情況。
memory/temptable/physical_ram 代表放入內存的臨時表計數情況。
那總結下MySQL 8.0 引入的 TempTable 引擎:
C. SQL如何把查詢出來的多個表創建成一個臨時表
SELECT * INTO #TEMPTABLENAME
FROM
(
SELECT xxxxxx //你的查詢語句
)AS table_source //這個別名是必須的
WHERE xxxxxxxx //你需要的where判斷;
COMMIT或ROLLBACK後可自動刪除該臨時表
1、sql server使用select into會自動生成臨時表,不需要事先創建。
select * into #temp from sysobjects
2、sql要把多個表合並成一個要用到union或union all的關鍵字。
3、union或union all的區別是:union會自動壓縮多個結果集合中的重復結果,而union all則將所有的結果全部顯示出來。
(3)sql定義臨時表擴展閱讀
sql語言特點如下:
1、一體化:SQL集數據定義DDL、數據操縱DML和數據控制DCL於一體,可以完成資料庫中的全部工作。
2、使用方式靈活:它具有兩種使用方式,即可以直接以命令方式交互使用;也可以嵌入使用,嵌入到C、C++、FORTRAN、COBOL、JAVA等主語言中使用。
3、語言簡潔,語法簡單,好學好用:在ANSI標准中,只包含了94個英文單詞,核心功能只用6個動詞,語法接近英語口語。
D. sql資料庫的存儲過程什麼時候需要定義臨時表臨時表的作用是什麼
存儲過程中定義臨時表只是用來存儲中間數據,用來完成存儲過程的語句塊,過程內定義的臨時表其作用范圍緊限於過程內部;過程外建立的臨時表也可以在存儲過程中使用,只是一般不建議這么用
E. 在SQL Server中如何用SQL語句建立一張臨時表
create table #臨時表名(剩下的和建立普通表是一樣的)
select 欄位s.. into #臨時表名 from ...
F. 如何在PL/SQL創建臨時表
方法戚衫塵一:例高禪子,過程里建臨時表的,並用游標塌擾返回臨時表中數據: create or replace procere ttable(i_cursor out ysq.aboutreport.t_cursor) is strCreateTable varchar2(500); vCount int; begin select count(*) into vCount from user_all_tables where lower(TABLE_NAME) = 'mytemp'; if vCount=0 then --EXECUTE IMMEDIATE ' drop table myTemp'; strCreateTable:='CREATE GLOBAL TEMPORARY TABLE myTemp (id VARCHAR(10),name varchar2(50)) ON COMMIT PRESERVE ROWS '; Execute immediate strCreateTable;--建表 end if; insert into mytemp values('1','sandy'); insert into mytemp values('2','may'); open i_cursor for select * from mytemp; commit; end ttable;方法二:create procere pro as str varchar2(100); begin str:='GLOBAL TEMPORARY TABLE myTemp ON COMMIT PRESERVE ROWS as select * from yourtable where 1=2'; Execute immediate str;--要有此許可權,grant create any table to 當前用戶 end;
G. SQL資料庫中臨時表,臨時變數和with as關鍵詞創建「臨時表」的區別
SQL資料庫中數據處理時,有時候需要建立臨時表,將查詢後的結果集放到臨時表中,然後在針對這個數據進行操作。
創建「臨時表」(邏輯上的臨時表,可能不一定是資料庫的)的方法有一下幾種:
1.with tempTableName as方法(05之後出現):
with temptable as 其實並沒有建立臨時表,只是子查詢部分(subquery factoring),定義一個SQL片斷,該SQL片斷會被整個SQL語句所用到。有的時候,是為了讓SQL語句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供數據的部分。特別對於UNION ALL比較有用。因為UNION ALL的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用WITH AS短語,則只要執行一遍即可。
http://www.cnblogs.com/zhaowei303/articles/4204805.html
H. 如何用PL/SQL創建一個臨時表
方法一:例子,過程里建臨時表的,並用游標返回臨時表中數據: create or replace procere ttable(i_cursor out ysq.aboutreport.t_cursor) is strCreateTable varchar2(500); vCount int; begin select count(*) into vCount from user_all_tables where lower(TABLE_NAME) = 'mytemp'; if vCount=0 then --EXECUTE IMMEDIATE ' drop table myTemp'; strCreateTable:='CREATE GLOBAL TEMPORARY TABLE myTemp (id VARCHAR(10),name varchar2(50)) ON COMMIT PRESERVE ROWS '; Execute immediate strCreateTable;--建表 end if; insert into mytemp values('1','sandy'); insert into mytemp values('2','may'); open i_cursor for select * from mytemp; commit; end ttable;方法二:create procere pro as str varchar2(100); begin str:='GLOBAL TEMPORARY TABLE myTemp ON COMMIT PRESERVE ROWS as select * from yourtable where 1=2'; Execute immediate str;--要有此許可權,grant create any table to 當前用戶 end;
I. 關於資料庫SQL語句中使用臨時表
如果數據不多的話還是用表變數試試。過多使用臨時表會產生大量的I/O操作,數據量很小的情況下反而效率不高,還要維護索引/策略等等信息表,這些多餘的操作表變數都不需要。
J. sqlserver怎麼建臨時表
表名前使用一個#號,臨時表是局部的,使用兩個#號,臨時表是全局的,在斷開連接後sql會自動刪除臨時表
create table #a
(
id int,
name varchar(50)
)
insert into #a(id,name) values(1,'123')
select * from #a
drop table #a
臨時表除了名枝緩稱前多了#號外,其他操作與普猛鏈模通表完全一樣。
tb_Student是已建立好的表,我們通過臨時表temp把tb_Student表中的內容復制到tb_lizi表中,可以使用如下的代碼實現:
use mcf
SELECT * INTO #temp FROM tb_Student
SELECT * INTO tb_lizi FROM #temp
執行後斷開sql連接並重新連接(也可以退出sq再l重新啟動sql),發現tb_lizi表中的內容tb_Student表中的內容完全一致,實現了復制喚手,同時我們沒有用代碼刪除temp表,但mcf資料庫中卻沒有temp表了,這是因為斷開連接時sql自動刪除了temp表