1. 程式人生 > 資料庫 >各種資料庫中的dual表

各種資料庫中的dual表

第一次接觸dual表是在專案中看到別人寫的,眼前一亮,又是發現新大陸的感覺,這樣就有這篇部落格誕生了。

自行百度一波,發現並不只有MySQL中有dual表。

一、Oracle中的dual表

ORACLE關於DUAL表不同尋常特性的解釋:
There is internalized code that makes this happen. Code checks that ensure that a table scan of SYS.DUAL only returns one row. Svrmgrl behaviour is incorrect but this is now an obsolete product. The base issue you should always remember and keep is: DUAL table should always have 1 ROW. Dual is a normal table with one dummy column of varchar2(1). This is basically used from several applications as a pseudo table for getting results from a select statement that use functions like sysdate or other prebuilt or application functions. If DUAL has no rows at all some applications (that use DUAL) may fail with NO_DATA_FOUND exception. If DUAL has more than 1 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception. So DUAL should ALWAYS have 1 and only 1 row.

其實dual表主要就是Oracle在用,因為在Oracle中要滿足select from 的結構。
  DUAL是Oracle與資料字典一起自動建立的一個表,它只有一列:DUMMY,其資料型別為:VARCHAR2(1)。DUAL中只有一行資料:‘X’。DUAL屬於SYS模式,但所有使用者都可以使用DUAL名稱訪問它。用SELECT計算常量表達式、偽列等值時常用該表,因為它只返回一行資料,而使用其它表時可能返回多個數據行。
  DUAL是一個Oracle內部表,不論我們做什麼操作(不要刪除記錄)它都只有一條記錄,上面插入了一條之後,他仍然只有1條記錄,所以很多取系統時間,計算,等只要選擇一條記錄,而且記錄內容與表內容無關的操作

,我們都喜歡使用這個表。虛表(dual)是oracle提供的最小的工作表,它僅包含一行一列。對於虛表(dual)來說,其中的列往往是不相關的或無關緊要的。

例項:
(1)檢視當前使用者,可以在 SQL Plus中執行下面語句

select user from dual;

(2)用來呼叫系統函式

select to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') from dual;--獲得當前系統時間
select sys_context('userenv','terminal') from dual;--獲得主機名
select sys_context('userenv','language') from dual;--獲得當前locale
select DBMS_RANDOM.random from dual;--獲得一個隨機數

(3)可以用做計算器

select 7*9*10-10 from dual;

(4)檢視系統時間

select sysdate from dual;

以上參考自:

二、MySQL中的dual表

MySQL文件中對於dual表的解釋:
You are allowed to specify DUAL as a dummy table name in situations where no tables are referenced:
SELECT 1+1 AS SUM FROM DUAL;
DUAL is purely for the convenience of people who require that all SELECT statements should have FROM and possibly other clauses. MySQL may ignore the clauses. MySQL does not require FROM DUAL if no tables are referenced.

由此看來MySQL中不是必須要滿足select from結構,他的存在是為了給有這個要求的人使用,相當於一個擺設。

三、Oracle和MySQL中的dual對比

我們用例項來對比看區別:

select * from dual;
//MySQL報錯: 1096 - No tables used
//Oracle返回“DUMMY”,其值為“X”, 行為和只有一行記錄的普通表是一樣的!
select  express [from dual];
//MySQL中select 1+1;和select 1+1 from dual;作用相同。
//Oracle中必須加上from dual,不然報錯:ORA-00923: FROM keyword not found where expected
select  express  from dual where 0=2;
//mysq 和 oracle的行為一致:該句就如同你認為的正常表那樣——會先計算where的條件,再行計算express;這裡的where條件會決定expres是否會返回!
select 1 + 1 from dual where 0 = 2;
//此時無論是Oracle還是MySQL都不可以省略from dual。

附MySQL中的各種儲存引擎簡介:
MyISAMMySQL 5.0 之前的預設資料庫引擎,最為常用。擁有較高的插入,查詢速度,但不支援事務

InnoDB事務型資料庫的首選引擎,支援ACID事務,支援行級鎖定, MySQL 5.5 起成為預設資料庫引擎

BDB源 自 Berkeley DB,事務型資料庫的另一種選擇,支援Commit 和Rollback 等其他事務特性

Memory所有資料置於記憶體的儲存引擎,擁有極高的插入,更新和查詢效率。但是會佔用和資料量成正比的記憶體空間。並且其內容會在 MySQL 重新啟動時丟失

Merge將一定數量的 MyISAM 表聯合而成一個整體,在超大規模資料儲存時很有用

Archive非常適合儲存大量的獨立的,作為歷史記錄的資料。因為它們不經常被讀取。Archive 擁有高效的插入速度,但其對查詢的支援相對較差

Federated將不同的 MySQL 伺服器聯合起來,邏輯上組成一個完整的資料庫。非常適合分散式應用

Cluster/NDB高冗餘的儲存引擎,用多臺資料機器聯合提供服務以提高整體效能和安全性。適合資料量大,安全和效能要求高的應用

CSV: 邏輯上由逗號分割資料的儲存引擎。它會在資料庫子目錄裡為每個資料表建立一個 .csv 檔案。這是一種普通文字檔案,每個資料行佔用一個文字行。CSV 儲存引擎不支援索引。