金沙国际 网址js7779NO.46 SQL(高档查询)

SELECT * FROM t_dup a WHERE a.ROWID (SELECT MIN(b.ROWID) FROM t_dup b
WHERE a.code=b.code);

ROLLUP会将参数字段各种依次减少并分组总计直至二个字段都还未,然后将那几个分组计算的结

MySql:

select * from TABLE_NAME limit  A,  B;

解释:

A,查询起源

B,你必要的行数

分页方案三:(利用SQL的游标存款和储蓄进度分页卡塔尔(قطر‎ 功能最差,不过最佳通用

SELECT b.code, b.NAME FROM (SELECT a.code, a.NAME, row_number()
over(PARTITION BY a.code ORDER BY a.ROWID) rn FROM t_dup a) b WHERE
b.rn 1;

等价:

Oracle:

–1:无O本田UR-VDE君越 BY排序的写法。(作用最高卡塔尔
–(经过测量检验,此格局开支最低,只嵌套一层,速度最快!即便查询的数据量再大,也差不离不受影响,速度依旧!卡塔尔(قطر‎

SELECT *

  FROM (SELECT ROWNUM AS rowno, t.*

          FROM emp
t

         WHERE hire_date BETWEEN TO_DATE (‘20060501’, ‘yyyymmdd’)

                             AND TO_DATE (‘20060731’, ‘yyyymmdd’)

           AND ROWNUM <= 20) table_alias

 WHERE table_alias.rowno >= 10;

–2:有O奥迪Q5DE奥迪Q5 BY排序的写法。(功用最高卡塔尔
–(经过测试,此方法随着查询范围的扩展,速度也会愈发慢哦!卡塔尔国

SELECT *

  FROM (SELECT tt.*, ROWNUM AS rowno

          FROM (  SELECT
t.*

                    FROM emp
t

                   WHERE hire_date BETWEEN TO_DATE (‘20060501’, ‘yyyymmdd’)

                                       AND TO_DATE (‘20060731’, ‘yyyymmdd’)

                ORDER BY create_time DESC, emp_no) tt

         WHERE ROWNUM <= 20) table_alias

 WHERE table_alias.rowno >= 10;

 

 

=================================================================================

=======================垃圾但又好似很常用的分页写法==========================

=================================================================================

–3:无OPRADODEENVISION BY排序的写法。(提议接受情势1替代卡塔尔(قطر‎
–(此措施随着查询数据量的扩大,速度会更慢哦!State of Qatar

SELECT *

  FROM (SELECT ROWNUM AS rowno, t.*

          FROM k_task
t

         WHERE flight_date BETWEEN TO_DATE (‘20060501’, ‘yyyymmdd’)

                               AND TO_DATE (‘20060731’, ‘yyyymmdd’)) table_alias

 WHERE table_alias.rowno <= 20 AND table_alias.rowno >= 10;

–TABLE_ALIAS.ROWNO  between 10 and
100;

–4:有O途睿欧DEPAJERO BY排序的写法.(提议选择方法2代替State of Qatar
–(此办法随着查询范围的扩充,速度会越加慢哦!卡塔尔国

SELECT *

  FROM (SELECT tt.*, ROWNUM AS rowno

          FROM ( 
SELECT *

                    FROM k_task
t

                   WHERE flight_date BETWEEN TO_DATE (‘20060501’, ‘yyyymmdd’)

                                         AND TO_DATE (‘20060531’, ‘yyyymmdd’)

                ORDER BY fact_up_time, flight_no) tt) table_alias

 WHERE table_alias.rowno BETWEEN 10 AND 20;

–5另类语法。(有OQX56DECRUISER BY写法)
–(语法风格与观念的SQL语法分化,不便利阅读与明白,为行业内部与统一规范,不引入应用。卡塔尔
WITH partdata AS

     (

        SELECT ROWNUM AS rowno, tt.*

          FROM ( 
SELECT *

                    FROM k_task
t

                   WHERE flight_date BETWEEN TO_DATE (‘20060501’, ‘yyyymmdd’)

                                         AND TO_DATE (‘20060531’, ‘yyyymmdd’)

                ORDER BY fact_up_time, flight_no) tt

         WHERE ROWNUM <= 20)

SELECT *

  FROM partdata

 WHERE rowno >= 10;

 

–6另类语法 。(无ORubiconDETucson BY写法)

WITH partdata AS

     (

        SELECT ROWNUM AS rowno, t.*

          FROM k_task
t

         WHERE flight_date BETWEEN TO_DATE (‘20060501’, ‘yyyymmdd’)

                               AND TO_DATE (‘20060531’, ‘yyyymmdd’)

           AND ROWNUM <= 20)

SELECT *

  FROM partdata

 WHERE rowno >= 10;

 

 

 

yangtingkun分析:

  — from

Oracle的分页查询语句基本上能够遵守本文给出的格式来张开套用。

分页查询格式:

SELECT *

  FROM (SELECT a.*, ROWNUM rn

          FROM (SELECT *

                  FROM table_name) a

         WHERE ROWNUM <= 40)

 WHERE rn >= 21

中间最内层的查询SELECT * FROM
TABLE_NAME表示不开展翻页的原始查询语句。ROWNUM <= 40和MuranoN >=
21调节分页查询的每页的约束。

上面给出的那一个分页查询语句,在大部状态具备较高的成效。分页的目标正是决定输出结果集大小,将结果不久的回到。在地点的分页查询语句中,这种伪造重视体未来WHERE ROWNUM <=
40那句上。

选用第21到40条记下存在三种艺术,一种是上边例子中突显的在询问的第二层通过ROWNUM
<=
40来决定最大值,在查询的最外层调整最小值。而另一种办法是去掉查询第二层的WHERE
ROWNUM <=
40语句,在查询的最外层调控分页的最小值和最大值。那是,查询语句如下:

SELECT *

  FROM (SELECT a.*, ROWNUM rn

          FROM (SELECT *

                  FROM table_name) a)

 WHERE rn BETWEEN 21 AND 40

 

相比这二种写法,绝大许多的图景下,第二个查询的成效比第二个高得多。

那是出于CBO优化形式下,Oracle能够将外层的查询条件推到内层查询中,以拉长内层查询的实行效能。对于第4个查询语句,第二层的查询条件WHERE
ROWNUM <=
40就足以被Oracle推入到内层查询中,那样Oracle查询的结果假若抢先了ROWNUM约束条件,就止住查询将结果重回了。

而第一个查询语句,由于查询条件BETWEEN 21 AND
40是存在于查询的第三层,而Oracle不能够将第三层的询问条件推到最内层(固然推到最内层也从未意义,因为最内层查询不清楚OdysseyN代表怎么样)。由此,对于第一个查询语句,Oracle最内层再次回到给中间层的是持有满足条件的多少,而中等层重回给最外层的也是独具数据。数据的过滤在最外层达成,鲜明那几个频率要比第3个查询低得多。

地点解析的查询不仅是针对单表的简单询问,对于最内层查询是错综相连的多表联合查询或最内层查询饱含排序的情景同样有效。

那边就不对包涵排序的询问举行认证了,下一篇作品会由此例子来详细表达。

 

下边轻易研讨一下多表联合的情事。

对于最分布的等值表连接查询,CBO平日只怕会采用三种连接方式NESTED
LOOP和HASH JOIN(ME宝马X3GE JOIN作用比HASH
JOIN作用低,常常CBO不会思量)。在此边,由于应用了分页,因而钦定了一个回去的最大记录数,NESTED
LOOP在回去记录数超越最大值时能够立时安息并将结果再次回到给中间层,而HASH
JOIN必得管理完全数结果集(ME汉兰达GE
JOIN也是)。那么在超越47%的事态下,对于分页查询选择NESTED
LOOP作为查询的连年格局具备较高的成效(分页查询的时候绝超过二分之一的状态是查询前几页的数量,越靠后边的页数访问概率越小)。

为此,若是不留意在系统中运用HINT的话,能够将分页的查询语句改写为:

SELECT *

  FROM (SELECT a.*, ROWNUM rn

          FROM (SELECT *

                  FROM table_name) a

         WHERE ROWNUM <= 40)

 WHERE rn >= 21

 

 

中黄部分:钦定记录从第几条初叶到第几条停止,抽取玛瑙红部门的值来作为查询条件的变量

— 逐行提交 DECLARE BEGIN FO福睿斯 cur IN (SELECT * FROM user_objects) LOOP
INSERT INTO t_loop VALUES cur; COMMIT; END LOOP; END;

名字同样(不包罗表小名卡塔尔国,类型,长度也完全一样。

SqlServer:

 

SQLServer数据库又分为 SQLServer二零零二和SQLServer二〇〇五。日常比较轻便的点子是经过TOP函数来贯彻。如下: SELECT TOP 10 * FROM sql WHERE ( 
code NOT IN  (SELECT TOP 20 code  FROM TestTable  ORDER BY id)) ORDER BY ID 
那条语句,从理论上讲,整条语句的实施时间应当比子句的施行时间长,但真相相反。因为,子句实行后赶回的是20条记下,而整条语句仅再次回到10条语句,所以影响数据库响适那个时候候间最大的因素是物理I/O操作。而限制物理I /O操作此处的最得力方式之一正是运用TOP关键词了。TOP关键词是SQL SERVE卡宴中经过系统优化过的五个用来领取前几条或前多少个比例数据的词。 以上语句的有三个沉重的后天不良,正是它包罗NOT IN字样,要换到用not exists来代替not in,二者的执行功效实际上是未曾分歧的。 
在以上分页算法中,影响我们询问速度的关键因素有两点:TOP和NOT IN。TOP能够加强我们的查询速度,而NOT IN会减慢大家的询问速度,所以要升高大家整个分页算法的快慢,将在干净修正NOT IN,同任何方式来代替它。 大家清楚,差相当的少任何字段,大家都得以由此max(字段卡塔尔国或min(字段卡塔尔来提取有些字段中的最大或纤维值,所以如果那些字段不另行,那么就足以行使那一个不重复的字段的max或min作为汾水陵,使其改为分页算法中分离每页的参照物。在这里边,我们能够用操作符“>”或“<”号来成功那个义务。如:  
Select top 10 * from table1 where id>200  

于是就有了之类分页方案:  
select top 页大小 *  
from table1   
where id>  
(select max (id) from   
(select top ((页码-1)*页大小) id from table1 order by id) as T  
)       
order by id  
这种办法推行微微始终不曾大的降势,后劲依旧很足。尤其对于数据量大的时候,该方法实践进程一点也不会下滑。 
应用TOP供给主键必得独一,不能够是三头主键。如果是联合主键,则查询出的结果会乱序的。 
时下SQLServer二〇〇五提供了叁个row_number()函数。ROW_NUMBERubicon(卡塔尔 便是生成一个顺序的行号,而他转移顺序的科班,正是末端紧跟的
OVEHighlander(O如虎 CTR 3DEEscort BY ReportID卡塔尔国,个中ReportID能够是一头主键。下边,大家看看怎么具体应用那个RowNo进行分页. SELECT TOP 10 *  FROM ( 
SELECT top 10 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo 
FROM TABLE  ) AS A 
WHERE RowNo> ” + pageIndex*10 pageIndex正是大家须求多少的页数.  

 

代码如下:

INSERT ALL WHEN (c1 IN (a1,a3)) THEN INTO t_ia_dest_1(flag,c)
VALUES(flag1,c2) WHEN (c1 IN (a2,a4)) THEN INTO t_ia_dest_2(flag,c)
VALUES(flag2,c2) ELSE INTO t_ia_dest_3(flag,c)
VALUES(flag1||flag2,c1||c2) SELECT c1,c2, f1 flag1, f2 flag2 FROM
t_ia_src;

将种种参数的每个组达卡进展叁次分组,然后将具备计算的结果并在二个结出集显示,所以CUBE分组次数为2的参数个多次方。

set nocount on

— here for other operation v_cnt := v_cnt + 1; INSERT INTO t_lock
(ID) VALUES (v_cnt卡塔尔(قطر‎; COMMIT; –提交并且释放lock END;

SELECT * FROM(SELECT ROWNUM rn,t.*

 代码如下:

— here for other operation v_cnt := v_cnt + 1; INSERT INTO t_lock
(ID) VALUES (v_cnt); COMMIT; END;

查看与CLALANDK同单位的职工?

exec sp_cursorfetch @P1,16,@currentpage,@pagesize

— 抽出/删除重复记录 DROP TABLE t_dup; CREATE TABLE t_dup AS
SELECT code_||ROWNUM code, dbms_random.string(z,5) NAME FROM dual
CONNECT BY ROWNUM=10; INSERT INTO t_dup SELECT code_||ROWNUM code,
dbms_random.string(z,5) NAME FROM dual CONNECT BY ROWNUM=2;

SELECT COUNT(*),DECODE(job,’MANAGER’,’VIP’,’ANALYST’,’VIP’,’OTHER’)
FROM emp GROUP BY DECODE(job,’MANAGER’,’VIP’,’ANALYST’,’VIP’,’OTHER’)

@rowcount int

SELECT * FROM t_mg;

翻开比职位是SALESMAN和CLE中华VK报酬都高的工作者?

 

SELECT * FROM t_loop;

TRUNC(DBMS_RANDOM.value(low=>1,high=>13))ASmonth_id,

地点给出的这几个分页查询语句,在大多情形具有较高的作用。分页的指标正是调节输出结果集大小,将结果不久的回到。在上边的分页查询语句中,这种思虑入眼体以往WHERE
ROWNUM <= 40那句上。

DECLARE sql_1 VARCHATucson2(200卡塔尔(قطر‎; BEGIN — hard parse — java中的同等语句是
Statement.execute(卡塔尔(قطر‎ FOPAJERO i IN 1 .. 1000 LOOP sql_1 := insert into
t_hard(id) values( || i || ); EXECUTE IMMEDIATE sql_1; END LOOP;
COMMIT;

排序函数能够将结果集依据内定的字段分组,然后组内再依照钦点的字段排序后对每组的

set nocount off

— 高并发情状下,安全的兑现逻辑 DECLARE v_cnt NUMBE卡宴; BEGIN —
对点名的行得到lock SELECT ID INTO v_cnt FROM t_lock WHERE ID=1 FOR
UPDATE; — 在有lock的情事下持续上边包车型客车操作 SELECT MAX(ID卡塔尔 INTO v_cnt
FROM t_lock;

分页查询

SqlServer:

— 消极锁定/乐观锁定 DROP TABLE t_lock PURGE; CREATE TABLE t_lock AS
SELECT 1 ID FROM dual;

翻开高于自身所在单位平均薪水的员工?

分页方案一:(利用Not In和SELECT TOP分页State of Qatar 功效次之,必要拼接SQL语句

SELECT t.card_code, t.rn q, decode(t.rn, 1, t.q1, 2, t.q2, 3, t.q3, 4,
t.q4) bal FROM (SELECT a.*, b.rn FROM t_change_cl a, (SELECT ROWNUM
rn FROM dual CONNECT BY ROWNUM = 4) b) t ORDER BY 1, 2;

在DDL中使用子查询,可以将四个子查询的结果集充当表快捷创造出来。

Select top 10 * from t_order where id not in (select id from
t_order where id>5 )
; //返回第6到15行数据

SELECT * FROM t_lock;

的表对应的该字段名正是以此别称。

MySql:

SELECT * FROM t_hard;

SELECT year_id,month_id,day_id,SUM(sales_value) FROM sales_tab
GROUP BY GROUPING
SETS((year_id,month_id,day_id),(year_id,month_id)) 

SELECT TOP 页大小 * FROM TestTable WHERE (ID > (SELECT MAX(id) FROM
(SELECT TOP 页大小*页数 id FROM 表 ORDER BY id) AS T)) ORDER BY ID

— 正确的分页算法 SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT *
FROM t_employees ORDER BY first_name) a WHERE ROWNUM = 500) WHERE rn
480 ;

查看累积的营业额?

@pagesize int –每页行数

–行列转变 列转行 DROP TABLE t_change_cl; CREATE TABLE
t_change_cl AS SELECT a.card_code, SUM(decode(a.q, 1, a.bal, 0)) q1,
SUM(decode(a.q, 2, a.bal, 0)) q2, SUM(decode(a.q, 3, a.bal, 0)) q3,
SUM(decode(a.q, 4, a.bal, 0)) q4 FROM t_change_lc a GROUP BY
a.card_code ORDER BY 1;

单行单列,多行单列,多行多列子查询

select * from t_order limit 5,10; #归来第6-15行数据    第八个参数是指要从前的地点,第三个参数是指每页呈现多少条数据;注意:第一页用0表示。
select * from  t_order limit  5;
 #返回前5行 
select * from  t_order limit  0,5; 
#返回前5行

SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ;)), 2) q
FROM (SELECT a.card_code, a.q, row_number() over(PARTITION BY
a.card_code ORDER BY a.q) rn FROM t_change_lc_comma a) t1 START WITH
t1.rn = 1 CONNECT BY t1.card_code = PRIOR t1.card_code AND t1.rn – 1 =
PRIOR t1.rn GROUP BY t1.card_code;

SELECT ename,sal FROM emp WHERE sal>(SELECT sal FROM emp WHERE
ename=’CLARK’)

数据库分页大全(oracle利用深入分析函数row_number高效分页)

DROP INDEX idx_fbi_1; CREATE INDEX idx_fbi_1 ON t_fbi(trunc(dt));

PageSize:每页可以彰显的条目款项数

exec sp_cursorclose @P1

— LOOP中的COMMIT/ROLLBACK DROP TABLE t_loop PURGE; create TABLE
t_loop AS SELECT * FROM user_objects WHERE 1=2;

翻开与岗位是SALESMAN同单位的职员和工人?

SELECT TOP 页大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP
页大小*页数 id FROM 表 ORDER BY id)) ORDER BY ID

SELECT * FROM t_change_cl;

SELECT m.ename,m.job,m.sal FROM emp m WHERE EXISTS(SELECT * FROM emp e
WHERE e.mgr = m.empno)

筛选第21到40条记下存在二种办法,一种是地点例子中显得的在查询的第二层通过ROWNUM
<=
40来支配最大值,在询问的最外层调控最小值。而另一种方法是去掉查询第二层的WHERE
ROWNUM <= 40语句,在询问的最外层调节分页的最小值和最大值。

— OLAP — 小计合计 SELECT CASE WHEN a.deptno IS NULL THEN 合计 WHEN
a.deptno IS NOT NULL AND a.empno IS NULL THEN 小计 ELSE || a.deptno END
deptno, a.empno, a.ename, SUM(a.sal卡塔尔国 total_sal FROM scott.emp a GROUP
BY GROUPING SETS((a.deptno),(a.deptno, a.empno, a.ename),());

翻开种种单位的最低薪给,前提是要大于30号部门的最低薪俸?

代码如下:

SELECT a.card_code, SUM(decode(a.q, 1, a.bal, 0)) q1, SUM(decode(a.q,
2, a.bal, 0)) q2, SUM(decode(a.q, 3, a.bal, 0)) q3, SUM(decode(a.q, 4,
a.bal, 0)) q4 FROM t_change_lc a GROUP BY a.card_code ORDER BY 1;

                             FROM(SELECT ename,job,sal

Mysql分页接受limt关键字

— 真正的批量交到 DECLARE CUCRUISERSO昂Cora cur IS SELECT * FROM user_objects;
TYPE rec IS TABLE OF user_objects%ROWTYPE; recs rec; BEGIN OPEN cur;
WHILE (TRUE卡塔尔 LOOP FETCH cur BULK COLLECT INTO recs LIMIT 100; — forall
达成批量 FORALL i IN 1 .. recs.COUNT INSERT INTO t_loop VALUES recs
(i); COMMIT; EXIT WHEN cur%NOTFOUND; END LOOP; CLOSE cur; END;

GROUP BY a,b,c UNION ALL GROUP BY a,b UNION ALL GROUP BY a UNION ALL
全表

在骨子里情况中,要具体深入分析。 

— 分页算法(why not this one卡塔尔(قطر‎ SELECT a.*, ROWNUM rn FROM (SELECT *
FROM t_employees ORDER BY first_name) a WHERE ROWNUM = 500 AND ROWNUM
480;

ORACLE是信赖提供了二个伪列:ROWNUM

讲话格局:

–行列转换 行转列 DROP TABLE t_change_lc; CREATE TABLE
t_change_lc (card_code VARCHAR2(3), q NUMBER, bal NUMBER);

对于多行单列子查询在张开过滤剖断时,必要非常IN,ANY,ALL使用。

言辞形式:

— 分页算法(why not this one卡塔尔 SELECT b.* FROM (SELECT a.*, ROWNUM rn
FROM t_employees a WHERE ROWNUM = 500 ORDER BY first_name) b WHERE
b.rn 480;

CUBE()函数

MySQL数据库达成分页比较轻松,提供了
LIMIT函数。平日只供给一贯写到sql语句前边就可以了。
LIMIT子
句能够用来界定由SELECT语句再次回到过来的数码数量,它有几个或三个参数,如果给出七个参数,
第三个参数钦赐重回的首先行在享有数据中之处,从0最早(注意不是1),第三个参数钦点最多再次来到行数。比如:
select * from table    LIMIT 10;    #返回前10行
select * from table    LIMIT 0,10; #返回前10行
select * from table  limit 5,10;   #回来第6-15行数据    第三个参数是指要早先的地点,第1个参数是指每页展现多少条数据;注意:第一页用0表示

INSERT INTO t_change_lc SELECT 001 card_code, ROWNUM q,
trunc(dbms_random.VALUE * 100) bal FROM dual CONNECT BY ROWNUM = 4
UNION SELECT 002 card_code, ROWNUM q, trunc(dbms_random.VALUE * 100)
bal FROM dual CONNECT BY ROWNUM = 4;

year_id  NUMBERNOTNULL,

select ceiling(1.0*@rowcount/@pagesize) as 总页数–,@rowcount as
总行数,@currentpage as 当前页

— 假诺存在就立异,荒诞不经就插入用一个话语实现 DROP TABLE t_mg;
CREATE TABLE t_mg(code VARCHAR2(10), NAME VARCHAR2(10));

                                        FROM emp ORDER BY sal DESC) t
WHERE ROWNUM <=10)WHERE rn >= 6

小结:绝大超级多的图景下,第一个查询的频率比第3个高得多。

— 硬解析/软解析 DROP TABLE t_hard PURGE; CREATE TABLE t_hard (ID
INT);

);

分页方案三:(利用SQL的游标存款和储蓄进程分页卡塔尔国

— 分组排序 SELECT a.deptno, a.empno, a.ename, a.sal, — 可跳跃的rank
rank(State of Qatar over(PARTITION BY a.deptno OWranglerDEKoleos BY a.sal DESCState of Qatar r1, — 密集型rank
dense_rank(卡塔尔 over(PARTITION BY a.deptno OLX570DE奥迪Q3 BY a.sal DESCState of Qatar r2, —
不分组排序 rank(卡塔尔(قطر‎ over(O奥德赛DE本田UR-V BY sal DESCState of Qatar r3 FROM scott.emp a ORAV4DEENVISION BY
a.deptno,a.sal DESC;

ROWNUM荒诞不经于别的一张表中,不过每张表都足以查询该字段,该字段在结果集中的值正是每条记下的行号。而行号的浮动是陪同查询进程进展的,只要能够从表中查询出一条记下,ROWNUM字段便是为该条记录在结果聚集发生相应的行号,从1起来依次增加。

分页方案二:(利用ID大于多少和SELECT TOP分页)

— soft parse –java中的同等语句是 PreparedStatement.execute(State of Qatar sql_1 :=
insert into t_hard(id) values(:id); FOR i IN 1 .. 1000 LOOP EXECUTE
IMMEDIATE sql_1 USING i; END LOOP; COMMIT; END;

将CLASportageK所在部门的工作者薪俸上浮10%

Order 遵照勒个字段排序

SELECT a.* FROM t_employees a WHERE a.department_id = 10 AND
a.employee_id IN (SELECT b.sales_rep_id FROM t_orders b);

SELECTTRUNC(DBMS_RANDOM.value(low=>2010,high=>2012))ASyear_id,

SELECT TOP 10 *  FROM TestTable WHERE (ID NOT IN (SELECT TOP 20 id FROM
TestTable ORDER BY id)) ORDER BY ID 

SELECT * FROM t_ia_src; SELECT * FROM t_ia_dest_1; SELECT * FROM
t_ia_dest_2; SELECT *金沙国际 网址js7779, FROM t_ia_dest_3;

ROLLUP中的每三个参数就是内需分组的字段。

第一种:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

CopyRight © 2015-2020 金沙中心城 All Rights Reserved.
网站地图xml地图