MySQL查询没有表列表时,在行数和列数方面有什么限制?
在MySQL中查询没有表列表时,是指在使用SELECT语句时,没有指定FROM关键字后面的表名。这在某些情况下是有意义的,例如,当我们只需要获取系统函数的结果时,或者我们需要生成一个简单的序列时。
然而,使用没有表名的SELECT语句也有一些限制。接下来,我们将详细介绍这些限制。
1. 结果集只有一行
由于没有指定表名,MySQL无法从表中获取数据,因此结果集只有一行。我们可以使用SELECT语句中的函数,如NOW()函数来获取有意义的结果。下面是一个例子:
SELECT NOW();
这将返回服务器当前时间:
NOW()
-------------
2021-11-30 19:27:22
可以看到,结果集只有一行。
2. 结果集只有一列
由于没有表名,MySQL无法获取数据,因此结果集只有一列。我们可以使用SELECT语句中的函数,如NOW()函数来获取有意义的结果。下面是一个例子:
SELECT NOW(), UUID();
这将返回服务器当前时间和一个UUID:
NOW() UUID()
------------------- --------------------------------------
2021-11-30 19:27:22 3ac299c2-1735-11ec-9e8d-000c2972da8a
可以看到,结果集只有一列,其中包含服务器当前时间和一个UUID。
3. 结果集无法使用GROUP BY子句和HAVING子句进行分组
由于结果集只有一行,因此无法使用GROUP BY子句和HAVING子句进行分组。
如果我们尝试使用GROUP BY子句,MySQL将会返回一个错误:
SELECT COUNT(*)
FROM (SELECT 1) t
GROUP BY 1;
这将会返回以下错误:
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.1' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
同样,如果我们尝试使用HAVING子句,MySQL将会返回一个错误:
SELECT COUNT(*)
FROM (SELECT 1) t
HAVING COUNT(*) > 1;
这将会返回以下错误:
ERROR 1054 (42S22): Unknown column 't.1' in 'having clause'
4. 结果集无法使用ORDER BY子句进行排序
由于结果集只有一列,因此无法使用ORDER BY子句进行排序。如果尝试使用ORDER BY子句,MySQL将会返回一个错误:
SELECT NOW(), UUID()
ORDER BY 1;
这将会返回以下错误:
ERROR 1248 (42000): Every derived table must have its own alias
我们可以通过将结果集包装在一个子查询中来解决这个问题:
SELECT *
FROM (SELECT NOW(), UUID()) t
ORDER BY 1;
这将会返回以下结果:
NOW() UUID()
------------------- --------------------------------------
2021-11-30 19:27:22 b79c9e52-1734-11ec-a943-000c2972da8a
可以看到,我们可以使用子查询来解决这个问题。
总结
在MySQL中查询没有表列表时,行数和列数受到限制。结果集只有一行和一列,无法使用GROUP BY子句和HAVING子句进行分组,无法使用ORDER BY子句进行排序。
此限制使得查询缺少表名的SELECT语句更适合于一些用途,例如生成序列或者获取系统函数的结果。如果我们需要从表中获取数据,那么我们必须使用表名来执行查询。