This page explains the query language supported by relational.
OperatorsIt has 2 class of operators:
Operators without parameters work on two relations. The syntax for those operators is:
relation OPERATOR relation.
|*||product||A * B|
|-||difference||A - B|
|∪||union||A ∪ B|
|∩||intersection||A ∩ B|
|÷||division||A ÷ B|
|⋈||join||A ⋈ B|
|⧑||left outer join||A ⧑ B||All outer joins use a python
|⧒||right outer join||A ⧒ B|
|⧓||full outer join||A ⧓ B|
Operators with parameters work on a single relation, and the result will depend on the passed parameters. The syntax for those is:
OPERATOR parameters (relation)
|σ||selection||σ id==index or rank>3 (A)|| Expression must be written in python. The variables have the names of the fields in the relation.
If the expression contains parenthesis, it must be surrounded by another pair of parenthesis.
|π||projection||π name,age (A)|
|ρ||rename||ρ old_name➡new_name,age➡old (A)|
The language is formally defined here.
Queries in parenthesis take precedence.
Unary operators take precedence over binary operators.
Everything is executed left to right.
You can use parenthesis to change priority: a ⋈ (q ∪ d)
These are some valid queries.
# Join people and skills people ⋈ skills # Select people within a certain age range σ age > 25 and age < 50 (people) # Selection with complicated expression requires an extra set of () around the expression σ (name.upper().startswith('J') and age > 21) (people) # Cartesian product of people with itself, including only name and id ρ id➡i, name➡n (people) * π name, id (people)
For details on types: types in relational.