QUEL was generally more "normalized" than SQL. Whereas every major SQL command has a format that is at least somewhat different than the others, in QUEL a single syntax was used for all commands.
For instance, here is a sample of simple session that creates a table, inserts a row into it, and then retrieves and modifies the data inside it.
create student(name = c10, age = i4, sex = c1, state = c2)
append to student(name = "philip", age = 17, sex = "m", state = "FL")
range of s is student retrieve (s.all) where s.state = "FL"
print s
range of s is student replace s(age=s.age+1)
print s
Note that QUEL commands that operate over several rows always use a rowset variable defined with the range
command, which can be used inside the statements themselves.
Here is a similar set of SQL instructions:
create table student(name char(10), age int, sex char(1), state char(2))
insert student (name, age, sex, state) values ("philip", 17, "m", "FL")
select * from student where state = "FL"
update student set age=age+1
Note that every command uses a unique syntax, and that even similar commands like INSERT and UPDATE use completely different styles.
Another advantage of QUEL was a built-in system for moving records en-masse into and out of the system. Consider this command:
copy student(name=c0, comma=d1, age=c0, comma=d1, sex=c0, comma=d1, address=c0, nl=d1)
into "/student.txt"
which creates a comma-delimited file of all the records in the student table. The d1 indicates a delimiter, as opposed to a data type. Changing the into
to a from
reverses the process. Similar commands are available in many SQL systems, but almost always as external tools, as opposed to being internal to the SQL language. This makes them unavailable to stored procedures.
With these differences, however, the two languages are largely the same.