createtable test( id int, city nvarchar(20), locx float, locy float, pop int, state char(10) )
使用如下命令将数据读入表中
OPENJSON
OPENROWSET
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
declare@json NVARCHAR(MAX)
select@json= BulkColumn from OPENROWSET (BULK 'D:/MyTemp/zips.json', SINGLE_CLOB) as j
insert test select* from OPENJSON(@json) with ( id int'strict $._id', city nvarchar(30) '$.city', locx float'$.loc[0]', locy float'$.loc[1]', pop int'$.pop', state char(10) '$.state' )
导入数据库之后便可以使用之前简单的查询方式执行了
简单查询
查询 1
简单查看数据库有多少行
1 2
selectcount(*) from test -- 29353
查询 2
查询前 6 条记录
SQL Server 不支持 limit,使用 top 查询
1
select top 6*from test
查询 3
统计不同状态(state)的条目
1 2 3 4
select state, count(*) num from test groupby state orderby num desc
结果如下
一共有 51 种状态
其中最多的是 TX(1671条),最少的是 DC(24)条
(条目太多了,这里只显示首尾几条)
1 2 3 4 5 6 7 8 9 10 11 12 13
state num ---------- ----------- TX 1671 NY 1595 CA 1516 PA 1458 ... ... HI 80 RI 69 DE 53 DC 24
(51 行受影响)
查询 4
找到 pop 值最大的 6 个城市
1 2 3
select top 6* from test orderby pop desc
pop 值最大的是 CHICAGO,值为 112047
读成 json 格式
新建数据表
1 2 3
createtable test2 ( info nvarchar(max) )
将每一条按照 json 的格式读入
1 2 3 4 5 6 7 8
declare@json nvarchar(max)
select@json= BulkColumn from OPENROWSET (BULK 'D:/MyTemp/zips.json', SINGLE_CLOB) as j
insert test2 selectvalueas info from OPENJSON(@json)
重复上面的查询
查询 1
简单查看数据库有多少行
1 2
selectcount(*) from test2 -- 29353
查询 2
查询前 6 条记录
1
select top 6*from test2
查询 3
统计不同状态(state)的条目
1 2 3 4
selectJSON_VALUE(info, '$.state') state, count(*) num from test2 groupbyJSON_VALUE(info, '$.state') orderby num desc
结果是一样的,不过由于格式的原因,显示出来看起来很奇怪
1 2 3 4 5 6 7 8 9 10 11 12 13
state num ---------- ----------- TX 1671 NY 1595 CA 1516 PA 1458 ... ... HI 80 RI 69 DE 53 DC 24
(51 行受影响)
以上的查询方法很慢
优化查询如下(输出是一样的)
1 2 3 4 5 6 7
select state, count(*) num from ( selectJSON_VALUE(info, '$.state') state from test2 ) M groupby state orderby num desc
查询 4
找到 pop 值最大的 6 个城市
1 2 3
select top 6* from test2 orderbyJSON_VALUE(info, '$.pop') desc
格式化输出如下
注意这里需要使用 cast 把 pop 转化为
int,否在会被当作字符串,排序失效
1 2 3 4 5 6
select top 6 city, pop from ( selectJSON_VALUE(info, '$.city') city, cast(JSON_VALUE(info, '$.pop') asint) pop from test2 ) M orderby pop desc