--
-- SELECT_HAVING
--
-- load test data
CREATE TABLE test_having (a int , b int , c char (8 ), d char );
INSERT INTO test_having VALUES (0 , 1 , 'XXXX' , 'A' );
INSERT INTO test_having VALUES (1 , 2 , 'AAAA' , 'b' );
INSERT INTO test_having VALUES (2 , 2 , 'AAAA' , 'c' );
INSERT INTO test_having VALUES (3 , 3 , 'BBBB' , 'D' );
INSERT INTO test_having VALUES (4 , 3 , 'BBBB' , 'e' );
INSERT INTO test_having VALUES (5 , 3 , 'bbbb' , 'F' );
INSERT INTO test_having VALUES (6 , 4 , 'cccc' , 'g' );
INSERT INTO test_having VALUES (7 , 4 , 'cccc' , 'h' );
INSERT INTO test_having VALUES (8 , 4 , 'CCCC' , 'I' );
INSERT INTO test_having VALUES (9 , 4 , 'CCCC' , 'j' );
SELECT b, c FROM test_having
GROUP BY b, c HAVING count(*) = 1 ORDER BY b, c;
-- HAVING is effectively equivalent to WHERE in this case
SELECT b, c FROM test_having
GROUP BY b, c HAVING b = 3 ORDER BY b, c;
SELECT lower(c), count(c) FROM test_having
GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY lower(c);
SELECT c, max(a) FROM test_having
GROUP BY c HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY c;
-- test degenerate cases involving HAVING without GROUP BY
-- Per SQL spec, these should generate 0 or 1 row, even without aggregates
SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a);
SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a);
-- errors: ungrouped column references
SELECT a FROM test_having HAVING min(a) < max(a);
SELECT 1 AS one FROM test_having HAVING a > 1 ;
-- the really degenerate case: need not scan table at all
SELECT 1 AS one FROM test_having HAVING 1 > 2 ;
SELECT 1 AS one FROM test_having HAVING 1 < 2 ;
-- and just to prove that we aren't scanning the table:
SELECT 1 AS one FROM test_having WHERE 1 /a = 1 HAVING 1 < 2 ;
DROP TABLE test_having;
Messung V0.5 in Prozent C=92 H=95 G=93
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-10-11)
¤
*© Formatika GbR, Deutschland