Say you have a table:
Addresses First-Name Last-Name Address _______________________________________ William Underwood Somewhere John Smith Somewhere-Else Jane Smith Somewhere-ElseProjection lets you answer questions such as "How many unique names are there in the database?" and "What addresses are there in the database?"
For example, if we projected the above table to {First-Name Last-Name} we would be left with
Addresses.projectTo({First-Name Last-Name}) First-Name Last-Name ______________________ William Underwood John Smith Jane SmithLikewise, if we projected down to {Address} we would have
Addresses.projectTo({Address}) Address ______________ Somewhere Somewhere-ElseNote that the duplicates are eliminated from the result: in relational theory, you can't have two tuples (rows) in a table which are identical; by removing the First-Name from the table, the rows "John, Smith, Somewhere-Else" and "Jane, Smith, Somewhere-Else" become indistinguishable, and so they are collapsed into one row.
I have not tested it, but one may be able to achieve this in SQL using something like:
select first, last, combined from (select first, last, concat(first,' ',last) as combined from names ) group by first, last, combinedIt's simpler than that actually, you'd just do
SELECT DISTINCT First-Name, Last-Name FROM AddressesNot all dialects support Distinct (at least they did not used to). Then again they don't all support nested queries either.
Note though, that I'm deliberately ignoring standard SQL syntax for exactly this reason. You know SQL, but yet you don't know relational algebra, which SQL is a broken implementation of. The alternate syntax makes sure that misconceptions brought from experience in query languages are exposed.
I am just covering the practical side of things because for good or bad, we are stuck with SQL for a while.
One of the operators in RelationalAlgebra