Языки запросов QUEL - QUEL query languages

QUEL
Семья Язык запроса
Разработано Майкл Стоунбрейкер
Впервые появился 1976 ; 45 лет назад  ( 1976 )
Основные реализации
Энгр , ПОСТКВЕЛ
Под влиянием
Альфа

QUEL - это язык запросов к реляционным базам данных , основанный на реляционном исчислении кортежей , имеющий некоторое сходство с SQL . Он был создан в рамках разработки СУБД Ingres в Калифорнийском университете в Беркли на основе ранее предложенного Коддом, но не реализованного подязыка данных ALPHA . В течение короткого времени QUEL использовался в большинстве продуктов, основанных на свободно доступном исходном коде Ingres, особенно в реализации под названием POSTQUEL, поддерживаемой POSTGRES . Когда в начале 1980-х годов Oracle и DB2 завоевали долю рынка, большинство компаний, которые тогда поддерживали QUEL, перешли на SQL. QUEL по-прежнему доступен как часть СУБД Ingres, хотя в течение многих лет не было добавлено никаких специальных языковых улучшений для QUEL.

использование

Операторы QUEL всегда определяются кортежными переменными , которые можно использовать для ограничения запросов или возврата наборов результатов. Рассмотрим этот пример, взятый из одной из первых оригинальных статей Ingres:

Пример 1.1. Вычислите зарплату, разделенную на возраст 18 для сотрудника Джонса.

range of E is EMPLOYEE
retrieve into W
(COMP = E.Salary / (E.Age - 18))
where E.Name = "Jones"

Здесь E - кортежная переменная, которая охватывает отношение EMPLOYEE, и в этом отношении обнаруживаются все кортежи, удовлетворяющие квалификации E.Name = «Jones». Результатом запроса является новое отношение W, которое имеет один домен COMP, вычисленный для каждого подходящего кортежа.

Эквивалентный оператор SQL:

create table w as
select (e.salary / (e.age - 18)) as comp
from employee as e
where e.name = 'Jones'

Вот пример простого сеанса, который создает таблицу, вставляет в нее строку, затем извлекает и изменяет данные внутри нее и, наконец, удаляет добавленную строку (при условии, что это имя является уникальным полем).

QUEL SQL
create student(name = c10, age = i4, sex = c1, state = c2)

range of s is student
append to s (name = "philip", age = 17, sex = "m", state = "FL")

retrieve (s.all) where s.state = "FL"

replace s (age=s.age+1)

retrieve (s.all)

delete s where s.name="philip"
create table student(name char(10), age int, sex char(1), state char(2));

insert into student (name, age, sex, state) values ('philip', 17, 'm', 'FL');

select * from student where state = 'FL';

update student set age=age+1;

select * from student;

delete from student where name='philip';

Еще одной особенностью QUEL была встроенная система для массового перемещения записей в систему и из нее. Рассмотрим эту команду:

copy student(name=c0, comma=d1, age=c0, comma=d1, sex=c0, comma=d1, address=c0, nl=d1)
into "/student.txt"

который создает файл с разделителями-запятыми, содержащий все записи в таблице студентов. D1 указывает на разделитель, а не на тип данных. Изменение на into a from отменяет процесс. Подобные команды доступны во многих системах SQL, но обычно как внешние инструменты, а не как внутренние по отношению к языку SQL. Это делает их недоступными для хранимых процедур.

QUEL обладает чрезвычайно мощными возможностями агрегирования. Агрегаты могут быть вложенными, и разные агрегаты могут иметь независимые дополнительные списки и / или ограничительные предложения. Например:

retrieve (a=count(y.i by y.d where y.str = "ii*" or y.str = "foo"), b=max(count(y.i by y.d)))

Этот пример иллюстрирует одну из, возможно, менее желательных причуд QUEL, а именно то, что все сравнения строк потенциально являются сопоставлением с образцом. y.str = "ii*" соответствует всем y.str значениям, начинающимся с ii . Напротив, SQL используется = только для точных совпадений, тогда like как используется, когда требуется сопоставление с образцом.

Смотрите также

Рекомендации

дальнейшее чтение