@@ -180,6 +180,37 @@ TutorialD (master/main): :showexpr p{color,city}
180180└──────┴─────┘
181181```
182182
183+Projection attributes can also be inverted using `all but`:
184+
185+```
186+TutorialD (master/main): :showexpr s{all but city}
187+┌────────┬───────────┬───────────────┐
188+│s#::Text│sname::Text│status::Integer│
189+├────────┼───────────┼───────────────┤
190+│"S2" │"Jones" │10 │
191+│"S3" │"Blake" │30 │
192+│"S1" │"Smith" │20 │
193+│"S5" │"Adams" │30 │
194+│"S4" │"Clark" │20 │
195+└────────┴───────────┴───────────────┘
196+```
197+
198+Projection attributes can also be derived from a relational expression using `all from`:
199+
200+```
201+TutorialD (master/main): :showexpr (s join sp){all from s}
202+┌──────────┬────────┬───────────┬───────────────┐
203+│city::Text│s#::Text│sname::Text│status::Integer│
204+├──────────┼────────┼───────────┼───────────────┤
205+│"London" │"S1" │"Smith" │20 │
206+│"London" │"S4" │"Clark" │20 │
207+│"Paris" │"S2" │"Jones" │10 │
208+│"Paris" │"S3" │"Blake" │30 │
209+└──────────┴────────┴───────────┴───────────────┘
210+```
211+
212+Above, we join `s` and `sp` but project the result back onto the attributes of `s`.
213+
183214#### Restriction
184215
185216Restriction is applied using a "where" clause, much like in SQL.
@@ -206,7 +237,7 @@ TutorialD (master/main): :showexpr s where ^lt(@status,20)
206237
207238#### Join
208239
209−Joins are binary operators and are applied with the "join" keyword. The equivalent in SQL would be a "NATURAL JOIN". To join attributes which are not identically-named, use the rename operator
240+Joins are binary operators and are applied with the "join" keyword. The equivalent in SQL would be a "NATURAL JOIN". To join attributes which are not identically-named, use the `rename` operator.
210241
211242```
212243TutorialD (master/main): :showexpr s join sp
@@ -227,6 +258,12 @@ TutorialD (master/main): :showexpr s join sp
227258└──────┴──┴───┴──┴─────┴──────┘
228259```
229260
261+As a convenience, `tutd` also supports semijoin (`matching`) and antijoin (`not matching`) syntax.
262+
263+`s matching sp` or `s semijoin sp` is equivalent to `(s join sp){all from s}` which returns all tuples in `s` which appear in the join of `s` and `sp`.
264+
265+`s not matching sp` or `s antijoin sp` is equivalent to `s minus (s matching sp)` which returns all tuples in `s` which do not appear in the join of `s` and `sp`. Thus, semjoin and antijoin are inverses of each other.
266+
230267#### Union
231268
232269The binary union operator merges tuples from both relations if-and-only-if the attributes of both relations are identical. The SQL equivalent is the "UNION" operator. Unlike SQL, however, duplicate tuples are not tolerated, so there is no "UNION ALL" equivalent in the relational algebra.