第5章 多表操作_第1頁
第5章 多表操作_第2頁
第5章 多表操作_第3頁
第5章 多表操作_第4頁
第5章 多表操作_第5頁
已閱讀5頁,還剩56頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

學習目標/Target掌握多表查詢,能夠使用交叉連接、內連接、外連接及復合條件連接進行多表查詢掌握子查詢,能夠使用子查詢結合IN、EXISTS、ANY、ALL及比較運算符進行查詢掌握外鍵約束的使用,能夠為表添加外鍵約束和刪除外鍵約束掌握關聯表的三種關聯關系,能夠向關聯表中添加和刪除數據章節概述/Summary之前章節對數據的操作都是基于一張數據表完成的,即單表操作,然而實際應用中業務邏輯較為復雜,表與表之間可能存在業務聯系,有時候需要基于兩張或者兩張以上的數據表進行操作,即多表操作。本章將針對多表操作的相關知識進行講解。目錄/Contents01020304多表查詢子查詢外鍵約束上機實踐:圖書管理系統的多表操作多表查詢5.1在關系型數據庫中,一張數據表通常存儲一個實體的信息。當兩張或多張數據表中存在相同意義的字段時,如果需要同時顯示多張數據表中的數據,便可以通過這些意義相同的字段將不同的數據表進行連接,并對連接后的數據表進行查詢,這樣的查詢通常稱為連接查詢。在MySQL中,連接查詢包括交叉連接查詢、內連接查詢、外連接查詢、復合條件連接查詢,本節將對這些連接查詢進行講解。5.1.1交叉連接查詢交叉連接(CROSSJOIN)查詢返回的結果是被連接的兩張數據表中所有數據行的笛卡爾積。交叉連接的語法格式如下所示。SELECT<字段名>FROM<數據表名1>CROSSJOIN<數據表名2>;或SELECT<字段名>FROM<數據表名1>,<數據表名2>;

5.1.1交叉連接查詢上述語法格式中,兩種語法格式的返回結果相同,其中<字段名>指的是需要查詢的字段名稱;<數據表名1>和<數據表名2>指的是需要交叉連接的數據表的名稱;CROSSJOIN用于連接兩個要查詢的數據表,通過CROSSJOIN語句可以查詢兩個表中所有的數據組合。5.1.1交叉連接查詢例如,對數據庫ems中員工表emp和部門表dept進行交叉連接查詢,具體如下。部門表dept用于存儲部門信息,由于在第2章的講解中將部門表刪除了,所以查詢之前需要先創建一個部門表,并完善部門表中的數據,具體SQL語句如下。#創建部門表CREATETABLEdept( deptno INTPRIMARYKEY, dname VARCHAR(20)UNIQUE);#插入部門數據INSERTINTOdeptVALUES(10,'總裁辦'),(20,'研究院'),(30,'銷售部'),(40,'運營部');5.1.1交叉連接查詢對員工表和部門表進行交叉連接查詢,具體SQL語句如下所示。mysql>SELECT*FROMemp,dept;+-------+--------+--------+------+---------+---------+--------+--------+--------+|empno|ename|job|mgr|sal|comm|deptno|deptno|dname|+-------+--------+--------+------+---------+---------+--------+--------+--------+|9369|張三|保潔|9902|900.00|NULL|20|30|銷售部||9369|張三|保潔|9902|900.00|NULL|20|40|運營部||9369|張三|保潔|9902|900.00|NULL|20|20|研究院||9369|張三|保潔|9902|900.00|NULL|20|10|總裁辦|…因篇幅有限,此處省略了其他的記錄+-------+--------+--------+------+---------+---------+--------+--------+--------+48rowsinset(0.00sec)5.1.1交叉連接查詢內連接(INNERJOIN)查詢又稱簡單連接查詢或自然連接查詢,是常見的連接查詢。內連接根據連接條件,可以對交叉連接查詢的部分結果進行篩選,僅篩選出兩張表中相互匹配的記錄。內連接查詢的語法格式如下所示。SELECT查詢字段FROM數據表1[INNER]JOIN數據表2ON匹配條件;5.1.2內連接查詢上述語法格式中,INNERJOIN用于連接2張數據表,其中INNER可以省略;ON用于指定查詢的匹配條件,即同時匹配2張數據表的條件。由于內連接查詢是對2張數據表進行操作,所以需要在匹配條件中指定所操作的字段來源于哪一張數據表,如果給數據表設置了別名,也可以通過別名指定數據表。5.1.2內連接查詢例如,查詢已經分配了部門(部門號不為NULL)的員工的信息,員工信息只需要顯示員工姓名和對應部門的名稱,具體SQL語句如下所示。SELECTename,dnameFROMempeJOINdeptdONe.deptno=d.deptno;5.1.2內連接查詢執行CONCAT()函數會返回函數參數連接之后的字符串。如執行CONCAT('a','_','b'),會返回字符串'a_b'。如果在一個連接查詢中,涉及到的兩張數據表是同一張數據表,這種查詢稱為自連接查詢。自連接是一種特殊的內連接,它是指相互連接的數據表在物理上為同一張數據表,但邏輯上分為兩張數據表。自連接查詢5.1.2內連接查詢例如,查詢員工王五所在部門的所有員工信息。查詢時可以使用自連接查詢實現,具體SQL語句如下所示。SELECTe1.*FROMempe1JOINempe2ONe1.deptno=e2.deptnoWHEREe2.ename='王五';5.1.2內連接查詢內連接的查詢結果是符合連接條件的記錄,然而有時在查詢時,除了要查詢出符合條件的數據外,還需要查詢出其中一張數據表中符合條件之外的其他數據,此時就需要使用外連接查詢。外連接查詢的語法格式如下。SELECT所查字段FROM數據表1LEFT|RIGHT[OUTER]JOIN數據表2ON匹配條件5.1.3外連接查詢外連接查詢分為左連接(LEFTJOIN)查詢和右連接(RIGHTJOIN)查詢,一般稱呼上述語法格式中的數據表1被稱為左表,數據表2被稱為右表。使用左連接查詢和右連接查詢的區別如下。(1)LEFTJOIN:返回左表中的所有記錄和右表中符合連接條件的記錄。(2)RIGHTJOIN:返回右表中的所有記錄和左表中符合連接條件的記錄。5.1.3外連接查詢左連接查詢左連接查詢的結果包括LEFTJOIN子句中左表的所有記錄,以及右表中滿足連接條件的記錄。如果左表的某條記錄在右表中不存在,則右表中對應字段的值顯示為NULL。右連接查詢右連接查詢的結果包括RIGHTJOIN子句中右表的所有記錄,以及左表中滿足連接條件的記錄。如果右表的某條記錄在左表中沒有匹配,則左表中對應字段的值顯示為NULL。5.1.3外連接查詢例如,查詢所有部門名稱及部門對應員工的姓名。因為需要查詢出所有部門的名稱,查詢時可以使用左連接查詢,將部門表作為查詢中的左表,具體SQL語句如下所示。SELECTd.dname,e.enameFROMdeptdLEFTJOINempeONe.deptno=d.deptno;例如,查詢所有員工姓名及對應部門的名稱,沒有分配部門的員工也需要查詢出來。因為需要查詢出所有員工的名稱,查詢時可以使用右連接查詢,將員工表作為查詢中的右表,具體SQL語句如下所示。SELECTd.dname,e.enameFROMdeptdRIGHTJOINempeONe.deptno=d.deptno;5.1.3外連接查詢復合條件連接查詢是指在連接查詢的過程中,通過添加過濾條件限制執行結果,使執行結果更加精確。5.1.4復合條件連接查詢例如,查詢所有員工信息,員工信息包含員工所在部門的名稱,并且按員工的工資降序排序。在查詢時,可以根據deptno字段,使用左連接將部門表和員工表進行關聯查詢,并使用ORDERBY根據sal字段的值對查詢結果進行排序,具體SQL語句如下所示。SELECTe.*,d.dnameFROMempeLEFTJOINdeptdONe.deptno=d.deptnoORDERBYe.salDESC;子查詢5.2子查詢是指一個查詢語句嵌套在另一個語句內部的查詢,當某個語句執行所需要的過濾條件是另外一個SELECT語句的結果時,可以使用子查詢。子查詢通常在WHERE子句中結合操作符一起使用,操作符可以是IN、EXISTS、ANY、ALL、比較運算符,本節將結合這幾種操作符的子查詢進行講解。5.2.1IN關鍵字結合子查詢例如,查詢工資大于2900的員工所屬部門。查詢時可以先通過子查詢返回工資大于2900的員工所在部門的編號,接著使用IN關鍵字根據部門編號查詢部門信息,具體SQL語句如下所示。mysql>SELECT*FROMdeptWHEREdeptnoIN(SELECTdeptnoFROMempWHEREsal>2900);例如,查詢工資小于2900的員工所在的部門信息,具體SQL語句如下所示。mysql>SELECT*FROMdeptWHEREdeptnoNOTIN(SELECTdeptnoFROMempWHEREsal>2900);5.2.1IN關鍵字結合子查詢IN關鍵字結合子查詢使用時,需要內層子查詢語句返回的結果是一個數據列,這個數據列中的值供外層語句進行比較操作。EXISTS關鍵字用于判斷子查詢的結果集是否為空,若子查詢的結果集不為空,返回TRUE,否則返回FALSE。使用EXISTS關鍵字結合子查詢進行查詢時,會先執行外層查詢語句,再根據EXISTS關鍵字后面子查詢的查詢結果,判斷是否保留外層語句查詢出的記錄,EXISTS的判斷結果為TRUE時,保留對應的記錄,否則去除記錄。5.2.2EXISTS關鍵字結合子查詢例如,查詢工資大于2900的員工所在的部門信息。首先查詢出部門的所有信息,然后通過子查詢篩選出工資大于2900的員工信息,接著使用EXISTS關鍵字符合子查詢結果的記錄返回;具體SQL語句如下所示。SELECT*FROMdeptWHEREEXISTS(SELECT*FROMempWHEREemp.deptno=dept.deptnoANDemp.sal>2900);5.2.2EXISTS關鍵字結合子查詢使用EXISTS關鍵字結合子查詢,和使用IN關鍵字結合子查詢的結果一致,但在表數據不同時,這兩種方式的性能也不同。當外表數據量比較大,內表數據量比較小的時候,適合使用IN關鍵字結合子查詢進行查詢。當外表數據量比較小,內表數據量比較大的情況,適合使用EXISTS關鍵字結合子查詢進行查詢。5.2.2EXISTS關鍵字結合子查詢ANY關鍵字表示“任意一個”的意思,必須和比較操作符一起使用,例如ANY和>結合起來使用,表示大于任意一個。ANY關鍵字結合子查詢時,表示子查詢的查詢結果集中的任一查詢結果,例如“值1>ANY(子查詢)”,比較值1是否大于子查詢返回的結果集中任意一個結果。5.2.3ANY關鍵字結合子查詢例如,查詢部門編號為10的員工信息,要求查詢到的員工信息中,工資都高于部門編號為20的部門中的最低工資。查詢時可以先使用子查詢語句查詢出部門編號為20的部門中所有員工工資,接著查詢部門編號為10的部門中所有員工信息,最后使用ANY連接兩者的工資進行比較。具體SQL語句如下所示。SELECT*FROMempWHEREdeptno=10ANDsal>ANY(SELECTsalFROMempWHEREdeptno=20);5.2.3ANY關鍵字結合子查詢ANY關鍵字表示“所有”的意思,ALL關鍵字結合子查詢時,表示子查詢的所有查詢集中是所有結果,例如“值1>ALL(子查詢)”,比較值1是否大于子查詢返回的結果集中所有結果。5.2.4ALL關鍵字結合子查詢例如,查詢部門編號為10的員工信息,要求查詢到的員工信息中,工資都高于部門編號為20的部門中的最高工資。查詢時可以使用子查詢將部門編號為20的所有員工工資查詢出來,然后將部門編號為10的所有員工工資與子查詢的結果進行比較,只要大于子查詢中的任意一個值,就是符合查詢條件的記錄,具體SQL語句如下所示。SELECT*FROMempWHEREdeptno=10ANDsal>ALL(SELECTsalFROMempWHEREdeptno=20);5.2.4ALL關鍵字結合子查詢前面講解的ANY關鍵字和ALL關鍵字的子查詢中使用了比較運算符>,除了>運算符,子查詢中還可以使用其他的比較運算符,如<、=、!=等。5.2.5比較運算符結合子查詢例如,查詢與王五職位相同的員工信息。查詢時可以先使用子查詢獲取王五的職位,接著根據子查詢的結果篩選出職位和王五相同的員工信息,具體SQL語句如下所示。SELECT*FROMempWHEREjob=(SELECTjobFROMempWHEREename='王五')ANDename!='王五';5.2.5比較運算符結合子查詢一般情況下,表連接查詢都可以用子查詢替換,但反過來卻不一定適用。子查詢相對比較靈活、方便、形式多樣,適合作為查詢的篩選條件,而表連接查詢更適合查看連接表的數據。5.2.5比較運算符結合子查詢外鍵約束5.3實際開發的項目中,一個健壯數據庫中的數據一定有很好的參照完整性。例如,員工管理系統中有員工表和部門表,如果員工表的部門編號字段使用了20的部門編號,部門表中的20編號卻被刪除了,這樣就會產生垃圾數據或者錯誤數據。為了保證數據的完整性,可以在員工表中添加外鍵約束。本節將對外鍵約束進行講解。5.3.1添加外鍵約束

外鍵是數據表中的一個特殊字段,它引用另一張數據表中的一列或多列,被引用的列應該具有主鍵約束或唯一性約束。對于兩個具有關聯關系的數據表來說,相關聯字段中主鍵所在的數據表就是主表,外鍵所在的數據表就是從表。5.3.1添加外鍵約束上述語法格式中,ADDCONSTRAINT表示添加約束;外鍵名稱是可選參數,用來指定添加的外鍵約束的名稱;FOREIGNKEY表示外鍵約束;使用REFERENCES指定創建的外鍵引用哪個表的主鍵。ALTERTABLE從表名ADDCONSTRAINT[外鍵名稱]FOREIGNKEY(外鍵字段名)REFERENCES主表名(主鍵字段名);在MySQL中為從表添加外鍵約束的語法格式如下。根據添加外鍵約束的語法格式,給員工表emp添加外鍵約束,具體SQL語句如下所示。ALTERTABLEempADDCONSTRAINTfk_deptnoFOREIGNKEY(deptno)REFERENCESdept(deptno);添加外鍵成功之后,可以使用SHOWCREATETABLE語句查看員工表emp的創建語句,查詢語句如下所示。5.3.1添加外鍵約束SHOWCREATETABLEemp;在為表添加外鍵約束時,需要注意以下情況:(1)建立外鍵的表必須使用InnoDB引擎(默認的存儲引擎),不能是臨時表,因為在MySQL中只有InnoDB引擎才允許使用外鍵。(2)定義的外鍵名稱不能加引號,如CONSTRAINT'FK_ID'或CONSTRAINT"FK_ID"都是錯誤的。(3)外鍵所在列的數據類型必須和主表中主鍵對應列的數據類型相同。5.3.1添加外鍵約束多學一招建立外鍵是為了保證數據的完整性和統一性,但如果主表中的數據被刪除或被修改,從表中對應的數據也應該被刪除或被修改,否則數據庫中會存在很多無意義的垃圾數據。MySQL可以在建立外鍵時添加ONDELETE或ONUPDATE子句來告訴數據庫,怎樣避免垃圾數據的產生。多學一招參數名稱功能描述CASCADE主表中刪除或更新記錄時,同時自動刪除或更新從表中對應的記錄SETNULL主表中刪除或更新記錄時,使用NULL值替換從表中對應的記錄(不適用于已標記為NOTNULL的字段)NOACTION拒絕主表刪除或修改外鍵關聯列RESTRICT拒絕主表刪除或修改外鍵關聯列。(在不定義ONDELETE和ONUPDATE子句時,這是默認設置,也是最安全的設置)添加外鍵約束的參數說明建立外鍵時避免垃圾數據的語法格式如下。ALTERTABLE從表名ADDCONSTRAINT[外鍵名稱]FOREIGNKEY(外鍵字段名)REFERENCES外表表名(主鍵字段名);[ONDELETE{CASCADE|SETNULL|NOACTION|RESTRICT}][ONUPDATE{CASCADE|SETNULL|NOACTION|RESTRICT}]實際開發中,需要根據實體的內容設計數據表,實體間會有各種關聯關系,因此數據表之間也存在著各種關聯關系。下面對數據表的關聯關系、關聯表添加數據、關聯表刪除數據進行講解。5.3.2操作關聯表213一對一關系的兩張數據表建立外鍵時,要分清主從關系。在數據表的主從關系中,從表需要主表的存在才有意義。一對一表之間的關系是通過外鍵建立的。在多對一的表關系中,應該將外鍵添加在“多”的一方,否則會造成數據的冗余。多對一通常情況下,為了實現多對多關聯關系需要定義一張中間表(稱為連接表),中間表會存在兩個外鍵。多對多5.3.2操作關聯表數據表的關聯關系需要注意的是,一對一關聯關系在數據庫中并不常見,因為以這種方式存儲的信息通常會放在一個表中。在實際開發中,一對一關聯關系可以應用于如下場景。(1)分割具有很多列的表。(2)由于安全原因而隔離表的一部分。(3)保存臨時數據,并且可以毫不費力地通過刪除保存臨時數據的表,而刪除這些數據。5.3.2操作關聯表

例如,在員工表emp的deptno字段上添加外鍵約束,引用部門表dept的主鍵字段deptno,如此就通過外鍵加強了員工表和部門表數據之間的關聯。5.3.2操作關聯表員工表和部門表數據之間的關聯

已經為員工表emp添加外鍵約束。此時員工表emp和部門表dept之間是多對一的關聯關系。下面演示在這兩個關聯表中添加數據,具體如下。5.3.2操作關聯表(1)往主表dept中插入數據。因為從表emp的外鍵列只能插入所引用的列(部門表的deptno字段)中存在的值,所以如果要為兩個數據表添加數據,就需要先為主表dept添加數據,插入數據的SQL語句如下。INSERTINTOdeptVALUES(50,'人力資源部');5.3.2操作關聯表(2)往從表emp中插入數據。主表中添加的數據中,主鍵deptno的值包含10、20、30、40和50,由于員工表emp的外鍵引用部門表的主鍵deptno,因此在往員工表emp中添加數據時,其deptno字段的值只能是10、20、30、40和50,不能使用其他的值,具體語句如下。INSERTINTOempVALUES(9966,'八戒','運營專員',9839,3000,2000,40);INSERTINTOempVALUES(9999,'悟空','人事專員',9982,3000,NULL,50);5.3.2操作關聯表數據插入成功后,如果要查詢人力資源部有哪些員工,可以使用連接查詢完成,也可以使用子查詢完成。例如使用內連接查詢完成查詢需求,具體SQL語句及執行結果如下所示。mysql>SELECTe.*,d.dnameFROMempe,deptd->WHEREe.deptno=d.deptnoANDd.dname='人力資源部';+-------+-------+----------+------+---------+------+--------+------------+|empno|ename|job|mgr|sal|comm|deptno|dname|+-------+-------+----------+------+---------+------+--------+------------+|9999|悟空|人事專員|9982|3000.00|NULL|50|人力資源部|+-------+-------+----------+------+---------+------+--------+------------+1rowinset(0.00sec)5.3.2操作關聯表從上述執行結果可以得出,人力資源部只有1名員工。需要注意的是,外鍵約束是為了保證數據的完整性和統一性,主表和從表中進行數據的新增、編輯、刪除時需要遵循外鍵約束的要求,但是對數據的查詢沒有約束性。5.3.2操作關聯表除了給關聯表添加數據,某些情況下也存在刪除關聯表中數據的需求。例如,因為公司組織架構調整,需要取消人力資源部,此時就需要在數據庫中將人力資源部刪除。下面演示刪除關聯表中部門表的數據,具體如下。5.3.2操作關聯表

由于員工表emp和部門表dept之間使用外鍵進行了關聯,主表dept中已經被引用的值不能直接刪除。如果要刪除人力資源部,需要先將人力資源部中的員工刪除,或者轉移到其他部門,或者不分配部門(部門編號設置為NULL)。在此選擇先刪除人力資源部中的員工,再刪除部門表中的人力資源部。5.3.2操作關聯表(1)刪除從表emp中屬于人力資源部的員工信息,具體SQL語句如下所示。

DELETEFROMempWHEREdeptno=(SELECTdeptnoFROMdeptWHEREdname='人力資源部');5.3.2操作關聯表(2)刪除主表dept中的數據。此時從表emp中已經沒有數據引用主表dept主鍵值為人力資源部的記錄,可以刪除主表dept中部門名稱為人力資源部的記錄,具體SQL語句及執行結果如下所示。DELETEFROMdeptWHEREdname='人力資源部';5.3.2操作關聯表如果刪除關聯表的數據時,沒有先刪除從表中有關聯的數據,而直接刪除主表的數據,會刪除失敗。例如,直接刪除部門表dept中名稱為運營部的記錄,具體SQL語句及執行結果如下所示。ERROR1451(23000):Cannotdeleteorupdateaparentrow:aforeignkeyconstraintfails(`ems`.`emp`,CONSTRAINT`fk_deptno`FOREIGNKEY(`deptno`)REFERENCES`dept`(`deptno`))由此運行結果可以看出,執行刪除語句報錯了。說明在兩個具有關聯關系的表中刪除數據時,需要先解除從表中外鍵對主表中主鍵值的引用,然后再刪除主表中的數據,否則會報錯。5.3.2操作關聯表

在實際開發中,根據業務邏輯的需求,需要解除兩個表之間的關聯關系時,就需要刪除外鍵約束。刪除外鍵約束的語法格式如下。5.3.3刪除外鍵約束ALTERTABLE表名DROPFOREIGNKEY外鍵名;演示外鍵約束的刪除,例如將員工表emp中的外鍵約束刪除,具體SQL語句如下。ALTERTABLEempDROPFOREIGNKEYfk_deptno;上機實踐:圖書管理系統的多表操作5.4上機實踐實踐需求2:查詢價格比《西游記》的價格高的圖書信息,圖書信息只需顯示圖書名稱和圖書價格。實踐需求1:查詢張三當前借閱的圖書信息,圖書信息只需顯示借閱人編號、借閱人名稱、圖書名稱和借閱時間。動手實踐1:根據圖書表book的borrower_id字段和用戶表user的name字段將表book和表user進行關聯,并查詢出user表中name值為張三的記錄,查詢出的記錄只返回user表的id、name字段的值,以及book表的borrower、name、bookname、b.borrow_time字段的值,具體的SQL語句如下所示。SELECTu.id,borrower,bookname,b.borrow_timeFROMbookb,useruWHEREb.borrower_id=u.idAND='張三';動手實踐2:首先查詢圖書表book中name的值為西游記的圖書價格,將該查詢作為子查詢;然后查詢價格大于子查詢結果的圖書信息,查詢出的圖書信息只返回name、price字段的值,具體的SQL語句如下所示。SELECTname,priceFROMbookWHEREprice>(SELECTpriceFROMbookWHEREname='西游記');上機實踐實踐需求3:查詢高于平均價的圖書信息。查詢價格比所有圖書的平均價格還低的圖書信息,圖書信息只需顯示圖書名稱和圖書價格。實踐需求4:根據圖書狀態查詢同類狀態的圖書。查詢圖書狀態和《三國演義》相同的圖書信息,圖書信息只需顯示圖書名稱、圖書價格和狀態。動手實踐3:首先查詢圖書表book中price字段的平均值,將該查詢作為子查詢;然后查詢價格小于于子查詢結果的圖書信息

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論