Skip to main content
All clauses supported by OmniQL.

WHERE

Filter records based on conditions.
:GET User WHERE condition
:UPDATE User SET field = value WHERE condition
:DELETE User WHERE condition

Examples

:GET User WHERE id = 1
:GET User WHERE age > 21 AND status = "active"
:GET User WHERE role IN ("admin", "moderator")

ORDER BY

Sort results.
:GET Entity ORDER BY column
:GET Entity ORDER BY column ASC
:GET Entity ORDER BY column DESC
:GET Entity ORDER BY column1 ASC, column2 DESC

Examples

:GET User ORDER BY name
:GET User ORDER BY created_at DESC
:GET User ORDER BY status ASC, name ASC
DatabaseOutput
PostgreSQLSELECT * FROM users ORDER BY name
MongoDBdb.users.find({}).sort({ name: 1 })

LIMIT

Restrict number of results.
:GET Entity LIMIT n

Examples

:GET User LIMIT 10
:GET User WHERE active = true ORDER BY created_at DESC LIMIT 5
DatabaseOutput
PostgreSQLSELECT * FROM users LIMIT 10
MySQLSELECT * FROM users LIMIT 10
MongoDBdb.users.find({}).limit(10)

OFFSET

Skip rows for pagination.
:GET Entity LIMIT n OFFSET m

Examples

:GET User LIMIT 10 OFFSET 0
:GET User LIMIT 10 OFFSET 10
:GET User LIMIT 10 OFFSET 20
DatabaseOutput
PostgreSQLSELECT * FROM users LIMIT 10 OFFSET 20
MongoDBdb.users.find({}).skip(20).limit(10)

Pagination Pattern

-- Page 1
:GET User ORDER BY id LIMIT 20 OFFSET 0

-- Page 2
:GET User ORDER BY id LIMIT 20 OFFSET 20

-- Page 3
:GET User ORDER BY id LIMIT 20 OFFSET 40

GROUP BY

Group rows for aggregation.
:COUNT * FROM Entity GROUP BY column
:SUM field FROM Entity GROUP BY column
:GET Entity WITH column, SUM(field) AS alias GROUP BY column

Examples

:COUNT * FROM User GROUP BY status
:SUM total FROM Order GROUP BY user_id
:GET Product WITH category, AVG(price) AS avg_price GROUP BY category
DatabaseOutput
PostgreSQLSELECT status, COUNT(*) FROM users GROUP BY status
MongoDBdb.users.aggregate([{ $group: { _id: '$status', count: { $sum: 1 } } }])

HAVING

Filter groups after aggregation.
:COUNT * FROM Entity GROUP BY column HAVING COUNT(*) > n
:SUM field FROM Entity GROUP BY column HAVING SUM(field) > n

Examples

:COUNT * FROM User GROUP BY status HAVING COUNT(*) > 10
:SUM total FROM Order GROUP BY user_id HAVING SUM(total) > 1000
DatabaseOutput
PostgreSQLSELECT status, COUNT(*) FROM users GROUP BY status HAVING COUNT(*) > 10

WHERE vs HAVING

-- WHERE: filters rows BEFORE grouping
:COUNT * FROM Order WHERE created_at > "2024-01-01" GROUP BY status

-- HAVING: filters groups AFTER aggregation
:COUNT * FROM Order GROUP BY status HAVING COUNT(*) > 5

-- Combined
:COUNT * FROM Order 
  WHERE created_at > "2024-01-01" 
  GROUP BY status 
  HAVING COUNT(*) > 5

DISTINCT

Return unique values. Add DISTINCT after the entity.
:GET Entity DISTINCT
:GET col1, col2 FROM Entity DISTINCT

Examples

:GET User DISTINCT
:GET status FROM User DISTINCT
:GET user_id, status FROM Order DISTINCT
DatabaseOutput
PostgreSQLSELECT DISTINCT * FROM users
MongoDBdb.users.distinct()

AS (Alias)

Rename columns in output.
:GET Entity WITH column AS alias
:GET Entity WITH SUM(field) AS alias

Examples

:GET User WITH id, name AS full_name
:GET Order WITH status, SUM(total) AS revenue GROUP BY status
DatabaseOutput
PostgreSQLSELECT id, name AS full_name FROM users

SET

Specify values for UPDATE.
:UPDATE Entity SET field = value WHERE condition
:UPDATE Entity SET field1 = value1, field2 = value2 WHERE condition

Examples

:UPDATE User SET name = "John" WHERE id = 1
:UPDATE User SET status = "active", updated_at = CURRENT_TIMESTAMP WHERE id = 1
:UPDATE Product SET price = price * 1.1 WHERE category = "electronics"

WITH

Specify columns for SELECT or values for CREATE.

In SELECT (columns)

:GET Entity WITH column1, column2, column3
:GET Entity WITH column, SUM(field) AS alias GROUP BY column

In CREATE (values)

:CREATE Entity WITH field = value, field = value

Examples

:GET User WITH id, name, email
:GET Order WITH status, SUM(total) AS revenue GROUP BY status
:CREATE User WITH name = "John", email = "[email protected]", age = 30
:CREATE Product WITH name = "Widget", price = 9.99, quantity = 100
COUNT(*) is not supported in WITH clause. Use standalone syntax: :COUNT * FROM Entity

ON

Specify join conditions or conflict handling.

In Joins

:INNER JOIN Entity1 Entity2 ON field1 = field2

In Upsert

:UPSERT Entity WITH fields ON conflict_column

Examples

:INNER JOIN Order User ON user_id = id
:UPSERT User WITH email = "[email protected]", name = "John" ON email
DatabaseOutput
PostgreSQLINSERT INTO users (...) ON CONFLICT (email) DO UPDATE SET ...
MySQLINSERT INTO users (...) ON DUPLICATE KEY UPDATE ...

OVER (Window Functions)

Define window for window functions.
:ROW NUMBER OVER (ORDER BY column) FROM Entity
:RANK OVER (PARTITION BY column ORDER BY column) FROM Entity

Examples

:ROW NUMBER OVER (ORDER BY created_at) FROM User
:RANK OVER (PARTITION BY department ORDER BY salary DESC) FROM User
:DENSE RANK OVER (PARTITION BY category ORDER BY price) FROM Product

PARTITION BY

Divide rows into groups for window functions. Used inside OVER.
:FUNCTION OVER (PARTITION BY column ORDER BY column) FROM Entity

Examples

:ROW NUMBER OVER (PARTITION BY department ORDER BY name) FROM User
:LAG salary OVER (PARTITION BY department ORDER BY hire_date) FROM Employee

TO / FROM

Used in DCL for permission targets.
:GRANT permission ON Entity TO user
:REVOKE permission ON Entity FROM user
:ASSIGN ROLE role TO user
:REVOKE ROLE role FROM user

Examples

:GRANT READ ON User TO analyst
:REVOKE DELETE ON Order FROM intern
:ASSIGN ROLE admin TO john

Clause Order

Clauses must appear in this order:
:GET Entity
  WITH columns
  WHERE conditions
  GROUP BY column
  HAVING condition
  ORDER BY column
  LIMIT n
  OFFSET m

Complete Example

:SUM total FROM Order
  WHERE created_at > "2024-01-01"
  GROUP BY user_id
  HAVING SUM(total) >= 500
  ORDER BY sum DESC
  LIMIT 100
  OFFSET 0

Clause Summary

ClausePurposeUsed With
WHEREFilter rowsGET, UPDATE, DELETE, COUNT, SUM, AVG
ORDER BYSort resultsGET
LIMITRestrict countGET
OFFSETSkip rowsGET
GROUP BYGroup for aggregationCOUNT, SUM, AVG, MIN, MAX
HAVINGFilter groupsAggregates with GROUP BY
DISTINCTUnique valuesGET
WITHColumns or valuesGET, CREATE
SETUpdate valuesUPDATE
ONJoin/conflict conditionJOIN, UPSERT
ASColumn aliasGET
OVERWindow definitionWindow functions
PARTITION BYWindow groupingWindow functions
TOPermission targetGRANT, ASSIGN ROLE
FROMPermission sourceREVOKE, REVOKE ROLE, COUNT, SUM, AVG

Next Steps