MySQL數(shù)據(jù)庫原理及應(yīng)用(慕課版)-習(xí)題答案 鄭曉霞_第1頁
MySQL數(shù)據(jù)庫原理及應(yīng)用(慕課版)-習(xí)題答案 鄭曉霞_第2頁
MySQL數(shù)據(jù)庫原理及應(yīng)用(慕課版)-習(xí)題答案 鄭曉霞_第3頁
MySQL數(shù)據(jù)庫原理及應(yīng)用(慕課版)-習(xí)題答案 鄭曉霞_第4頁
MySQL數(shù)據(jù)庫原理及應(yīng)用(慕課版)-習(xí)題答案 鄭曉霞_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第1章數(shù)據(jù)庫基礎(chǔ)選擇題C1-2.C1-3.B1-4.B1-5.D1-6.A1-7.A1-8.C1-9.B2.簡答題2-1答:人工管理階段是指計(jì)算機(jī)誕生的初期(即20世紀(jì)50年代后期之前),這個(gè)時(shí)期的計(jì)算機(jī)主要用于科學(xué)計(jì)算。從硬件看,沒有磁盤等直接存取的存儲(chǔ)設(shè)備;從軟件看,沒有操作系統(tǒng)和管理數(shù)據(jù)的軟件,數(shù)據(jù)處理方式是批處理。這個(gè)時(shí)期數(shù)據(jù)管理的特點(diǎn)是:1.數(shù)據(jù)不保存2.沒有對數(shù)據(jù)進(jìn)行管理的軟件系統(tǒng)3.沒有文件的概念4.一組數(shù)據(jù)對應(yīng)于一個(gè)程序,數(shù)據(jù)是面向應(yīng)用的文件系統(tǒng)階段是指計(jì)算機(jī)不僅用于科學(xué)計(jì)算,而且還大量用于管理數(shù)據(jù)的階段(從50年代后期到60年代中期)。在硬件方面,外存儲(chǔ)器有了磁盤、磁鼓等直接存取的存儲(chǔ)設(shè)備。在軟件方面,操作系統(tǒng)中已經(jīng)有了專門用于管理數(shù)據(jù)的軟件,稱為文件系統(tǒng)。這個(gè)時(shí)期數(shù)據(jù)管理的特點(diǎn):1.數(shù)據(jù)需要長期保存在外存上供反復(fù)使用2.程序之間有了一定的獨(dú)立性3.文件的形式已經(jīng)多樣化4.數(shù)據(jù)的存取基本上以記錄為單位數(shù)據(jù)庫系統(tǒng)階段是從60年代后期開始的。在這一階段中,數(shù)據(jù)庫中的數(shù)據(jù)不再是面向某個(gè)應(yīng)用或某個(gè)程序,而是面向整個(gè)企業(yè)(組織)或整個(gè)應(yīng)用的。這個(gè)時(shí)期數(shù)據(jù)管理的特點(diǎn)是:1.采用復(fù)雜的結(jié)構(gòu)化的數(shù)據(jù)模型2.較高的數(shù)據(jù)獨(dú)立性3.最低的冗余度4.數(shù)據(jù)控制功能2-2答:三級(jí)模式包括外模式、概念模式、內(nèi)模式,三級(jí)模式能有效地組織、管理數(shù)據(jù),提高了數(shù)據(jù)庫的邏輯獨(dú)立性和物理獨(dú)立性。二級(jí)映射指的是對象關(guān)系映射(ORM)是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將面向?qū)ο笳Z言程序中的對象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中。第2章MySQL數(shù)據(jù)類型選擇題1-1.A1-2.A1-3.D1-4.A1-5.C2.填空題2-1.浮點(diǎn)數(shù)2-2.CHAR,2552-3.NULL,NOTNULL2-4.ENUM('待支付','已支付','已取消')2-5.DECIMAL(6,2)第3章MySQL運(yùn)算符1.A2.A3.D4.A5.AC第4章數(shù)據(jù)庫操作 1.選擇題1-1.B1-2.D1-3.C1-4.A1-5.C1-6.C1-7.D 2.簡答題 2-1答: 在MySQL的安裝目錄下能找到一個(gè)名為my.ini的配置文件。該文件中的mysqld部分存在“default-storage-engine=INNODB”語句。將該語句的“INNODB”改為需要的存儲(chǔ)引擎。該配置文件只有重啟服務(wù)后才會(huì)生效。執(zhí)行SHOWVARIABLESLIKE‘storage_engine’查看默認(rèn)存儲(chǔ)引擎是否修改成功。 2-2答:MyISAM與InnoDB存儲(chǔ)引擎的5大區(qū)別:(1)InnoDB支持事務(wù),而MyISAM不支持事務(wù)(2)InnoDB支持行級(jí)鎖,而MyISAM支持表級(jí)鎖(3)InnoDB支持MVCC,而MyISAM不支持(4)InnoDB支持外鍵,而MyISAM不支持(5)InnoDB不支持全文索引,而MyISAM支持 3.上機(jī)操作 3-1答: CREATEDATABASEemployee;SHOWDATABASES;DROPDATABASEIFEXITSemployee;SHOWDATABASES; 3-2答: (1)showengines;//查看mysql所支持的存儲(chǔ)引擎,以及從中得到mysql默認(rèn)的存儲(chǔ)引擎。showvariableslike'%storage_engine';//查看mysql默認(rèn)的存儲(chǔ)引擎SHOWVARIABLESLIKE'default_storage_engine%';第5章數(shù)據(jù)表操作 1.選擇題1-1.D1-2.B1-3.C1-4.A1-5.C1-6.B1-7.D1-8.B1-9.C1-10.C 2.上機(jī)操作 2-1答:(1)CREATETABLEanimal(idintprimarykeyauto_increment,nameVARCHAR(20),kindsVARCHAR(8)notnull,legsint,behaviorVARCHAR(50));(2)altertableanimalmodifynamevarchar(20)notnull;(3)altertableanimalmodifybehaviorVARCHAR(50)afterkinds;(4)altertableanimaladdfurvarchar(10);(5)altertableanimaldroplegs;(6)altertableanimalrenameanimalInfo; 2-2答:CREATETABLE部門(部門號(hào)NUMBER(2),部門名VARCHAR(10),經(jīng)理名VARCHAR(10),電話Char(12)CONSTRAINTPK_SCRIMARYKEY(部門號(hào)));CREATETABLE職工(職工號(hào)NUMBER(4),姓名VARCHAR(10),年齡NUMBER(2),CONSTRAINTC1CHECK(年齡<=60),職務(wù)VARCHAR(9),工資NUMBER(7,2),部門號(hào)NUMBER(2),CONSTRAINTFK_DEPTNOFOREIGNKEY(部門號(hào))REFFERENCES部門(部門號(hào)));第6章數(shù)據(jù)操作選擇題B1-2.C1-3.B1-4.B1-5.A1-6.D1-7.B1-8.A1-9.D1-10.B2.簡答題:2-1答:若數(shù)據(jù)庫中有若干個(gè)表,表與表之間相互關(guān)聯(lián)。表關(guān)聯(lián)則會(huì)生成外鍵強(qiáng)制約束的問題,刪除數(shù)據(jù)時(shí),MYSQL會(huì)檢查表間的關(guān)聯(lián)關(guān)系,如果該數(shù)據(jù)所在表與其他表相關(guān)聯(lián),就會(huì)導(dǎo)致無法刪除,出現(xiàn)上述問題。解決方案:A.修改FOREIGN_KEY_CHECKS,取消外鍵檢驗(yàn):SETFOREIGN_KEY_CHECKS=0;B.進(jìn)行表內(nèi)數(shù)據(jù)的刪除C.再恢復(fù)外鍵約束:SETFOREIGN_KEY_CHECKS=1;2-2答:A.插入一條完整的數(shù)據(jù)記錄行,其命令如下:B.插入多條數(shù)據(jù)記錄行,其命令如下:C.插入數(shù)據(jù)記錄行的一部分,其命令如下:D.插入檢索查詢得到的數(shù)據(jù)記錄,其命令如下:2-3答:其命令如下:3.上機(jī)操作:3-1答:A.創(chuàng)建供應(yīng)數(shù)據(jù)庫,在供應(yīng)數(shù)據(jù)庫中使用SQL語句創(chuàng)建下列表。其命令如下:向供應(yīng)商表中插入一條完整的數(shù)據(jù)行,(1)其值為:('S001','鴻運(yùn)彩鋼廠','黑龍江省哈爾濱市',)。其命令如下:(2)向供應(yīng)商表中一次性插入多條完整的數(shù)據(jù)行,其值為:('S002','好運(yùn)來木材廠','黑龍江省牡丹江市',),('S003','程實(shí)水泥廠','吉林省白城市',),('S004','洪城磚廠','吉林省吉林市',),('S005','天旺零件廠','黑龍江省哈爾濱市',)。其命令如下:(3)向工程表中一次性插入多條完整的數(shù)據(jù)行,其值為:('p001','學(xué)校寢室樓改造','黑龍江省哈爾濱市'),('p002','化工路改造','黑龍江省哈爾濱市'),('p003','云上小區(qū)','吉林省長春市')。其命令如下:(4)向零件表中一次性插入多條完整的數(shù)據(jù)行,其值為:('g001','彩鋼房','藍(lán)色','二層藍(lán)色彩鋼房'),('g002','彩鋼房','白色','三層白色彩鋼房'),('g003','土石混合料','紅色','水泥石子沙子混合比為1:2:3'),('g004','標(biāo)準(zhǔn)磚','紅色','標(biāo)準(zhǔn)磚的尺寸為240mm×115mm×53mm'),('g005','上下鋪','棕色','上下鋪總共2.1米'),('g006','床鋪','棕色','上鋪下桌'),('g007','螺絲','銀色','M14*40')。其命令如下:(5)向供應(yīng)表中一次性插入多條完整的數(shù)據(jù)行,其值為:('s001','p001','g001',5),('s001','p001','g002',4),('s002','p001','g005',100),('s001','p001','g006',700),('s001','p002','g001',2),('s001','p002','g002',1),('s003','p002','g003',500),('s001','p003','g001',10),('s001','p003','g002',3),('s004','p003','g004',10000),('s005','p003','g007',5000);3-2答:執(zhí)行SQL語句,將供應(yīng)表中供應(yīng)商編號(hào)為s001的數(shù)量全部更新為6。其命令如下:3-3答:執(zhí)行SQL語句,刪除零件表中零件編號(hào)為g007的數(shù)據(jù)行。其命令如下:第7章數(shù)據(jù)查詢1.選擇題1-1.D1-2.D1-3.C1-4.D1-5.C1-6.D1-7.D1-8.C1-9.C1-10.C2.簡答題2-1答:A.簡單數(shù)據(jù)記錄查詢,其語法形式為select字段from表明B.條件數(shù)據(jù)記錄查詢,其語法形式為where+子句C.排序數(shù)據(jù)記錄查詢,其語法形式為orderby字段D.統(tǒng)計(jì)函數(shù)和分組數(shù)據(jù)記錄,其語法形式為groupby字段having條件E.限制數(shù)據(jù)記錄查詢數(shù)量,其語法形式為limit結(jié)果顯示行數(shù)2-2答:A.內(nèi)連接innerJoin:查詢結(jié)果只顯示滿足條件的數(shù)據(jù)行B.左外連接leftouterjoin:查詢結(jié)果顯示滿足條件的數(shù)據(jù)行以及左側(cè)表中的全部行數(shù)據(jù)。C.右外連接rightouterjoin:查詢結(jié)果顯示滿足條件的數(shù)據(jù)行以及右側(cè)表中的全部行數(shù)據(jù)D.交叉連接:查詢結(jié)果顯示多個(gè)表中所有行數(shù)據(jù)的組合,表之間進(jìn)行笛卡爾積操作。2-3答:A.存放于WHERE子句中的子查詢:存放于WHERE子句中的子查詢支持列子查詢和行子查詢,子查詢一般返回一行一列、多行一列或者一行多列的數(shù)據(jù)記錄集合。B.存放于FROM子句中的子查詢:存放于FROM子句中的子查詢主要支持表子查詢。此時(shí),子查詢一般返回多行多列數(shù)據(jù)記錄集合,可以將查詢結(jié)果集合作為一張臨時(shí)表。3.上機(jī)操作答:示例要求:登錄MySQL數(shù)據(jù)庫管理系統(tǒng),基于上一章創(chuàng)建的供應(yīng)數(shù)據(jù)庫以及其中的供應(yīng)商表、工程表、零件表以及供應(yīng)表;使用select語句對供應(yīng)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行查詢操作。(1)查詢所有供應(yīng)商名和地址。其命令如下:(2)查詢顏色為棕色的零件編號(hào),零件名以及顏色。其命令如下:(3)查詢使用供應(yīng)商s004所供應(yīng)零件的工程編號(hào)。其命令如下:(4)查詢工程項(xiàng)目p002使用的各種零件的名稱及數(shù)量。其命令如下:(5)查詢廠商s001供應(yīng)的所有零件de編號(hào)和零件名,且要求無重復(fù)值存在。其命令如下:(6)查詢聯(lián)系電話以133開頭的供應(yīng)商編號(hào)、供應(yīng)商名以及聯(lián)系電話(兩種方式:正則表達(dá)式、like關(guān)鍵字)。其命令如下:(7)查詢沒有使用零件g001和g002的工程編號(hào)、工程名以及地址(子查詢)。其命令如下:(8)查詢使用s001供應(yīng)商生產(chǎn)的棕色零件的工程編號(hào)。其命令如下:(9)查詢工程p001使用的零件編號(hào),以及各零件的整體數(shù)量,按照升序排列。其命令如下:第8章視圖與索引1.選擇題1-1.D1-2.C1-3.D1-4.D1-5.A 1-6.A1-7.C1-8.D2.簡答題2-1答: 兩者的區(qū)別:(1)視圖是按照SQL語句生成的一個(gè)虛擬的表。(2)視圖不占實(shí)際的物理空間,而表中的記錄需要占物理空間。(3)建立和刪除視圖只影響視圖本身,不會(huì)影響實(shí)際的記錄。而建立和刪除表會(huì)影響實(shí)際的記錄。兩者的聯(lián)系:視圖是在基本表上建立的表,其字段和記錄都來自基本表,其依賴基本表而存在一個(gè)視圖可以對應(yīng)一個(gè)基本表,也可以對應(yīng)多個(gè)基本表。視圖是基本表的抽象,在邏輯意義上建立的新關(guān)系。 2-2答:索引建立在一個(gè)或者幾個(gè)字段上。建立了索引后,表中的數(shù)據(jù)就按照索引的一定規(guī)排列。這樣可以提高查詢速度。主鍵是表中數(shù)據(jù)的唯一標(biāo)識(shí)。不同的記錄的主鍵值不同。例如,身份證好比主鍵,每個(gè)身份證號(hào)都可以唯一的確定一個(gè)人。在建立主鍵時(shí),系統(tǒng)會(huì)自動(dòng)建立一個(gè)唯一性索引。唯一性也是建立在表中一個(gè)或者幾個(gè)字段上。其目的是為了對于不同的記錄,具有唯一性的字段的值是不同的。 3.上機(jī)操作 答:create[algorithm=undefined]viewview_an(id,name,kind)asselectid,name,kindsfromanimalwithcheckoption; 注:algorithm=undefined參數(shù)可以不顯式體現(xiàn)在代碼中,因?yàn)閍lgorithm參數(shù)的默認(rèn)值既是undefined。(2)①Insertintoview_anvalues(10,’熊’,’哺乳’);②Insertintoview_anvalues(10,NULL,’哺乳’);③Insertintoview_anvalues(10,’馬’,NULL); 以上①、②、③條語句為在視圖view_an中插入的三條語句,查看是否插入成功則用select命令,其代碼如下。 SELECT*FROMview_an; 代碼運(yùn)行成功后,對于語句①通過結(jié)果可以看到插入成功,而語句②和語句③則插入失敗,因?yàn)樵趧?chuàng)建視圖view_an時(shí)使用了withcheckoption參數(shù)約束了插入元組的中的id,name,kind屬性的值都不允許為空。 (3)createorreplaceviewview_an(id,name,kind)asselectid,name,kindsfromanimalWHEREkinds=’哺乳’withcheckoption; 或者 ALTERviewview_an(id,name,kind)asselectid,name,kindsfromanimalWHEREkinds=’哺乳’withcheckoption;dropviewview_an;Createuniqueindexindex_idonanimal(id);Createfulltextindexindex_havioronanimal(behavior);Dropindexindex_havioronanimal;第9章觸發(fā)器選擇題B1-2.D1-3.C1-4.D1-5.C1-6.B1-7.D1-8.A1-9.C1-10.D簡答題2-1答:觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫對象,在預(yù)定義的事件發(fā)生時(shí),觸發(fā)程序就會(huì)被MySQL自動(dòng)調(diào)用。觸發(fā)器經(jīng)常用于實(shí)現(xiàn)加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則、跟蹤監(jiān)控用戶對數(shù)據(jù)庫的操作等功能,總的來說,觸發(fā)器可以提高系統(tǒng)的自動(dòng)化程度,增強(qiáng)系統(tǒng)的靈活性和可靠性,并幫助開發(fā)人員更好地控制和管理系統(tǒng)的行為。2-2答:按照觸發(fā)事件分類有三類,分別為INSERT觸發(fā)器、UPDATE觸發(fā)器和DELETE觸發(fā)器。INSERT:在表中新增新數(shù)據(jù)時(shí)激活觸發(fā)器。UPDATE:在表中更新數(shù)據(jù)時(shí)激活觸發(fā)器。DELETE:從表中刪除數(shù)據(jù)時(shí)激活觸發(fā)器。按照觸發(fā)時(shí)刻分類有兩類,分別是BEFORE觸發(fā)器和AFTER觸發(fā)器。BEFORE:在觸發(fā)事件發(fā)生之前觸發(fā)程序。AFTER:在觸發(fā)事件發(fā)生之后觸發(fā)程序。2-3答:濫用觸發(fā)器可能導(dǎo)致以下幾個(gè)方面的影響:性能問題:觸發(fā)器是在數(shù)據(jù)庫中執(zhí)行的邏輯代碼,如果觸發(fā)器邏輯復(fù)雜或不合理,可能會(huì)對數(shù)據(jù)庫的性能產(chǎn)生負(fù)面影響。頻繁的觸發(fā)器執(zhí)行可能導(dǎo)致響應(yīng)時(shí)間延遲和系統(tǒng)性能下降。死鎖和循環(huán)觸發(fā):如果觸發(fā)器邏輯導(dǎo)致了循環(huán)觸發(fā)的情況,可能會(huì)產(chǎn)生死鎖問題,導(dǎo)致數(shù)據(jù)庫無法正常運(yùn)行。例如,觸發(fā)器A觸發(fā)了觸發(fā)器B,而觸發(fā)器B又觸發(fā)了觸發(fā)器A,形成了一個(gè)無限循環(huán)。數(shù)據(jù)不一致性:不恰當(dāng)?shù)挠|發(fā)器邏輯可能導(dǎo)致數(shù)據(jù)一致性問題。如果觸發(fā)器邏輯有錯(cuò)誤或邏輯不完善,可能會(huì)導(dǎo)致數(shù)據(jù)更新不正確或數(shù)據(jù)丟失等問題。調(diào)試和維護(hù)困難:濫用觸發(fā)器可能增加代碼的復(fù)雜性和耦合性,使調(diào)試和維護(hù)變得困難。當(dāng)存在多個(gè)復(fù)雜的觸發(fā)器時(shí),定位問題和診斷錯(cuò)誤可能會(huì)更加困難。因此,在使用觸發(fā)器時(shí),需要謹(jǐn)慎設(shè)計(jì)、監(jiān)控和測試觸發(fā)器的邏輯,確保其合理性、可靠性和性能方面的考慮。在某些情況下,可以考慮使用其他方式替代觸發(fā)器,避免潛在的問題和風(fēng)險(xiǎn)。上機(jī)操作答:a.創(chuàng)建日志表,包含操作用戶、時(shí)間、操作類別和詳細(xì)信息。CREATETABLE日志(操作用戶VARCHAR(30),時(shí)間TIMESTAMP,操作類別VARCHAR(10),詳細(xì)信息VARCHAR(50));b.創(chuàng)建供應(yīng)商新增觸發(fā)器、供應(yīng)商修改觸發(fā)器、供應(yīng)商刪除觸發(fā)器。--供應(yīng)商新增觸發(fā)器CREATETRIGGERtr_供應(yīng)商_insertAFTERINSERTON供應(yīng)商FOREACHROWINSERTINTO日志VALUES(user(),now(),'INSERT',concat(NEW.供應(yīng)商編號(hào),NEW.供應(yīng)商名,NEW.供應(yīng)商地址,NEW.聯(lián)系電話));--供應(yīng)商修改觸發(fā)器CREATETRIGGERtr_供應(yīng)商_updateAFTERUPDATEON供應(yīng)商FOREACHROWINSERTINTO日志VALUES(user(),now(),'UPDATE',CONCAT('修改前:',OLD.供應(yīng)商編號(hào),OLD.供應(yīng)商名,OLD.供應(yīng)商地址,OLD.聯(lián)系電話));--供應(yīng)商刪除觸發(fā)器CREATETRIGGERtr_供應(yīng)商_deleteAFTERDELETEON供應(yīng)商FOREACHROWINSERTINTO日志VALUES(user(),now(),'DELETE',concat(OLD.供應(yīng)商編號(hào),OLD.供應(yīng)商名,OLD.供應(yīng)商地址,OLD.聯(lián)系電話));c.在供應(yīng)商表中新增一條記錄,并查看日志表結(jié)果。INSERTINTO供應(yīng)商(供應(yīng)商編號(hào),供應(yīng)商名,供應(yīng)商地址,聯(lián)系電話)values('S001','鴻運(yùn)彩鋼廠','黑龍江省哈爾濱市',);SELECT*FROM日志;圖9-1顯示供應(yīng)商新增觸發(fā)器觸發(fā)結(jié)果修改供應(yīng)商表供應(yīng)商編號(hào)為'S001'的記錄,將供應(yīng)商地址修改為'黑龍江省齊齊哈爾市',聯(lián)系電話修改為,并查看日志表結(jié)果。UPDATE供應(yīng)商SET供應(yīng)商地址='黑龍江省齊齊哈爾市',聯(lián)系電話=WHERE供應(yīng)商編號(hào)='S001';SELECT*FROM日志;圖9-2顯示供應(yīng)商修改觸發(fā)器觸發(fā)結(jié)果刪除供應(yīng)商表供應(yīng)商編號(hào)為'S001'的記錄,并查看日志表結(jié)果。DELETEFROM供應(yīng)商WHERE供應(yīng)商編號(hào)='S001';SELECT*FROM日志;圖9-3顯示供應(yīng)商刪除觸發(fā)器觸發(fā)結(jié)果a.創(chuàng)建供應(yīng)備份表,復(fù)制供應(yīng)表的結(jié)構(gòu)和數(shù)據(jù)。CREATETABLE供應(yīng)備份select*from供應(yīng);b.創(chuàng)建供應(yīng)新增觸發(fā)器、供應(yīng)商修改觸發(fā)器、供應(yīng)商刪除觸發(fā)器,實(shí)現(xiàn)將供應(yīng)表信息同步到供應(yīng)備份表。--供應(yīng)新增觸發(fā)器CREATETRIGGERtr_供應(yīng)_insertAFTERINSERTON供應(yīng)FOREACHROWINSERTINTO供應(yīng)備份VALUES(NEW.供應(yīng)商編號(hào),NEW.工程編號(hào),NEW.零件編號(hào),NEW.數(shù)量);--供應(yīng)修改觸發(fā)器CREATETRIGGERtr_供應(yīng)_updateAFTERUPDATEON供應(yīng)FOREACHROWUPDATE供應(yīng)備份SET數(shù)量=NEW.數(shù)量WHERE供應(yīng)商編號(hào)=NEW.供應(yīng)商編號(hào)AND工程編號(hào)=NEW.工程編號(hào)AND零件編號(hào)=NEW.零件編號(hào);--供應(yīng)刪除觸發(fā)器CREATETRIGGERtr_供應(yīng)_deleteAFTERDELETEON供應(yīng)FOREACHROWDELETEFROM供應(yīng)備份WHERE供應(yīng)商編號(hào)=OLD.供應(yīng)商編號(hào)AND工程編號(hào)=OLD.工程編號(hào)AND零件編號(hào)=OLD.零件編號(hào);在供應(yīng)表中新增兩條記錄,并查看供應(yīng)備份表結(jié)果。INSERTINTO供應(yīng)VALUES('S001','p001','g001',5),('S001','p001','g002',4);SELECT*FROM供應(yīng)備份;圖9-4顯示供應(yīng)新增觸發(fā)器觸發(fā)結(jié)果修改供應(yīng)表供應(yīng)商編號(hào)為'S001',工程編號(hào)為'p001',零件編號(hào)為'g001'的記錄,將數(shù)量修改為10,并查看供應(yīng)備份表結(jié)果。UPDATE供應(yīng)SET數(shù)量=10WHERE供應(yīng)商編號(hào)='s001'AND工程編號(hào)='p001'AND零件編號(hào)='g001';SELECT*FROM供應(yīng)備份;圖9-5顯示供應(yīng)修改觸發(fā)器觸發(fā)結(jié)果刪除供應(yīng)表供應(yīng)商編號(hào)為'S001',工程編號(hào)為'p001',零件編號(hào)為'g001'的記錄,并查看供應(yīng)備份表結(jié)果。DELETEFROM供應(yīng)WHERE供應(yīng)商編號(hào)='s001'AND工程編號(hào)='p001'AND零件編號(hào)='g001';SELECT*FROM供應(yīng)備份;圖9-6顯示供應(yīng)刪除觸發(fā)器觸發(fā)結(jié)果第10章存儲(chǔ)過程和函數(shù)選擇題B1-2.B1-3.A1-4.B1-5.D1-6.C1-7.A1-8.C1-8.D1-9.C簡答題2-1答:存儲(chǔ)過程是一組預(yù)先編譯好用于完成特定功能的SQL語句集合,存儲(chǔ)在數(shù)據(jù)庫服務(wù)器端,客戶端只需要向服務(wù)器端發(fā)出調(diào)用存儲(chǔ)過程的命令,服務(wù)器端就可以把這一組SQL語句全部執(zhí)行。--創(chuàng)建存儲(chǔ)過程CREATEPROCEDURE存儲(chǔ)過程名([IN|OUT|INOUT參數(shù)名參數(shù)類型[,...]])[characteristics...]BEGIN存儲(chǔ)過程主體;END--調(diào)用存儲(chǔ)過程CALL存儲(chǔ)過程名([參數(shù)值[,...]]);--刪除存儲(chǔ)過程DROPPROCEDURE[IFEXISTS]存儲(chǔ)過程名;2-2答:存儲(chǔ)函數(shù)是一種在數(shù)據(jù)庫中定義、編譯和保存的可重復(fù)執(zhí)行的函數(shù)。它可以接受參數(shù),并返回一個(gè)值作為結(jié)果。與存儲(chǔ)過程相比,主要區(qū)別如下:返回結(jié)果:存儲(chǔ)過程通常用于執(zhí)行一系列的操作,返回結(jié)果靈活。而存儲(chǔ)函數(shù)則必須返回一個(gè)結(jié)果值。使用方式:存儲(chǔ)過程通過調(diào)用并執(zhí)行的方式使用,而存儲(chǔ)函數(shù)可以像普通函數(shù)一樣在表達(dá)式中使用。參數(shù)傳遞:存儲(chǔ)過程和存儲(chǔ)函數(shù)都可以接受參數(shù),但存儲(chǔ)過程可以使用傳入?yún)?shù)改變數(shù)據(jù),而存儲(chǔ)函數(shù)只能使用傳入?yún)?shù)進(jìn)行計(jì)算并返回結(jié)果??傊?,存儲(chǔ)過程和存儲(chǔ)函數(shù)都是在數(shù)據(jù)庫中定義的可重復(fù)執(zhí)行的代碼塊,但存儲(chǔ)過程主要用于執(zhí)行操作而存儲(chǔ)函數(shù)主要用于計(jì)算和返回結(jié)果。2-3答:可以使用ALTERPROCEDURE語句修改存儲(chǔ)過程的某些特征。如果要修改存儲(chǔ)過程的內(nèi)容則需要通過刪除原存儲(chǔ)過程,再以相同的命名創(chuàng)建新的存儲(chǔ)過程的方式來實(shí)現(xiàn)。2-4答:存儲(chǔ)過程的參數(shù)有三類,分別為輸入?yún)?shù)(IN)、輸出參數(shù)(OUT)、輸入輸出參數(shù)(INTOU)。IN:當(dāng)前參數(shù)為輸入?yún)?shù),存儲(chǔ)過程只是讀取這個(gè)參數(shù)的值。如果沒有定義參數(shù)種類,默認(rèn)為IN。OUT:當(dāng)前參數(shù)為輸出參數(shù),該類新的參數(shù)由存儲(chǔ)過程寫入,調(diào)用這個(gè)存儲(chǔ)過程的客戶端或者應(yīng)用程序可以讀取這個(gè)參數(shù)返回的值。INOUT:同時(shí)具有IN參數(shù)和OUT參數(shù)的特性,在過程中可以讀取和寫入該類型的參數(shù)。上機(jī)操作答:創(chuàng)建存儲(chǔ)過程total_proc,實(shí)現(xiàn)統(tǒng)計(jì)供應(yīng)商、工程、零件總數(shù)功能。DELIMITER//CREATEPROCEDUREtotal_proc(OUTo_供應(yīng)商_totalfloat,OUTo_工程_totalfloat,OUTo_零件_totalfloat)BEGINSELECTCOUNT(*)INTOo_供應(yīng)商_totalFROM供應(yīng)商;SELECTCOUNT(*)INTOo_工程_totalFROM工程;SELECTCOUNT(*)INTOo_零件_totalFROM零件;END//DELIMITER;調(diào)用存儲(chǔ)過程total_proc,并查看調(diào)用結(jié)果。CALLtotal_proc(@供應(yīng)商總數(shù),@工程總數(shù),@零件總數(shù));SELECT@供應(yīng)商總數(shù),@工程總數(shù),@零件總數(shù);圖10-1顯示存儲(chǔ)過程total_proc調(diào)用結(jié)果新增存儲(chǔ)函數(shù)total_func,實(shí)現(xiàn)統(tǒng)計(jì)給定零件在給定工程中的使用數(shù)量功能。DELIMITER//CREATEFUNCTIONtotal_func(i_零件編號(hào)char(10),i_工程編號(hào)char(10))RETURNSfloatDETERMINISTICBEGINRETURN(SELECTsum(數(shù)量)FROM供應(yīng)WHERE零件編號(hào)=i_零件編號(hào)AND工程編號(hào)=i_工程編號(hào));END//DELIMITER;調(diào)用存儲(chǔ)過程total_proc,并查看調(diào)用結(jié)果。SELECTtotal_func('g001','p001');圖10-2顯示存儲(chǔ)函數(shù)total_func調(diào)用結(jié)果刪除以上存儲(chǔ)過程total_proc和存儲(chǔ)函數(shù)total_func。DROPPROCEDUREIFEXISTStotal_proc;DROPFUNCTIONIFEXISTStotal_func;圖10-3顯示刪除存儲(chǔ)過程total_proc和存儲(chǔ)函數(shù)total_func后結(jié)果第11章用戶管理選擇題1-1.D1-2.A1-3.C1-4.C1-5.A1-6.B1-7.C1-8.B1-9.B1-10.B簡答題2-1答:CREATEUSER用戶名@主機(jī)名[IDENTIFIEDBY[PASSWORD]密碼]DROPUSER用戶名@主機(jī)名2-2答:GRANT權(quán)限(列名,...),...ON數(shù)據(jù)庫名.表名TO用戶名@主機(jī)名GRANT數(shù)據(jù)庫權(quán)限,...ON*.*TO用戶名@主機(jī)名2-3答:可以使用REVOKE語句來撤銷MySQL用戶對特定數(shù)據(jù)庫的訪問權(quán)限。例如:REVOKEALLPRIVILEGESONdatabase.*FROM'username'@'hostname';2-4答:可以使用GRANT語句和SHOWGRANTS語句組合來實(shí)現(xiàn)。先使用SHOWGRANTS語句生成授權(quán)語句,然后使用GRANT語句將這些權(quán)限授予給另一個(gè)用戶。上機(jī)操作答:創(chuàng)建apply1、apply2和apply3這三個(gè)用戶,并在user表中查詢這些用戶。CREATEUSERapply1@localhostIDENTIFIEDBY'12345',apply2@localhostIDENTIFIEDBY'12345',apply3@localhostIDENTIFIEDBY'12345';SELECTUser,HostFROMuserWHEREUser='apply1'orUser='apply2'orUser='apply3';圖11-1顯示創(chuàng)建用戶apply1、apply2、apply3結(jié)果向用戶apply1授權(quán),并查看該用戶權(quán)限。GRANTSELECTON供應(yīng).*TOapply1@localhostWITHGRANTOPTION;SHOWGRANTSFORapply1@localhost;圖11-2顯示用戶apply1授權(quán)結(jié)果向用戶apply2授權(quán),并查看該用戶權(quán)限。GRANTINSERT,DELETE,UPDATE(供應(yīng)商地址,聯(lián)系電話)ON供應(yīng).供應(yīng)商TOapply2@localhost;GRANTINSERT,DELETE,UPDATE(地址)ON供應(yīng).工程TOapply2@localhost;GRANTINSERT,DELETEON供應(yīng).零件TOapply2@localhost;SHOWGRANTSFORapply2@localhost;圖11-3顯示用戶apply2授權(quán)結(jié)果向用戶apply3授權(quán),并查看該用戶權(quán)限。GRANTALLON供應(yīng).供應(yīng)TOapply3@localhost;SHOWGRANTSFORapply3@localhost;圖11-4顯示用戶apply3授權(quán)結(jié)果撤銷用戶apply3的所有權(quán)限,并查看該用戶權(quán)限。REVOKEALL,GRANTOPTIONFROMapply3@localhost;SHOWGRANTSFORapply3@localhost;圖11-5顯示用戶apply3撤銷權(quán)限結(jié)果刪除用戶apply2,并查看apply1、apply2和apply3三個(gè)用戶。DROPUSERapply2@localhost;SELECTUser,HostFROMuserWHEREUser='apply1'orUser='apply2'orUser='apply3';圖11-6顯示刪除用戶apply2結(jié)果第12章數(shù)據(jù)備份與還原1.選擇題1-1.B1-2.A1-3.C1-4.B1-5.A2.簡答題2-1答:mysqldump備份的文本文件實(shí)際上是數(shù)據(jù)庫的一個(gè)副本,使用該文件不僅可以在MySQL中恢復(fù)數(shù)據(jù)庫,而且通過對該文件的簡單修改,使用該文件在SQLServer或者Sybase等其他數(shù)據(jù)庫中恢復(fù)數(shù)據(jù)庫。這在某種程度上實(shí)現(xiàn)了數(shù)據(jù)庫之間的遷移。2-2答:根據(jù)數(shù)據(jù)庫表的存儲(chǔ)引擎的類型不同,備份表的方法也不一樣。對于MyISAM類型的表,可以直接復(fù)制MySQL數(shù)據(jù)文件夾,復(fù)制數(shù)據(jù)文件夾時(shí)需要將MySQL服務(wù)停止,否則可能會(huì)出現(xiàn)異常。mysqldump命令是非常安全的備份方法,它既適合MyISAM類型的表,又適合InnoDB類型的表。第13章日志管理 1.選擇題1-1.C1-2.A1-3.B1-4.A1-5.C 1-6.B1-7.D1-8.D1-9.B 2.簡答題2-1.答:事務(wù)是用戶定義的一個(gè)數(shù)據(jù)庫操作序列,這些操作要么全做,要么全不做,是一個(gè)不可分割的工作單位。事務(wù)具有4個(gè)特性:原子性,一致性、隔離性和持續(xù)性。2-2.答:當(dāng)多個(gè)事務(wù)并發(fā)地存取數(shù)據(jù)庫時(shí)就會(huì)產(chǎn)生同時(shí)讀取或修改同一數(shù)據(jù)的情況,若對并發(fā)操作不加控制就可能會(huì)存取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性,所以數(shù)據(jù)庫管理系統(tǒng)必須提供并發(fā)控制機(jī)制。2-3.答:封鎖就是事務(wù)T在對某個(gè)數(shù)據(jù)對象操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后的事務(wù)就對該數(shù)據(jù)對象有了一定的控制,在事務(wù)T釋放它的鎖之前,其他的事務(wù)不能更新此數(shù)據(jù)對象.2-4.答:基本的封鎖有兩種:排他鎖和共享鎖排他鎖又稱為寫鎖,若事務(wù)T對數(shù)據(jù)對象A加上X鎖,則只允許T讀取和修改A,其他任何事務(wù)都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務(wù)在T釋放A上的鎖之前不能再讀取和修改A.共享鎖又稱讀鎖。若事務(wù)T對數(shù)據(jù)對象A加上S鎖,則事務(wù)T可以讀A但不能修改A,其他事務(wù)只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其他事務(wù)可以讀A,但在T釋放A上的S鎖之前不能對A做任何的修改。第14章Java操作MySQL數(shù)據(jù)庫上機(jī)操作:示例要求:連接MySQL數(shù)據(jù)庫,基于Java語言,對供應(yīng)數(shù)據(jù)庫中的零件Item表、工程Project表、供應(yīng)商Supplier表以及供應(yīng)Supply表進(jìn)行數(shù)據(jù)的增刪改查操作。其實(shí)現(xiàn)過程如下所示:使用Java語言連接供應(yīng)數(shù)據(jù)庫;importjava.sql.*;

publicclassDBConnection{

//驅(qū)動(dòng)

publicstaticfinalStringdriverName="com.mysql.cj.jdbc.Driver";

//數(shù)據(jù)庫地址

publicstaticfinalStringurl="jdbc:mysql://localhost:3306/供應(yīng)?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&allowPublicKeyRetrieval=true";

//數(shù)據(jù)庫用戶名

publicstaticfinalStringuser="root";

//數(shù)據(jù)庫密碼

publicstaticfinalStringpassword="password";

publicstaticConnectionconnection=null;

//獲取數(shù)據(jù)庫連接

publicstaticConnectiongetConnection()throwsSQLException{

try{

Class.forName(driverName);

connection=DriverManager.getConnection(url,user,password);

}catch(ClassNotFoundExceptione){

e.printStackTrace();

}

returnconnection;

}

//釋放數(shù)據(jù)庫連接

publicstaticvoidclose(ResultSetrs,Statementst,Connectionconn){

try{

if(rs!=null){

rs.close();

}

}catch(SQLExceptione){

e.printStackTrace();

}finally{

try{

if(st!=null){

st.close();

}

}catch(SQLExceptione){

e.printStackTrace();

}finally{

if(conn!=null){

try{

conn.close();

}catch(SQLExceptione){

e.printStackTrace();

}

}

}

}

}

}創(chuàng)建工程Project類;查詢工程Project表中的所有數(shù)據(jù);向工程Project表中增加一行完整的數(shù)據(jù)行,各字段值為("p004","云上小區(qū)","吉林省長春市");在工程Project表中,修改工程編號(hào)為p004的數(shù)據(jù)行,將工程名更新為學(xué)校寢室樓改造,地址更改為黑龍江省哈爾濱市;查詢工程編號(hào)為p004的所有數(shù)據(jù);在工程Project表中,刪除工程編號(hào)為p004的數(shù)據(jù)行;importjava.sql.Connection;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.util.ArrayList;

//工程類

classProject{

privateStringno;

privateStringname;

privateStringaddress;

publicProject(){

}

publicProject(Stringno,Stringname,Stringaddress){

this.no=no;

=name;

this.address=address;

}

@Override

publicStringtoString(){

return"Project{"+

"no='"+no+'\''+

",name='"+name+'\''+

",address='"+address+'\''+

'}';

}

publicStringgetAddress(){

returnaddress;

}

publicvoidsetAddress(Stringaddress){

this.address=address;

}

publicStringgetNo(){

returnno;

}

publicvoidsetNo(Stringno){

this.no=no;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

=name;

}

}//工程Project表增刪改查

publicclassProjectDao{

//添加

publicstaticvoidadd(Projectp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="insertinto`工程`values('"+p.getNo()+"'"

+",?"

+",?"

+")";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getAddress());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//修改

publicstaticvoidupdate(Projectp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="update`工程`set"+

"`工程名`=?"+

",`地址`=?"+

"where`工程編號(hào)`='"+p.getNo()+"'";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getAddress());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//刪除

publicstaticvoiddelete(Stringno){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="deletefrom`工程`where`工程編號(hào)`=?";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,no);

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//獲取全部列表

publicstaticArrayList<Project>getList(){

ArrayList<Project>list=newArrayList<Project>();

try{

Connectioncon=DBConnection.getConnection();

Stringsql="select*from`工程`";

PreparedStatementps=con.prepareStatement(sql);

ResultSetrs=ps.executeQuery();

while(rs.next()){

Projectp=newProject();

p.setNo(rs.getString(1));

p.setName(rs.getString(2));

p.setAddress(rs.getString(3));

list.add(p);

}

DBConnection.close(rs,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

returnlist;

}

//按編號(hào)查詢

publicstaticProjectfindNo(Stringfind){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="select*from`工程`where`工程編號(hào)`=?";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,find);

ResultSetrs=ps.executeQuery();

if(rs.next()){

Projectp=newProject();

p.setNo(rs.getString(1));

p.setName(rs.getString(2));

p.setAddress(rs.getString(3));

returnp;

}

DBConnection.close(rs,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

returnnull;

}

//測試

publicstaticvoidtest(){

Projectp=newProject("p004","云上小區(qū)","吉林省長春市");

System.out.println("測試工程增刪改查");

System.out.println("\n查詢?nèi)?);

for(ProjectProject:getList()){

System.out.println(Project);

}

System.out.println("\n增加工程后,查詢?nèi)?);

add(p);

for(ProjectProject:getList()){

System.out.println(Project);

}

System.out.println("\n修改工程后,查詢?nèi)?);

p.setName("學(xué)校寢室樓改造");

p.setAddress("黑龍江省哈爾濱市");

update(p);

for(ProjectProject:getList()){

System.out.println(Project);

}

System.out.println("\n查詢工程號(hào)"+p.getNo());

System.out.println(findNo(p.getNo()));

System.out.println("\n刪除工程后,查詢?nèi)?);

delete(p.getNo());

for(ProjectProject:getList()){

System.out.println(Project);

}

}

}執(zhí)行結(jié)果如圖所示:創(chuàng)建零件Item類。查詢零件Item表中的所有數(shù)據(jù);向零件Item表中插入一行完整的數(shù)據(jù)行,各字段值為("g008","彩鋼房","藍(lán)色","二層藍(lán)色彩鋼房");在零件Item表中,修改零件編號(hào)為g008的數(shù)據(jù)行,將零件名稱更新為土石混合料,顏色更新為白色;查詢零件Item表中,零件編號(hào)為g008的全部信息;刪除零件Item表中,零件編號(hào)為g008的數(shù)據(jù)行。importjava.sql.Connection;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.util.ArrayList;

//零件類

classItem{

privateStringno;

privateStringname;

privateStringcolor;

privateStringbrief;

publicItem(){

}

publicStringgetBrief(){

returnbrief;

}

publicvoidsetBrief(Stringbrief){

this.brief=brief;

}

publicItem(Stringno,Stringname,Stringcolor,Stringbrief){

this.no=no;

=name;

this.color=color;

this.brief=brief;

}

@Override

publicStringtoString(){

return"Item{"+

"no='"+no+'\''+

",name='"+name+'\''+

",color='"+color+'\''+

",brief='"+brief+'\''+

'}';

}

publicStringgetColor(){

returncolor;

}

publicvoidsetColor(Stringcolor){

this.color=color;

}

publicStringgetNo(){

returnno;

}

publicvoidsetNo(Stringno){

this.no=no;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

=name;

}

}

//jdbc增刪改查

publicclassItemDao{

//添加

publicstaticvoidadd(Itemp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="insertinto`零件`values('"+p.getNo()+"'"

+",?"

+",?"

+",?"

+")";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getColor());

ps.setString(3,p.getBrief());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//修改

publicstaticvoidupdate(Itemp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="update`零件`set"+

"`零件名`=?"+

",`顏色`=?"+

",`簡介`=?"+

"where`零件編號(hào)`='"+p.getNo()+"'";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getColor());

ps.setString(3,p.getBrief());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//刪除

publicstaticvoiddelete(Stringno){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="deletefrom`零件`where`零件編號(hào)`=?";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,no);

ps.ex

溫馨提示

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

最新文檔

評論

0/150

提交評論