The DUAL table is a special one-row, one-column table present by default in Oracle and other database installations. In Oracle, the table has a single VARCHAR2(1) column called DUMMY that has a value of 'X'. It is suitable for use in selecting a pseudo column such as SYSDATE or USER.
SELECT 1+1 FROM DUAL; SELECT 1 FROM DUAL; SELECT USER FROM DUAL; SELECT SYSDATE FROM DUAL;
I created the DUAL table as an underlying object in the Oracle Data Dictionary. It was never meant to be seen itself, but instead used inside a view that was expected to be queried. The idea was that you could do a JOIN to the DUAL table and create two rows in the result for every one row in your table. Then, by using GROUP BY, the resulting join could be summarized to show the amount of storage for the DATA extent and for the INDEX extent(s). The name, DUAL, seemed apt for the process of creating a pair of rows from just one.
The original DUAL table had two rows in it (hence its name), but subsequently it only had one row.
DUAL is originally a table and the database engine would perform disk IO on the table when selecting from DUAL. This disk IO was usually logical IO (not involving physical disk access) as the disk blocks were usually already cached in memory. This resulted in a large amount of logical IO against the DUAL table.
Beginning with 10g Release 1 Oracle Database have been optimized and the database no longer performs physical or logical IO on the DUAL table even though the DUAL table still actually exists.
DUAL is readily available for all the users in database. It is not limited to system administrator only.
In other database systems
- Firebird has a one-row system table RDB$DATABASE that is used in the same way as Oracle's DUAL, although it also has a meaning of its own.
- IBM DB2 has a view that resolves DUAL when using Oracle Compatibility 
- Microsoft Access: A table named DUAL may be created and the single-row constraint enforced via ADO (Table-less UNION query in MS Access)
- MySQL allows DUAL to be specified as a table in queries that do not need data from any tables. It is suitable for use in selecting a result function such as SYSDATE() or USER(), although it is not essential.
- PostgreSQL: A DUAL-view can be added to ease porting from Oracle.
- SQLite: A VIEW named "dual" that works the same as the Oracle "dual" table can be created as follows: "CREATE VIEW dual AS SELECT 'x' AS dummy;"
- SAP HANA has a table called DUMMY that works the same as the Oracle "dual" table.
- "More About Oracle's History". Oracle Magazine. January–February 2002. Retrieved 4 September 2013.
- Oracle Database SQL Language Reference 11g Release 2 (11.2), Selecting from the DUAL Table
- DB2 10.1 InfoCenter :: DB2 Version 10.1 for Linux, UNIX, and Windows - DUAL table
- MySQL :: MySQL 5.0 Reference Manual :: 13.2.8 SELECT Syntax
- PostgreSQL :: PostgreSQL Wiki :: Oracle to Postgres Conversion