如何在不从 MYSQL 中的 table 中选择的情况下生成多行结果
How to generate a multirow resultest without selecting from a table in MYSQL
您可以使用 MariaDB/MySQL 查询轻松生成单行结果集,如下所示:
MariaDB [(none)]> SELECT 'Some value' AS some_col_name;
+---------------+
| some_col_name |
+---------------+
| Some value |
+---------------+
1 row in set (0.000 sec)
但是,我想做类似的事情,但是生成多行数据。
我想到了这个:
SELECT 'row1-value1' AS col_name_1 , 'row1-value2' AS col_name_2, 'row1-value3' AS col_name_3 UNION ALL SELECT 'row2-value1' AS col_name_1, 'row2-value2' AS col_name_2, 'row2-value3' AS col_name_3;
+-------------+-------------+-------------+
| col_name_1 | col_name_2 | col_name_3 |
+-------------+-------------+-------------+
| row1-value1 | row1-value2 | row1-value3 |
| row2-value1 | row2-value2 | row2-value3 |
+-------------+-------------+-------------+
2 rows in set (0.000 sec)
有效,但查询不是很好。在 MySQL 或 MariaDB 中有更好的方法吗?
VALUES
语句是 MySQL 8.0 中的新语句:
VALUES ROW('row1-value1', 'row1-value2', 'row1-value3'),
ROW('row2-value1', 'row2-value2', 'row2-value3');
输出:
+-------------+-------------+-------------+
| column_0 | column_1 | column_2 |
+-------------+-------------+-------------+
| row1-value1 | row1-value2 | row1-value3 |
| row2-value1 | row2-value2 | row2-value3 |
+-------------+-------------+-------------+
见https://dev.mysql.com/doc/refman/8.0/en/values.html
VALUES 语句中似乎没有任何语法来设置列名。这些列以 0.
开头隐式命名 column_N
您可以使用变通方法命名列:在另一个查询的 UNION 之后使用 VALUES,因为 UNION 中的第一个查询确定列名。下面是一个使用 MySQL 8.0 的另一个新功能的示例,将 WHERE 条件应用于 SELECT 语句而没有任何 table 引用。 SELECT 因此 returns 零行,其唯一目的是命名列。
mysql> SELECT null as a, null as b, null as c WHERE FALSE
UNION VALUES ROW('row1-value1', 'row1-value2', 'row1-value3'),
ROW('row2-value1', 'row2-value2', 'row2-value3');
+-------------+-------------+-------------+
| a | b | c |
+-------------+-------------+-------------+
| row1-value1 | row1-value2 | row1-value3 |
| row2-value1 | row2-value2 | row2-value3 |
+-------------+-------------+-------------+
您可以使用 CTE
命名所需的列,并使用 VALUES
语句和 ROW()
行构造函数子句生成列值:
WITH cte(col_name_1, col_name_2, col_name_3) AS (VALUES
ROW('row1-value1', 'row1-value2', 'row1-value3'),
ROW('row2-value1', 'row2-value2', 'row2-value3')
)
SELECT * FROM cte;
结果:
col_name_1
col_name_2
col_name_3
row1-value1
row1-value2
row1-value3
row2-value1
row2-value2
row2-value3
参见demo。
您可以使用 MariaDB/MySQL 查询轻松生成单行结果集,如下所示:
MariaDB [(none)]> SELECT 'Some value' AS some_col_name;
+---------------+
| some_col_name |
+---------------+
| Some value |
+---------------+
1 row in set (0.000 sec)
但是,我想做类似的事情,但是生成多行数据。
我想到了这个:
SELECT 'row1-value1' AS col_name_1 , 'row1-value2' AS col_name_2, 'row1-value3' AS col_name_3 UNION ALL SELECT 'row2-value1' AS col_name_1, 'row2-value2' AS col_name_2, 'row2-value3' AS col_name_3;
+-------------+-------------+-------------+
| col_name_1 | col_name_2 | col_name_3 |
+-------------+-------------+-------------+
| row1-value1 | row1-value2 | row1-value3 |
| row2-value1 | row2-value2 | row2-value3 |
+-------------+-------------+-------------+
2 rows in set (0.000 sec)
有效,但查询不是很好。在 MySQL 或 MariaDB 中有更好的方法吗?
VALUES
语句是 MySQL 8.0 中的新语句:
VALUES ROW('row1-value1', 'row1-value2', 'row1-value3'),
ROW('row2-value1', 'row2-value2', 'row2-value3');
输出:
+-------------+-------------+-------------+
| column_0 | column_1 | column_2 |
+-------------+-------------+-------------+
| row1-value1 | row1-value2 | row1-value3 |
| row2-value1 | row2-value2 | row2-value3 |
+-------------+-------------+-------------+
见https://dev.mysql.com/doc/refman/8.0/en/values.html
VALUES 语句中似乎没有任何语法来设置列名。这些列以 0.
开头隐式命名column_N
您可以使用变通方法命名列:在另一个查询的 UNION 之后使用 VALUES,因为 UNION 中的第一个查询确定列名。下面是一个使用 MySQL 8.0 的另一个新功能的示例,将 WHERE 条件应用于 SELECT 语句而没有任何 table 引用。 SELECT 因此 returns 零行,其唯一目的是命名列。
mysql> SELECT null as a, null as b, null as c WHERE FALSE
UNION VALUES ROW('row1-value1', 'row1-value2', 'row1-value3'),
ROW('row2-value1', 'row2-value2', 'row2-value3');
+-------------+-------------+-------------+
| a | b | c |
+-------------+-------------+-------------+
| row1-value1 | row1-value2 | row1-value3 |
| row2-value1 | row2-value2 | row2-value3 |
+-------------+-------------+-------------+
您可以使用 CTE
命名所需的列,并使用 VALUES
语句和 ROW()
行构造函数子句生成列值:
WITH cte(col_name_1, col_name_2, col_name_3) AS (VALUES
ROW('row1-value1', 'row1-value2', 'row1-value3'),
ROW('row2-value1', 'row2-value2', 'row2-value3')
)
SELECT * FROM cte;
结果:
col_name_1 | col_name_2 | col_name_3 |
---|---|---|
row1-value1 | row1-value2 | row1-value3 |
row2-value1 | row2-value2 | row2-value3 |
参见demo。