Упорядочивание результатов запроса с помощью ORDER BY
Если набор полученных в результате обработки данных необходимо упорядочить по возрастанию или по убыванию, то в запрос добавляется предложение ORDER BY (упорядочить по). В ORDER BY указывается столбец или несколько столбцов, данные по которым будут упорядочены последовательно, начиная с первого указанного столбца. Ссылка на столбец в ORDER BY может быть указана в виде номера столбца результата выборки. Например, при использовании предложения ORDER BY 2 результат выборки будет упорядочен по второму столбцу. Если необходимо, чтобы записи в столбце упорядочивались по убыванию, то после наименования столбца необходимо указать DESC.
Структура записи оператора select с применением сортировки полученных данных выглядит следующим образом:
Select < какие столбцы выборки будут выводится>
From <какие таблицы используются для выборки данных>
Where <какому условию должны соответствовать выводимые данные>
Order by <по какому полю будет произведена сортировка полученных данных>
Пример:
1. Вывести всю информацию по проводкам, сумма которых находится в интервале от 5000 руб. до 10000 руб. и отсортировать полученную информацию по дате в порядке убывания.
Select *
From tOperPart
Where QtyBs BETWEEN 5000 AND 10000
Order by OperDate DESC
2. Вывести всю информацию по проводкам, сумма которых находится в интервале от 5000 руб. до 10000 руб., отсортировать полученную информацию по дате в порядке убывания, в разрезе каждой даты отсортировать проводки по сумме.
Select *
From tOperPart
Where QtyBs BETWEEN 5000 AND 10000
Order by OperDate DESC, QtyBs
Сортировку можно так же производить в разрезе групп.
3. Вывести сумму проводок за дату, заведенную в системе, если фактический оборот по дебету за день составил более 5000 руб, отсортировав полученный результат по дате проводки.
Select OperDate, sum(QtyBs) as sum
From tOperPart
Where Confirmed = 1
and CharType = 1
Group by OperDate
Having sum(QtyBs) > 5000
Order by 1
В общем виде обработка простого SQL запроса выглядит следующим образом:
1. Взять таблицу, указанную в предложении FROM.
2. Если имеется предложение WHERE, применить заданное в нем условие отбора к каждой строке таблицы и оставить только те строки, для которых это условие выполняется, то есть имеет значение TRUE; строки, для которых условие отбора имеет значение FALSE или NULL (в случае сравнения со значением NULL), – отбросить.
3. Для каждой из оставшихся строк вычислить значение каждого элемента в списке возвращаемых столбцов и создать одну строку таблицы результатов запроса. При каждой ссылке на столбец используется значение столбца для текущей строки.
4. Если указано ключевое слово DISTINCT, удалить из таблицы результатов запроса все повторяющиеся строки.
5. Если имеется предложение GROUP BY – сгруппировать результаты запроса.
6. Если имеется предложение ORDER BY – отсортировать результаты запроса.
Создание запроса по нескольким таблицам
Результатом обработки запроса на выборку данных по нескольким таблицам будет декартово произведение указанных таблиц. Декартово произведение двух таблиц представляет собой таблицу, строками которой являются поочередные комбинации строк таблиц, указанных в запросе.
В разделе «Реляционная модель данных» описано, как устанавливается связь между таблицами реляционной СУБД, а так же введены понятия первичного и внешнего ключей. В базе данных системы 5NT(e) данный механизм реализован следующим образом: первичным ключом таблицы является первое поле. Это числовой поле с пользовательским типом данных DSIDENTIFIER (numeric(15,0)). В большинстве случаев наименование первичного ключа совпадает с наименованием таблицы. Например, в таблице плана счетов tResource первичным ключом является ResourceID.
Значение внешнего ключа в любой таблице по типу и данным совпадает со значением первичного ключа таблицы, на которую устанавливается ссылка. Например, в таблице проводок tOperPart значения внешнего ключа tResource являются значениями первичного ключа таблицы tResource – это ссылка на счет, который участвовал в проводке.
В случаях, когда выборка данных производится более чем из одной таблицы, необходимо указывать полное имя столбца в виде <имя таблицы>.<имя столбца>, например, tResource.ResourceID.
Пример:
1. Вывести название валюты, в которой открыт счет 20202840600000000000.
Select tSecurity.Name
From tResource
,tSecurity
Where tResource.Brief='20202840600000000000'
and tSecurity.SecurityID = tResource.FundID
2. Вывести наименование организации, на балансе которой открыт счет 20202840600000000000.
Select tInstitution.Name
From tResource
,tInstitution
Where tResource.Brief='20202840600000000000'
and tInstitution.InstitutionID = tResource.InstitutionID
3. Вывести дату последней проводки, в которой участвовал счет 20202840600000000000.
Select max(tOperPart.OperDate)
From tResource
,tOperPart
Where tResource.Brief='20202840600000000000'
and tOperPart.ResourceID = tResource.ResourceID
4. Вывести всю информацию о счетах клиента ЗАО "Диасофт".
Select tResource.*
From tInstitution
,tResource
Where tInstitution.Name ='ЗАО "Диасофт"'
and tResource.InstOwnerID = tInstitution.InstitutionID
5. Вывести всю информацию по сделкам компании ООО "Москва".
Select tDeal.*
From tDeal
,tInstitution
Where tInstitution.Name ='ООО "Москва"'
and tDeal.InstitutionID = tInstitution.InstitutionID
Использование псевдонимов
В ряде случаев возникает необходимость одновременной обработки данных какой-либо таблицы и одной или нескольких ее копий, создаваемых на время выполнения запроса. Временную копию таблицы можно сформировать, указав имя псевдонима за именем таблицы в предложении FROM. Имя псевдонима представляет из себя один или нескольких символов латинского алфавита. В качестве последнего символа можно использовать цифры. Так, с помощью предложения
FROM tOperPart op1, tOperPart op2, tOperPart op3
будут сформированы три копии таблицы tOperPart с именами op1, op2 и op3. Полное имя столбца копии таблицы будет вида op1.OperationID. Так же псевдонимы можно применять для удобства работы, сокращая полное имя столбцов в описании запроса.
Пример:
1. Вывести информацию о рубриках классификатора vic_1.
Select o2.*
From tObjClassifier o1
,tObjClassifier o2
Where o1.Brief = 'vic_1'
and o2.ParentID = o1.ObjClassifierID
2. Вывести информацию о ближайшем сводном родительском счете для счета 20202840600000000000.
Select r2.*
From tResource r1
,tResource r2
Where r1.Brief = '20202840600000000000'
and r2.ResourceID = r1.ParentID
3. Вывести наименование владельца, а также наименование организации, в балансе которой открыт счет 40702810713513513505
Номер счета | Владелец | В балансе |
Select tResource.Brief as ‘Номер счета’, i1.Name as ‘Владелец’, i2.Name as ‘В балансе’
From tResource, tInstitution i1, tInstitution i2
Where tResource.Brief = ‘40702810713513513505’
and tResource.InstitutionID=i2.InstitutionID
and tResource.InstOwnerID=i1.InstitutionID
4. Вывести наименование РКЦ, в котором обслуживается КБ «ЮНИТБАНК»
Select i1.Name
From tInstitution i1, tInstitution i2
Where i2.Name=’КБ «ЮНИТБАНК»’
And i2.ResBenefID=i1.InstitutionID
5. Вывести информацию по проводкам за 16.08.2006 в виде:
Дебет | Кредит |
Select r1.Brief as ‘Дебет’,
r2.Brief as ‘Кредит’
From tResource r1, tResource r2,
tOperPart op1, tOperPart op2
Where op1.OperDate=’20060816’
and op1.OperationID = op2.OperationID
and op1,ResourceID = r1.ResourceID
and op1.CharType = 1
and op2.ResourceID = r2.ResourceID
and op2.CharType = -1