HGSQL是一个完全自主开发的分布式异构数据库引擎,它在标准SQL的基础上做了扩充,以下是几条精彩sql,与大家共享:
星造型
--------------------------------------------
select space(abs(f1)) + strn('*', 11 - abs(f1*2)) xin from serial(-5,5);
+-------------+
| XIN |
+-------------+
| * |
| *** |
| ***** |
| ******* |
| ********* |
| *********** |
| ********* |
| ******* |
| ***** |
| *** |
| * |
+-------------+
九九乘法表
--------------------------------------------
select to_int(s1.f1 * s2.f1) f1,
to_int(s1.f1 * s2.f2) f2,
to_int(s1.f1 * s2.f3) f3,
to_int(s1.f1 * s2.f4) f4,
to_int(s1.f1 * s2.f5) f5,
to_int(s1.f1 * s2.f6) f6,
to_int(s1.f1 * s2.f7) f7,
to_int(s1.f1 * s2.f8) f8,
to_int(s1.f1 * s2.f9) f9
from serial(1, 9) s1,
invert(serial(1, 9)) s2
+----+----+----+----+----+----+----+----+----+
| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 |
+----+----+----+----+----+----+----+----+----+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 |
| 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 |
| 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 |
| 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 |
| 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 |
| 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 |
| 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 |
| 9 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 |
+----+----+----+----+----+----+----+----+----+
日历
--------------------------------------------
select case('(s.f1 * 7) + 1 - b.f1 > 0 and (s.f1 * 7) + 1 - b.f1 <= e.f1', (s.f1 * 7) + 1 - b.f1, '') 日,
case('(s.f1 * 7) + 2 - b.f1 > 0 and (s.f1 * 7) + 2 - b.f1 <= e.f1', (s.f1 * 7) + 2 - b.f1, '') 一,
case('(s.f1 * 7) + 3 - b.f1 > 0 and (s.f1 * 7) + 3 - b.f1 <= e.f1', (s.f1 * 7) + 3 - b.f1, '') 二,
case('(s.f1 * 7) + 4 - b.f1 > 0 and (s.f1 * 7) + 4 - b.f1 <= e.f1', (s.f1 * 7) + 4 - b.f1, '') 三,
case('(s.f1 * 7) + 5 - b.f1 > 0 and (s.f1 * 7) + 5 - b.f1 <= e.f1', (s.f1 * 7) + 5 - b.f1, '') 四,
case('(s.f1 * 7) + 6 - b.f1 > 0 and (s.f1 * 7) + 6 - b.f1 <= e.f1', (s.f1 * 7) + 6 - b.f1, '') 五,
case('(s.f1 * 7) + 7 - b.f1 > 0 and (s.f1 * 7) + 7 - b.f1 <= e.f1', (s.f1 * 7) + 7 - b.f1, '') 六
from serial(0, 5) s,
(select day_of_week(2007 + '-' + 2 + '-' + 1) - 1 f 1) b join
(select month_days(2007, 2) f1) e on 1=1
+----+----+----+----+----+----+----+
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
+----+----+----+----+----+----+----+
| | | | | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | | | |
| | | | | | | |
+----+----+----+----+----+----+----+
姓名树
--------------------------------------------
select space((level - 1) * 4) + '|-' + 姓名 层姓名
from nest(query('员工'), 'prior.员工.编号 = 员工.上级', '上级 is null', '编号')
+--------------------+
| 层姓名 |
+--------------------+
| |-刘程飞 |
| |-孔兵 |
| |-王芳 |
| |-宋建 |
| |-刘海星 |
| |-王东 |
| |-张云 |
| |-李海卫 |
| |-张空 |
| |-刘龙维 |
| |-张凯 |
| |-李保 |
| |-关心 |
| |-赵新 |
+--------------------+
序列
--------------------------------------------
select f1 from serial(1,10,2,'h','g')
+-----+
| F1 |
+-----+
| h 1g |
| h 3g |
| h 5g |
| h 7g |
| h 9g |
+-----+
字符串转记录(分割符分割)
--------------------------------------------
select * from split('a,b,c,d',',')
+----+
| F1 |
+----+
| a |
| b |
| c |
| d |
+----+
字符串转记录(等长分割)
--------------------------------------------
select * from splitn('1234567890','3')
+-----+
| F1 |
+-----+
| 123 |
| 456 |
| 789 |
| 0 |
+-----+
取得一段字符串
--------------------------------------------
select getseg('a,b,c',',',2)
+-----------------------+
| GETSEG('a,b,c',',',2) |
+-----------------------+
| b |
+-----------------------+
修改一段字符串
--------------------------------------------
select setseg('a,b,c',',',2, 'hg')
+-----------------------------+
| SETSEG('a,b,c',',',2, 'hg') |
+-----------------------------+
| a,hg,c |
+-----------------------------+
多维合计
--------------------------------------------
SELECT 部门,职位,SUM(工资) 工资 FROM 员工 GROUP BY CUBE(部门,职位)
+------+--------+-------+
| 部门 | 职位 | 工资 |
+------+--------+-------+
| 20 | 职员 | 1900 |
| 20 | 经理 | 2975 |
| 20 | 主管 | 6000 |
| 30 | 销售 | 5600 |
| 30 | 经理 | 2850 |
| 30 | 职员 | 950 |
| 10 | 经理 | 2450 |
| 10 | 总经理 | 5000 |
| 10 | 职员 | 1300 |
| 20 | | 10875 |
| 30 | | 9400 |
| 10 | | 8750 |
| | 职员 | 4150 |
| | 销售 | 5600 |
| | 经理 | 8275 |
| | 主管 | 6000 |
| | 总经理 | 5000 |
| | | 29025 |
+------+--------+-------+
交叉统计
--------------------------------------------
select * from cross(query('员工'), '部门','职位','工资','sum', 'true','合计')
+-----------+---------+--------+--------+---------+
| 职位/部门 | 20 | 10 | 30 | STAT |
+-----------+---------+--------+--------+---------+
| 职位/部门 | 20 | 10 | 30 | 合计 |
| 主管 | 6000 | | | 6000 |
| 总经理 | | 5000 | | 5000 |
| 经理 | 2975 | 2450 | 2850 | 8275.0 |
| 职员 | 1900 | 1300 | 950 | 4150.0 |
| 销售 | | | 5600 | 5600 |
| 合计 | 10875.0 | 8750.0 | 9400.0 | 29025.0 |
+-----------+---------+--------+--------+---------+
指定记录范围查询
--------------------------------------------
select * from 员工 where rowno() between 3 and 7
+------+--------+------+------+------------+------+------+------+
| 编号 | 姓名 | 职位 | 上级 | 出生日期 | 工资 | 奖金 | 部门 |
+------+--------+------+------+------------+------+------+------+
| 0003 | 张空 | 销售 | 0006 | 1982-08-07 | 1250 | 500 | 30 |
| 0004 | 孔兵 | 经理 | 0009 | 1982-03-01 | 2975 | | 20 |
| 0005 | 刘龙维 | 销售 | 0006 | 1982-10-13 | 1250 | 1400 | 30 |
| 0006 | 张云 | 经理 | 0009 | 1977-02-14 | 2850 | | 30 |
| 0007 | 关心 | 经理 | 0009 | 1978-07-27 | 2450 | | 10 |
+------+--------+------+------+------------+------+------+------+
导出插入sql
--------------------------------------------
select insert_sql('XML.部门');
--------------------------------------------
insert into XML.部门 (编号, 名称, 备注) values ('10', '财务部', '');
insert into XML.部门 (编号, 名称, 备注) values ('40', '行政部', '');
insert into XML.部门 (编号, 名称, 备注) values ('20', '开发部', '');
insert into XML.部门 (编号, 名称, 备注) values ('30', '销售部', '');
字符串合计
--------------------------------------------
select strsum(编号,',') from 部门;
+------------------+
| STRSUM(编号,',') |
+------------------+
| 10,40,20,30 |
+------------------+
代码转名称
--------------------------------------------
select map((select 编号,名称 from 部门), '10')
+-----------------------------------------+
| MAP((SELECT 编号,名称 FROM 部门), '10') |
+-----------------------------------------+
| 财务部 |
+-----------------------------------------+