select
Access data in a table. The select statement always returns a table.
Syntax
(1) Select column(s) from a table
select column1, column2, ... from t
select * from t //select all columns
where, column1, column2, ... are the column names of table t.
(2) Create a new column
select expression [as colName] from t
where expression can be an expression on a column of table t, or a constant. When colName is not specified:
-
If expression is an expression, combine the expression and the applied column name as the new column name.
-
If expression is a constant, use the constant value as the new column name. Note: When you select only one constant, it returns a table with one column and one row.
(3) Generate a column with NULL values only
select NULL [as colName] from t
The generated column is of VOID type. It is used as a placeholder. It does not
support any calculations or operations (including adding, inserting, or modifying).
If you append a table containing a NULL column to another table (using
append!
, insert
into or
tableInsert
), the NULL column will automatically be converted
to the type of the column being appended to.
Note: When you select
only one NULL value, it returns a table with
one column and one row.
The above three usages can be used together, such as select *, expression as
newCol1, NULL as newCol2 from t
.
If the result returned by a SQL select query is:
-
a table with one column, it is treated as a vector and can be used with the
in
keyword. -
a table with one column and one row, it is treated as a scalar and can be used with operators such as
gt
,ge
,lt
,le
,eq
, orne
.
(4) Select column(s) with column series.
select col1...colN [as name1 ... nameN] from t
where as
is an optional keyword for specifying alias.
The selected columns follow the naming rule: "prefix + numbers" (satisfying regular
expression [a-zA-Z\_]{1,}[0-9]+
).
-
The prefix consists of letters (both upper and lower case) and underscores (_) and must be identical for all columns.
-
The numbering 1…N must be a continuous series of integers that satisfies
abs(1-N)
<= 32768. Or use formatted numbers, such as: 0001, 0002, ..., 0010, 0011, ..., 0100, 0101, ...
Examples
Create a table t1 with columns timestamp, qty, price and sym.
sym = `C`MS`MS`MS`IBM`IBM`C`C`C$SYMBOL
price= 49.6 29.46 29.52 30.02 174.97 175.23 50.76 50.32 51.29
qty = 2200 1900 2100 3200 6800 5400 1300 2500 8800
timestamp = [09:34:07,09:36:42,09:36:51,09:36:59,09:32:47,09:35:26,09:34:16,09:34:26,09:38:12]
t1 = table(timestamp, sym, qty, price);
t1;
timestamp | sym | qty | price |
---|---|---|---|
09:34:07 | C | 2200 | 49.6 |
09:36:42 | MS | 1900 | 29.46 |
09:36:51 | MS | 2100 | 29.52 |
09:36:59 | MS | 3200 | 30.02 |
09:32:47 | IBM | 6800 | 174.97 |
09:35:26 | IBM | 5400 | 175.23 |
09:34:16 | C | 1300 | 50.76 |
09:34:26 | C | 2500 | 50.32 |
09:38:12 | C | 8800 | 51.29 |
select * from t1;
timestamp | sym | qty | price |
---|---|---|---|
09:34:07 | C | 2200 | 49.6 |
09:36:42 | MS | 1900 | 29.46 |
09:36:51 | MS | 2100 | 29.52 |
09:36:59 | MS | 3200 | 30.02 |
09:32:47 | IBM | 6800 | 174.97 |
09:35:26 | IBM | 5400 | 175.23 |
09:34:16 | C | 1300 | 50.76 |
09:34:26 | C | 2500 | 50.32 |
09:38:12 | C | 8800 | 51.29 |
The "selected" objects in the select statement don't have to be table columns. They could be variables or functions. The system will check if the "selected" object exists in the table as a column. If the answer is yes, it is treated as a table column; otherwise it is treated as a variable column or a function.
recordNum=1..9;
select 1..9 as recordNum, sym from t1;
recordNum | sym |
---|---|
1 | C |
2 | MS |
3 | MS |
4 | MS |
5 | IBM |
6 | IBM |
7 | C |
8 | C |
9 | C |
select 3 as portfolio, sym from t1;
portfolio | sym |
---|---|
3 | C |
3 | MS |
3 | MS |
3 | MS |
3 | IBM |
3 | IBM |
3 | C |
3 | C |
3 | C |
In the example above, we use a scalar to represent a column with same values.
Use a function in select statement:
def f(a):a+100;
select f(qty) as newQty, sym from t1;
newQty | sym |
---|---|
2300 | C |
2000 | MS |
2200 | MS |
3300 | MS |
6900 | IBM |
5500 | IBM |
1400 | C |
2600 | C |
8900 | C |
select last price from t1 group by sym;
sym | last_price |
---|---|
C | 51.29 |
MS | 30.02 |
IBM | 175.23 |
Generate a column with constants:
t = table(1..5 as id, `a`a`a`b`b as val);
select *, 1 as cst from t
id | val | cst |
---|---|---|
1 | a | 1 |
2 | a | 1 |
3 | a | 1 |
4 | b | 1 |
5 | b | 1 |
select *, 1 from t
id | val | 1 |
---|---|---|
1 | a | 1 |
2 | a | 1 |
3 | a | 1 |
4 | b | 1 |
5 | b | 1 |
Combine query results with keyword in
:
t = table(`APPL`IBM`AMZN`IBM`APPL`AMZN as sym, 10.1 11.2 11.3 12 10.6 10.8 as val)
t;
sym | val |
---|---|
APPL | 10.1 |
IBM | 11.2 |
AMZN | 11.3 |
IBM | 12 |
APPL | 10.6 |
AMZN | 10.8 |
stk = table(1 2 3 as id, `AAPL`IBM`FB as stock);
select count(*) from t where sym in select stock from stk;
// output
2
The following example generates a table containing a NULL column
t1 = table(rand(10,3) as x)
tmp=select *, NULL from t1
typestr(tmp[`NULL])
// output
VOID VECTOR
Then append the table tmp to t2
t2 = table(1..6 as x1, 1..6 as y1)
t2.append!(tmp)
t2
// output
x1 y1
1 1
2 2
3 3
3
4
6
Examples for column series.
as
keyword.t= table(`a1`a2 as sym, 2.5 1.5 as price1, 3.0 2.0 as price2, 3.5 2.5 as price3, 4.0 3.0 as price4, 4.5 3.5 as price5,
110 200 as qty1, 120 210 as qty2, 130 230 as qty3, 140 240 as qty4, 150 260 as qty5)
select price1...price5 as p1...p5 from t
p1 | p2 | p3 | p4 | p5 |
---|---|---|---|---|
2.5 | 3 | 3.5 | 4 | 4.5 |
1.5 | 2 | 2.5 | 3 | 3.5 |
(2) Column series are particularly useful in scenarios where multiple similar columns
need to be computed or processed together. One example use case is concatenating
multiple columns into a single array vector with function
fixedLengthArrayVector
.
select fixedLengthArrayVector(price1...price5) as priceArray, fixedLengthArrayVector(qty1...qty5) as qtyArray from t
Output:
priceArray | qtyArray |
---|---|
[2.5000,3.0000,3.5000,4.0000,4.5000] | [110,120,130,140,150] |
[1.5000,2.0000,2.5000,3.0000,3.5000] | [200,210,230,240,260] |
(3) Calculations between column series are performed with the same rules as between
vectors. In the following example, price1*qty1
, ... ,
price5*qty5
will be calculated:
select (price1...price5) * (qty1...qty5) as amount1...amount5 from t
Output:
amount1 | amount2 | amount3 | amount4 | amount5 |
---|---|---|---|---|
275 | 360 | 455 | 560 | 675 |
300 | 420 | 575 | 720 | 910 |