Если я правильно понял вопрос (а это непросто), то потому что язык SQL - нечувствителен к регистру, т.е. следующие запросы эквивалентны:
select * from Groups;
select * from groups;
select * from GROUPS;
SELECT * FROM groups;
SeLeCt * FrOm GrOuPs;
Если вы берете название таблицы/колонки (или иного объекта БД) в кавычки, он становится (по крайней мере, согласно SQL стандарту) case-sensitive, т.е. "group"/"Groups"/"gRoUps" - будут разными идентификаторами (например, все три такие таблицы могут существовать в БД одновременно).
Если кавычек нет, идентификаторы по стандарту сравниваются после приведения к upper-case. В Postgres это немного не так: там идентификаторы без кавычек приводятся к lower-case.
Т.е. другими словами, запрос
create table Groups ...
создаст в Postgres таблицу с именем
groups
. Запрос
select * from GrOupS;
будет также искать таблицу с именем
groups
.
При использовании кавычек запрос
create table "Groups" ...
создаст таблицу с именем
Groups
. Запрос
select * from "GrOupS";
будет также искать таблицу с именем
GrOupS
.
spoilerРечь выше только про Postgresql. Другие СУБД могут вести (и ведут) себя по-другому. Так, в
mysql поведение идентификаторов зависит от ОС (точнее, от того, case sensitive/insensitive ее файловая система) и от конфигурации БД.
Обычно это не вызывает проблем, пока вы не начинаете использовать закавыченные и незакавыченные идентификаторы одновременно. Например, что скорее всего имеет место в вашем случае, таблица создается запросом
create table Groups ...
-- реальное имя таблицы - groups
Когда же вы делаете запрос
select * from "Groups"
, обращение идет к несуществующей таблице
Groups
.
В общем, разберитесь, какое название у таблицы в БД (в psql команда
\dt
, или смотрите свойства таблицы в своей среде). Если оно не lower-case, используйте кавычки с точным названием (например,
select * from "GROUPS"
), в противном случае лучше обходиться вообще без кавычек.