Oracle使用技巧.doc_第1页
Oracle使用技巧.doc_第2页
Oracle使用技巧.doc_第3页
Oracle使用技巧.doc_第4页
Oracle使用技巧.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

case 子句的用途语法: case when 条件1 then 值1 when条件2 then 值2。when条件n then 值nelse 值elseend case子句相当于一个具有多个选择的语句,在多个不同的条件中,选择其中之一,与java语言的case语句类似。例:如果表chinese的字段bh为null,则返回0,如果字段bh为1,则返回99,字段bh为其它值,原样返回。select case when bh is null then 0 when bh=1 then 99 else bh end bhs, xh,code from chinese 一、利用CASE 语句更新列值执行本语句将性别为男的伙食补助修改为120,女修改为100UPDATE TB_EMP2SET 伙食补助=CASE WHEN 性别=男 then 120 WHEN 性别=女 then 100END当列cj的值为74时,修改其值为80, 为97时,修改其值为100,其它值不变update tb set cj=(case cj when 74 then 80when 97 then 100else cj end);当列kc的值为语文时,修改列cj=cj+6, 为物理时,修改其值为cj+4,其它值不变update tb set cj=(case when kc=语文 then cj+6when kc=物理 then cj+4else cj end);/利用CASE 语句进行更新列值执行本语句将性别为男的伙食补助修改为120,女修改为100UPDATE TB_EMP2SET 伙食补助=CASE WHEN 性别=男 then 120 WHEN 性别=女 then 100END当列cj的值为74时,修改其值为80, 为97时,修改其值为100,其它值不变update tb set cj=(case cj when 74 then 80when 97 then 100else cj end);当列kc的值为语文时,修改列cj=cj+6, 为物理时,修改其值为cj+4,其它值不变update tb set cj=(case when kc=语文 then cj+6when kc=物理 then cj+4else cj end);case语句在SQL中的使用方法 Case具有两种格式。简单Case函数和Case搜索函数。 1.简单Case函数CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女ELSE 其他 END2.搜索case函数CASE WHEN sex = 1 THEN 男 WHEN sex = 2 THEN 女ELSE 其他 END这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。 还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。 -比如说,下面这段SQL,你永远无法得到“第二类”这个结果CASE WHEN col_1 IN ( a, b) THEN 第一类 WHEN col_1 IN (a) THEN 第二类ELSE其他 ENDCase使用集锦一,已知数据按照另外一种方式进行分组,分析。 下面的Case语句用在Group by 子句中有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key) 国家(country) 人口(population) 中国 600 美国 100 加拿大 100 英国 200 法国 300 日本 250 德国 200 墨西哥 50 印度 250 根据国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。 洲 人口 亚洲 1100 北美洲 250 其他 700 想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。 如果使用Case函数,SQL代码如下: SELECT SUM(population), CASE country WHEN 中国 THEN 亚洲 WHEN 印度 THEN 亚洲 WHEN 日本 THEN 亚洲 WHEN 美国 THEN 北美洲 WHEN 加拿大 THEN 北美洲 WHEN 墨西哥 THEN 北美洲 ELSE 其他 ENDFROM Table_AGROUP BY CASE country WHEN 中国 THEN 亚洲 WHEN 印度 THEN 亚洲 WHEN 日本 THEN 亚洲 WHEN 美国 THEN 北美洲 WHEN 加拿大 THEN 北美洲 WHEN 墨西哥 THEN 北美洲 ELSE 其他 END;同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下; SELECT CASE WHEN salary 500 AND salary 600 AND salary 800 AND salary = 1000 THEN 4 ELSE NULL END salary_class, COUNT(*)FROM Table_AGROUP BY CASE WHEN salary 500 AND salary 600 AND salary 800 AND salary 1000 THEN 1 ELSE 0 END ELSE 1 END = 1 )如果单纯使用Check,如下所示 CONSTRAINT check_salary CHECK ( sex = 2 AND salary 1000 )女职员的条件倒是符合了,男职员就无法输入了。这是一个非常经典的用法!四,根据条件有选择的UPDATE。 下面的Case语句用在update子句中,如果进行两次更新,则可能会产生错误!例,有如下更新条件 工资5000以上的职员,工资减少10% 工资在2000到4600之间的职员,工资增加15% 很容易考虑的是选择执行两次UPDATE语句,如下所示 -条件1UPDATE PersonnelSET salary = salary * 0.9WHERE salary = 5000;-条件2UPDATE PersonnelSET salary = salary * 1.15WHERE salary = 2000 AND salary = 5000 THEN salary * 0.9WHEN salary = 2000 AND salary 4600THEN salary * 1.15ELSE salary END;这里要注意一点,最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。 五变更主键列的值本质上任然是Case语句在update中的应用一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。 p_key col_1 col_2 a 1 张三 b 2 李四 c3 王五 假设有如上数据,需要把主键a和b相互交换。用Case函数来实现的话,代码如下 UPDATE SomeTableSET p_key =CASE WHEN p_key = a THEN bWHEN p_key = b THEN aELSE p_key ENDWHERE p_key IN (a, b);同样的也可以交换两个Unique key。需要注意的是,如果有需要交换主键的情况发生,多半是当初对这个表的设计进行得不够到位,建议检查表的设计是否妥当。 六,两个表数据是否一致的检查。 Case函数中,可以使用下列子句:BETWEEN AND , LIKE,IS NULL,IN, NOT INEXISTS 和NOT EXISTSCase函数不同于DECODE函数。在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS,可以进行子查询,从而 实现更多的功能。 下面具个例子来说明,有两个表,tbl_A,tbl_B,两个表中都有keyCol列。现在我们对两个表进行比较,tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到, 返回结果Matched,如果没有找到,返回结果Unmatched。 要实现下面这个功能,可以使用下面两条语句 1.使用IN的时候SELECT keyCol,CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B ) when中使用in 子句THEN MatchedELSE Unmatched END LabelFROM tbl_A;2.使用EXISTS的时候SELECT keyCol,CASE WHEN EXISTS ( SELECT * FROM tbl_BWHERE tbl_A.keyCol = tbl_B.keyCol )THEN MatchedELSE Unmatched END LabelFROM tbl_A;使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。 七,在Case函数中使用合计函数 假设有下面一个表学号(std_id) 课程ID(class_id) 课程名(class_name) 主修flag(main_class_flg) 100 1 经济学 Y 100 2 历史学 N 200 2 历史学 N 200 3 考古学 Y 200 4 计算机 N 300 4 计算机 N 400 5 化学 N 500 6 数学 N 有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入 Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。 现在我们要按照下面两个条件对这个表进行如下查询 :l 只选修一门课程的学生,返回那门课程的ID l 选修多门课程的学生,返回所选的主课程ID 简单的想法就是,执行两条不同的SQL语句进行查询。 -条件1:只选择了一门课程的学生SELECT std_id, MAX(class_id) AS main_classFROM StudentclassGROUP BY std_idHAVING COUNT(*) = 1;执行结果1 STD_ID MAIN_class- -300 4400 5500 6-条件2:选择多门课程的学生SELECT std_id, class_id AS main_classFROM StudentclassWHERE main_class_flg = Y ;执行结果2 STD_ID MAIN_class- -100 1200 3如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示 SELECT std_id,CASE WHEN COUNT(*) = 1 THEN MAX(class_id) -只选择一门课程的学生的情况ELSE MAX(CASE WHEN main_class_flg = YTHEN class_idELSE NULL END)END AS main_classFROM StudentclassGROUP BY std_id;运行结果 STD_ID MAIN_class- -100 1200 3300 4400 5500 6通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。 最后提醒一下使用Case函数的新手注意不要犯下面的错误 CASE col_1WHEN 1 THEN RightWHEN NULL THEN WrongEND在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。正确的做法是:CASE col_1WHEN 1 THEN RightWHEN IS NULL THEN WrongENDcoalesce函数语法:coalesce(param1,param2)当第一个参数param1(通常为字段)为null时,返回第二个参数param2的值,否则,返回第一个参数的值.这个函数与NVL函数功能相同。例: select coalesce(bh,0) bhs from chinese select nvl(bh,0) bhs from chinese从表中随机返回n条记录实现此功能需要使用函数dbms_random.value()作为order by子句的参数,这样查询将依赖于函数的结果进行排序。利用这个函数可以实现随机出题例1:随机产生100条歇后语记录Select * from (select xh,content,keys from xhy order by dbms_random.value()Where rownum=100;例2:利用函数dbms_random.value()产生100个随机数Oracle 10g方法select dbms_random.value() from dual connect by rownum=100Oracle 9i方法select dbms_random.value() from all_objects rownum=100根据学生成绩排名次要求:要求输出前n名学生,同一成绩名次相同。原理:利用dense_rank()这个分析函数进行名次排列主要数据如下Xmscorec72x83b83d65h96n57y90m99v100输出前5名Xmscore mcn571d652c723x834b834y905select * from( select xm,score,dense_rank()over(order by score) mc from studentscore t)where mc=5oracle使用merge更新或插入数据使用merge比传统的先判断再选择插入或更新快很多。1)主要功能提供有条件地更新和插入数据到数据库表中如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作 避免了分开更新 提高性能并易于使用 在数据仓库应用中十分有用2)MERGE语句的语法如下:MERGE hint INTO schema . table t_alias USING schema . table | view | subquery t_alias ON ( condition )WHEN MATCHED THEN merge_update_clauseWHEN NOT MATCHED THEN merge_insert_clause;还是看例子就知道怎么回事:MERGE INTO copy_emp cUSING employees eON (c.employee_id=e.employee_id)WHEN MATCHED THENUPDATE SETc.first_name=e.first_name,c.last_name=e.last_name,c.department_id=e.department_idWHEN NOT MATCHED THENINSERT VALUES(e.employee_id,e.first_name,e.last_name,e.email,e.phone_number,e.hire_date,e.job_id,e.salary,mission_pct,e.manager_id,e.departmetn_id);MERGE INTO copy_emp cUSING employees eON (c.employee_id=e.employee_id)WHEN MATCHED THENUPDATE SETc.first_name=e.first_name,c.last_name=e.last_name,c.department_id=e.department_idWHEN NOT MATCHED THENINSERT VALUES(e.employee_id,e.first_name,e.last_name,e.email,e.phone_number,e.hire_date,e.job_id,e.salary,mission_pct,e.manager_id,e.departmetn_id);3)使用merge的注意事项:创建测试表:CREATE TABLE MM (ID NUMBER, NAME VARCHAR2(20);CREATE TABLE MN (ID NUMBER, NAME VARCHAR2(20);插入数据INSERT INTO MM VALUES (1, A);INSERT INTO MN VALUES (1, B);执行:MERGE INTO MN AUSING MM BON(A.ID=B.ID)WHEN MATCHED THENUPDATE SET A.ID = B.IDWHEN NOT MATCHED THENINSERT VALUES(B.ID, B.NAME);ON(A.ID=B.ID)报错:无效的标识符,这个错误提示有些误导嫌疑,原因是on子句的使用的字段不能够用于update,即Oracle不允许更新用于连接的列修改:MERGE INTO MN AUSING MM BON(A.ID=B.ID)WHEN MATCHED THENUPDATE SET A.NAME = B.NAMEWHEN NOT MATCHED THENINSERT VALUES(B.ID, B.NAME);ON(A.ID=B.ID)再插入:INSERT INTO MM VALUES (1, C);再执行:MERGE INTO MN AUSING MM BON(A.ID=B.ID)WHEN MATCHED THENUPDATE SET A.NAME = B.NAMEWHEN NOT MATCHED THENINSERT VALUES(B.ID, B.NAME);ON(A.ID=B.ID)报错,原因无法在源表中获得一组稳定的行4)更新同一张表的数据。需要注意下细节,因为可能涉及到using的数据集为null,所以要使用count()函数。MERGE INTO mn aUSING (select count(*) co from mn where mn.ID=4) bON (b.co0)-这里使用了count和,注意下,想下为什么!WHEN MATCHED THENUPDATESET a.NAME = Ewhere a.ID=4WHEN NOT MATCHED THENINSERTVALUES (4, E);计算中位(间)值一、问题计算一列数字值的中间值(中间值就是一组有序元素中间成员的值)。假设有如下数据:create table empInfo( name varchar2(20), sal number(6)insert into empInfo values(王宏,800);insert into empInfo values(留心会,1100);insert into empInfo values(张三,1500);insert into empInfo values(李薇霞,3000);insert into empInfo values(大大村,2500);insert into empInfo values(杨伟,2750);select * from empInfo order by sal王宏800留心会1100张三1500大大村2500杨伟2750李薇霞3000中位数应为:2000=(1500+2500)/2二、解决方案除了Oracle解决方案(用函数计算中间数)之外,其他所有解决方案都是以Rozenshtein、Abramovich和Birger在Optimizing Transact-SQL: Advanced Programming Techniques (SQL Forum Press, 1997)中描述的方法为基础的。与传统的自联接相比,窗口函数的引入,使解决方案更为有效。1. 通用求中位数的方法使用自联接查找中间数:其原理是:首先进行自连接,获得笛卡尔积;其次计算各记录sal字段的差并转换为符号函数,即:sign(e.sal - d.sal)以及各个记录sal字段是否相同,用下列语句实现:case when e.sal = d.sal then 1 else 0 end;然后再进行分组,并计算组内sal字段的平均值。如果一列数为奇数个数,则这列数必定关于中间一个数的abs(sum(sign(e.sal - d.sal)成对称。如果一列数为偶数个数,则这列数必定关于中间的两个数成对称。select avg(sal) from ( -找到中间位置的sal值 select e.sal from empInfo e, empInfo d group by e.sal having sum(case when e.sal = d.sal then 1 else 0 end )= abs(sum(sign(e.sal - d.sal)-end abs)t根据第一个自联接表EMP计算中间数,而该表返回了所有工资的笛卡儿积(GROUP BY E.SAL会去掉重复值)。HAVING子句使用函数SUM计算E.SAL等于D.SAL的次数;如果这个值大于等于E.SAL且大于D.SAL次数,那么该行就是中间数。在SELECT列表中加入SUM就可以观察到这种情况:select avg(sal) from ( -找到中间位置的sal值 select e.sal,count(e.sal) ncount,sum(case when e.sal = d.sal then 1 else 0 end) sum0,abs(sum(sign(e.sal - d.sal) ) abs0 from empInfo e, empInfo d group by e.sal having sum(case when e.sal = d.sal then 1 else 0 end )= abs(sum(sign(e.sal - d.sal)-end abs)t8007161100714150071222007102500712275071430007162.DB2,Oracle 数据库使用窗口函数COUNT(*) OVER和ROW_NUMBER,查找中间数:select avg(sal) from(-通过分析函数为查询添加3列:total,half,xh select sal, count(*) over() total, floor(count(*) over()/2) half, row_number() over(order by sal) xh from empInfo)where (mod(total,2)=0 and xh in(half,half+1)偶数行,取中间两行的值 or (mod(total,2)=1 and xh=half+1) 奇数行,取中间行的值执行结果:2000=(1500+2500)/23.Oracle数据库使用函数MEDIAN(Oracle Database 10g)或PERCENTILE_CONT(Oracle9i 及以上版本):-使用于Oracle10g 及以上版本select median(sal) from empInfo -使用于Oracle9i 及以上版本 select percentile_cont(0.5) within group(order by sal) from empInfo 说明:对于Oracle8i Database,使用DB2解决方案。对于Oracle8i Database之前的版本,可以采用PostgreSQL/MySQL解决方案。4.SQL Server 数据库(sqlserver2005以上版本)使用窗口函数COUNT(*) OVER和ROW_NUMBER,可得到中间数:-创建数据表create table empInfo( name varchar(20), sal int)-向表插入数据insert into empInfo values(王宏,800);insert into empInfo values(留心会,1100);insert into empInfo values(张三,1500);insert into empInfo values(李薇霞,3000);insert into empInfo values(大大村,2500);insert into empInfo values(杨伟,2750);insert into empInfo values(华阳,2200);-查询select * from empInfo order by sal王宏800留心会1100张三1500华阳2200大大村2500杨伟2750李薇霞3000-获得中位数select avg(sal) from( select sal, count(*) over() total, floor(count(*) over()/2) half, row_number() over(order by sal) xh from empInfo) twhere (xh %2=0 and xh in(half,half+1)-偶数行,取中间两行的值 or (xh % 2=1 and xh=half+1) -数行,取中间行的值三、各种方案总结1.DB2和SQL Server 解决方案的唯一差别是语法的稍许不同:SQL Server用“%”求模,而DB2和Oracle使用MOD函数;其余的都相同。2.内联视图X返回三个不同的计数值,TOTAL和halfT,还用到由ROW_NUMBER生成的RN。这些附加列有助于求解中间数。检验内联视图X的结果集,就会看到这些列表示的意义:3.根据第一个自联接表EMP计算中间数,而该表返回了所有工资的笛卡儿积(GROUP BY E.SAL会去掉重复值)。HAVING子句使用函数SUM计算E.SAL等于D.SAL的次数;如果这个值大于等于E.SAL且大于D.SAL次数,那么该行就是中间数。在SELECT列表中加入SUM就可以观察到这种情况: -找到中间位置的sal值 select e.sal,count(e.sal) ncount,sum(case when e.sal = d.sal then 1 else 0 end) sum0,abs(sum(sign(e.sal - d.sal) ) abs0 from empInfo e, empInfo d group by e.salOracle在Oracle Database 10g或Oracle9i Database中,可以使用Oracle提供的函数计算中间数;对于Oracle8i Database,可以采用DB2解决方案;其他版本只能采用通用求中位数的解决方案。显然可以用MEDIAN函数计算中间值,用PERCENTILE_CONT函数也可以计算中间值就不那么显而易见了。传递给PERCENTILE_CONT的值0.5是一个百分比值。子句WITHIN GROUP (ORDER BY SAL)确定PERCENTILE_CONT要搜索哪些有序行(记住,中间值就是一组已排序值的中间值)。返回的值就是搜索的有序行中符合给定百分比(在这个例子中是0.5,因为其两个边界值分别为0和1)的值。总之,通用解决方案适用于各种版本各种类型的数据库,但效率较低;Oracle 提供了响应的函数,但对版本要求较高;Sqlserver和Oracle 一样,对版本有要求。计算众数的方法一、准备数据select * from tb张三语文74张三数学83张三物理93李四语文74李四数学84刘洋语文81刘洋数学82刘洋物理86二、求众数的一般方法:-首先构造CTEwith tbGroup as (select xm,count(*) total from tb group by xm)-找出具有最大值的所有记录(即众数)方案1:select * from tbGroupwhere total=(select max(total) from tbGroup 求各组内的最大值)显示结果:刘洋3张三3方案2:select * from (select xm,total,dense_rank() over(order by total desc) mc from tbGroup)twhere mc=1显示结果:刘洋31张三31即该组数中有2个众数。注意:一组数可能没有众数!此时CTE将返回空集!查询出连续的记录有一个表结构,fphm,kshm,其记录如下:2014,000000012014,000000022014,000000032014,000000042014,000000052014,000000072014,000000082014,000000092013,000001202013,000001212013,000001222013,000001242013,00000125(第二个字段内可能是连续的数据,可能存在断点。)要求查询出连续的记录来。就像下面的这样?2014,00000001,000000052014,00000009,000000072013,00000120,000001222013,00000124,00000125SELECT b.fphm, MIN (b.kshm) Start_HM, MAX (b.kshm) End_HMFROM (SELECT a.*, TO_NUMBER (a.kshm - ROWNUM) ccFROM (SELECT * FROM t ORDER BY fphm, kshm) a) bGROUP BY b.fphm, b.ccSELECT b.fphm, MIN (b.kshm) Start_HM, MAX (b.kshm) End_HMFROM (SELECT a.*, TO_NUMBER (a.kshm - ROWNUM) cc FROM (SELECT * FROM t ORDER BY fphm, kshm) a) bGROUP BY b.fphm, b.ccFPHM START_HM END_HM- - -2013 00000120 000001222013 00000124 000001252014 00000001 000000052014 00000007 00000009/查询所有物品的最后出库时间物品 出库时间 a 2005-3-4a 2005-12-3a 2006-10-8a 2007-5-1b 2006-1-1b 2006-10-2b 2007-6-24c 2006-12-2c 2007-3-8-要求结果物品 最后出库时间a 2007-5-1b 2007-6-24c 2007-3-8 select mc,max(rq) from SQLnumber group by mcselect * from SQLnumber as a where exists (select top 1 * from SQLnumber as b where b.mc=a.mc order by rq desc)select * from table as a exits (select top 1 * from table as b where b.物品=a.物品 order by 出库时间 desc)农历】计算方法- (阳历转阴历) 因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入!首先建一表,放初始化资料1.创建表CREATE TABLE SolarData( yearId int not null, data char(7) not null, dataInt int not null)2.插入数据INSERT INTO SolarData SELECT 1900,0x04bd8,19416 UNION ALL SELECT 1901,0x04ae0,19168UNION ALL SELECT 1902,0x0a570,42352 UNION ALL SELECT 1903,0x054d5,21717UNION ALL SELECT 1904,0x0d260,53856 UNION ALL SELECT 1905,0x0d950,55632UNION ALL SELECT 1906,0x16554,91476 UNION ALL SELECT 1907,0x056a0,22176UNION ALL SELECT 1908,0x09ad0,39632 UNION ALL SELECT 1909,0x055d2,21970UNION ALL SELEC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论