The SQL
SELECT
statement is used to display the contents of the specified columns in a table (known as “projection”). eXtremeSQL supports almost all standard SQL constructions. (Please see the wikipedia page for a detailed description of the select statement syntax.)Some important eXtremeSQL features and SQL extensions are described in the sections below.
Order By
The
order by
clause causes the result set to be sorted by the specified columns. For example, consider the following table and index definition initialized with 6 initial rows:create table orders(id integer not null, tm integer not null); create index idx on orders(id,tm); insert into orders values (2, 200); insert into orders values (2, 220); insert into orders values (2, 210); insert into orders values (1, 100); insert into orders values (1, 120); insert into orders values (1, 110);A simple select displays the rows in the order of insertion:
select * from orders; id tm --------------------- 2 200 2 220 2 210 1 100 1 120 1 110Now, using the
order by
clause, we can sort the result set in ascending order by columnid
andtm
as follows:select * from orders order by id, tm; id tm ------------------------------------- 1 100 1 110 1 120 2 200 2 210 2 220Or sort the result set rows in descending order as follows:
select * from orders order by id desc, tm desc; id tm ----------------------------------------------- 2 220 2 210 2 200 1 120 1 110 1 100Distinct Order
A useful eXtremeSQL extension is the possibility to add the
distinct
keyword in theorder by
clause. This allows restricting the result set to a single record from an ordered subset. For example, using thedistinct order
feature, we can extract the first row from each "ordered subset" defined by the values of columnid
as follows:select * from orders order by id distinct, tm; id tm ---------------------------------------------- 1 100 2 200Or we can extract the last row from the "ordered subset" by specifying the
descending
order as follows:select * from orders order by id desc distinct, tm desc; id tm -------------------------------------------------------- 2 220 1 120
For Update
The
for update
clause in a SQL select statement is used to indicate that the result set (cursor) is going to be used subsequently for updating data values. Note that the eXtremeSQL implementation of theclause differs slightly from the standard. Whereas the standard specifies “For Update On” where the “On” preposition requires specification of a list of columns that will be subject to updates, eXtremeSQL does not require the “On list” – all columns are modifiable. In eXtremeSQL, the
for update
for update
clause instructs the runtime to avoid issuing a transaction upgrade (fromREAD_ONLY
toREAD_WRITE
), but rather to open aREAD_WRITE
transaction from the outset.
The Ignore Column Operator for Sequences
The exclamation point (
"!"
) can be used as a shortcut for the sequence functionseq_ignore()
to indicate that a calculated column is to be ignored in the result set output. For example consider the following table with one ordered and two unordered sequence columns:create table Quotes(sym string primary key, day sequence(int asc), open sequence(int), close sequence(int)); insert into Quotes values('AAA', [20170501, 20170502, 20170503, 20170504, 20170505, 20170509, 20170510], [101, 102, 103, 104, 105, 109, 110], [111, 112, 113, 114, 115, 119, 120]); insert into Quotes values('BBB', [20170501, 20170502, 20170503, 20170504, 20170505, 20170509, 20170510], [201, 202, 203, 204, 205, 209, 210], [211, 212, 213, 214, 215, 219, 220]); insert into Quotes values('CCC', [20170501, 20170502, 20170503, 20170504, 20170505, 20170509, 20170510], [301, 302, 303, 304, 305, 309, 310], [311, 312, 313, 314, 315, 319, 320]); select !seq_search(day, 20170501, 20170503) as daterange, open@daterange as "open", close@daterange as "close" from Quotes; daterange open close ------------------------------------------------------------------------------ {?} {101, 102, 103} {111, 112, 113} {?} {201, 202, 203} {211, 212, 213} {?} {301, 302, 303} {311, 312, 313} Selected records: 3In this query we select an interval with function
seq_search()
and, as we don't need all timestamps in the interval in the query result, we mark the column as ignored with the!
operator. Ignored column may be used in other calculated columns but will not appear in the actual statement output.