Языки запросов QUEL - QUEL query languages
Семья | Язык запроса |
---|---|
Разработано | Майкл Стоунбрейкер |
Впервые появился | 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
как используется, когда требуется сопоставление с образцом.
Смотрите также
- D (спецификация языка данных)
- D4 (язык программирования) (реализация D)
- Реляционная алгебра
- Реляционное исчисление
Рекомендации
дальнейшее чтение
- CJ Date: Критика языка баз данных SQL . Запись SIGMOD 14 (3): 8-54, 1984.