SELECT *
允许我选择给定表的所有字段。当我不知道所有字段或字段的名称时,或者当我不想修复有问题的查询时(为了允许在表更改方面具有灵活性),我使用它。
SELECT SUM(col)
允许我计算表中特定列的和,该列的字段名我知道。
我能把两者结合起来吗?
例如,如果SELECT * FROM TestTable
返回如下:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 1 | 2 | 3 |
| 2 | 3 | 4 |
| 3 | 4 | 5 |
+------+------+------+
然后我希望得到以下输出:
+-----------+-----------+-----------+
| SUM(col1) | SUM(col2) | SUM(col3) |
+-----------+-----------+-----------+
| 6 | 9 | 12 |
+-----------+-----------+-----------+
在查询中不使用字段名col1
, col2
或col3
(当然,标题行可以是其他任何东西)。比如SELECT SUM(*)
——但这会引发语法错误。
也许我可以在某种程度上使用信息模式?或者有更简单的方法吗?
是的,您可以为此使用信息模式。也就是说,即使某件事是可能的,也不意味着它就是一个好主意。
delimiter $$
CREATE PROCEDURE colsum( tbl char(32))
BEGIN
DECLARE cur1_eof INT DEFAULT FALSE;
DECLARE cname CHAR(128);
DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema=database() AND table_name=tbl AND data_type="int";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cur1_eof = TRUE;
SELECT '' INTO @qs;
OPEN cur1;
cols: LOOP
FETCH cur1 INTO cname;
IF cur1_eof THEN
LEAVE cols;
END IF;
SELECT CONCAT(@qs,IF(length(@qs)>0,',',''),'SUM(',cname,') AS ',cname) INTO @qs;
END LOOP;
CLOSE cur1;
SELECT CONCAT('SELECT ',@qs,' FROM ',tbl,';') INTO @qs;
PREPARE s1 FROM @qs;
EXECUTE s1;
DEALLOCATE PREPARE s1;
END
$$
delimiter ;
然后可以使用call colsum('your_table');
来获得期望的列和。上面的例子只列出类型为INT
的列。修改它来处理其他列类型非常简单。