轉自https://blog.csdn.net/weixin_44145478/article/details/107079176
mysql文檔中對於dual表的解釋:
You are allowed to specify DUAL as a dummy table name in situations
where no tables are referenced: 你可以在沒有表的情況下指定一個虛擬的表名 mysql> SELECT 1 +
1 FROM DUAL;
-> 2 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.
DUAL是為了方便那些要求所有SELECT語句都應該具有FROM和其他子句的人。MySQL可能會忽略該條款。如果沒有引用表,MySQL不需要從DUAL。
1 select 7*9 from dual; 計算器 2 SELECT SYSDATE() from dual 獲取系統時間
案例
開發過程中,需要對數據進行excel展示或導出,並且需要各種類型的數據,這里提供一種通過dual表來實現
創建表teacher,插入數據
1 CREATE TABLE `teacher` ( 2 `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `name` varchar(10) DEFAULT NULL, 4 `age` int(11) DEFAULT NULL, 5 `score` int(10) DEFAULT NULL, 6 PRIMARY KEY (`id`), 7 KEY `index_three_key` (`name`,`age`,`score`) 8 ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COMMENT='老師';
1 INSERT INTO teacher(id,name,age,score) VALUES(1,'Alen',32,98),(2,'Aony',43,1), 2 (3,'Dansy',53,78),(4,'Fulanke',25,65),(5,'Tom',32,54)
1 SELECT 2 '員工匯總' AS id, 3 '' AS NAME, 4 '' AS age, 5 '' AS score 6 FROM 7 DUAL UNION ALL 8 SELECT 9 * 10 FROM 11 teacher UNION ALL 12 SELECT 13 '平均值' AS id, 14 '' AS NAME, 15 '' AS age, 16 cast( 17 AVG( score ) AS DECIMAL ( 10, 3 )) AS score 18 FROM 19 teacher UNION ALL 20 SELECT 21 '' AS id, 22 '' AS NAME, 23 '' AS age, 24 '' AS score 25 FROM 26 DUAL UNION ALL 27 SELECT 28 '績效' AS id, 29 '' AS NAME, 30 '' AS age, 31 '' AS score 32 FROM 33 DUAL UNION ALL 34 SELECT 35 'A(評分)' AS id, 36 'B(評分)' AS NAME, 37 'C(評分)' AS age, 38 'D(評分)' AS score 39 FROM 40 DUAL UNION ALL 41 SELECT 42 ( SELECT COUNT( score ) FROM teacher WHERE score >= 90 ) AS id, 43 ( SELECT COUNT( score ) FROM teacher WHERE score >= 80 AND score < 90 ) AS NAME, 44 ( SELECT COUNT( score ) FROM teacher WHERE score >= 60 AND score < 80 ) AS age, 45 ( SELECT COUNT( score ) FROM teacher WHERE score < 60 ) AS score 46 FROM 47 DUAL