1. 如何安裝MySQL事務(wù)數(shù)據(jù)庫
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、營山網(wǎng)站維護(hù)、網(wǎng)站推廣。
MySQL數(shù)據(jù)庫分二種類型,一種是傳統(tǒng)的數(shù)據(jù)表格式,一種是支持事務(wù)處理的數(shù)據(jù)表格式(InnoDB,BDB,其中以InnoDB為主),下面我介紹一下關(guān)于MySQL事務(wù)處理數(shù)據(jù)庫的安裝及使用方法 你先要去下載一下Mysql max版的安裝程序,下載地址: 按常規(guī)的方法進(jìn)行安裝 安裝完成后,啟動mysqlbinWinMySQLadmin 再退出 運行 mysqlbinmydqld-nt --remove mysqlbinmysqld-max-nt --install 以上二行是去掉不支持事務(wù)處理的mysql服務(wù),改成支持mysql事務(wù)處理的服務(wù) 然后在c:下建一個ibdata目錄及iblogs目錄,當(dāng)然名字可以不一樣,記住這二個名字及盤符,以后要用到,你也可以不建在C盤,然后,打開c:winnt或c:windows目錄下的my。
ini,在最后添加:[code] innodb_data_file_path = ibdata1:2000M;ibdata2:2000M innodb_data_home_dir = c:ibdata set-variable = innodb_mirrored_log_groups=1 innodb_log_group_home_dir = c:iblogs set-variable = innodb_log_files_in_group=3 set-variable = innodb_log_file_size=30M set-variable = innodb_log_buffer_size=8M innodb_flush_log_at_trx_mit=1 innodb_log_arch_dir = c:iblogs innodb_log_archive=0 set-variable = innodb_buffer_pool_size=80M set-variable = innodb_additional_mem_pool_size=10M set-variable = innodb_file_io_threads=4 set-variable = innodb_lock_wait_timeout=50 [/code] 其中 innodb_data_file_path = ibdata1:2000M;ibdata2:2000M 這一行中的2000M可以自己改成200m,看你盤的容量大小,mysql推薦10G及以上的硬盤空間最好用這樣的設(shè)置; 以下這一行 innodb_data_home_dir = c:ibdata 也可以改成你自己起的目錄,主要是看你自己在剛才建的目錄在哪里啦 按照以上的方法,你已經(jīng)安裝好了mysql的事務(wù)數(shù)據(jù)庫,不過你要是按照mysql手冊上的方法安裝,把上面的一段配制放到my。 f是去的話,可是會出錯哦 好了,現(xiàn)在讓我們試試看是不是安裝完成了,啟動apache,或iis,在服務(wù)里啟動mysql的服務(wù),打開myadmin,輸入:SHOW variables like "have_%" 你要是看到下面的結(jié)果,那說明你安裝成功了。
2. Windows下MySQL策略有哪些
本次活動將重點關(guān)注世界上最流行的開源數(shù)據(jù)庫最新版本MySQL 5。
5,其在Windows上運行時能提供高達(dá)1500%的性能優(yōu)勢。 此次活動還將詳細(xì)介紹,利用全新升級的MySQL企業(yè)版,Oracle如何超過Microsoft SQL Server,節(jié)省高達(dá)90%總體擁有成本,該企業(yè)版目前包括了建模、開發(fā)、監(jiān)測、管理和基于Windows 的MySQL應(yīng)用程序備份等的一整套可視化工具。
論壇將詳細(xì)介紹對Windows用戶和獨立軟件開發(fā)商的益處 利用在Windows平臺上運行的MySQL企業(yè)版,甲骨文使客戶能夠大幅降低其在開發(fā)網(wǎng)絡(luò)應(yīng)用、部門級的應(yīng)用和嵌入式應(yīng)用軟件的總體擁有成本。同時,借助甲骨文公司世界一流的24x7全天候服務(wù)支持,客戶能實現(xiàn)更高的MySQL性能,跨平臺的靈活性和提高管理。
首屆MySQL on Windows在線論壇將闡述: 為什么MySQL on Windows既受企業(yè)用戶也受嵌入式獨立軟件供應(yīng)商的熱烈歡迎。 MySQL為什么非常適合Windows環(huán)境,未來將會有什么樣的里程碑以實現(xiàn)MySQL在Microsoft平臺上更好運行。
哪些可視化工具可用來有效地開發(fā)、部署和管理MySQL on Windows的應(yīng)用程序。 如何推出基于Windows平臺上的MySQL高可用關(guān)鍵業(yè)務(wù)應(yīng)用程序。
安全解決方案供應(yīng)商SonicWall公司為何選擇MySQL而沒有選擇Microsoft SQL Server,以及他們?nèi)绾纬晒Φ靥峁┗贛ySQL的解決方案。 甲骨文公司工程設(shè)計副總裁Tomas Ulin表示:“通過選擇MySQL on Windows,客戶能極大地降低成本和提高對跨平臺的支持。
甲骨文已經(jīng)推出了MySQL 5。5 和 MySQL 企業(yè)版的主要增強(qiáng)功能,這些功能將為客戶帶來巨大的益處。
對于正在創(chuàng)建和部署關(guān)鍵網(wǎng)絡(luò)業(yè)務(wù)和嵌入式應(yīng)用軟件的獨立軟件開發(fā)商和企業(yè)用戶來說,MySQL是替代Microsoft SQL Server的一個極具吸引力的選擇。” SonicWall產(chǎn)品管理總監(jiān)Jan Sijp說:“把MySQL嵌入到我們的安全產(chǎn)品中已被證明是明智選擇,通過與我們的自身專業(yè)相結(jié)合,MySQL能夠幫助我們?yōu)榭蛻籼峁└叨瓤煽康年P(guān)鍵解決方案,客戶將能從集成、方便使用的解決方案中受益,而不必安裝一個單獨的數(shù)據(jù)庫。
除了為客戶減少復(fù)雜度之外,我們也降低了內(nèi)部開發(fā)、測試和支持的成本?!?。
3. MYsql和sql到底是不是一個東西
MYsql和sql不同,為了表達(dá)的更科學(xué)更準(zhǔn)確,我介紹你看比較權(quán)威的文章,大家一起學(xué)習(xí),聲明,下面不是我的作品,請注意尊重版權(quán)。
文章來源:數(shù)據(jù)庫聯(lián)盟網(wǎng) 發(fā)布時間:2005-03-25 07:30:55 對于程序開發(fā)人員而言,目前使用最流行的兩種后臺數(shù)據(jù)庫即為MySQL and SQL Server。 這兩者最基本的相似之處在于數(shù)據(jù)存儲和屬于查詢系統(tǒng)。
你可以使用SQL來訪問這兩種數(shù)據(jù)庫的數(shù)據(jù),因為它們都支持ANSI-SQL。還有,這兩種數(shù)據(jù)庫系統(tǒng)都支持二進(jìn)制關(guān)鍵詞和關(guān)鍵索引,這就大大地加快了查詢速度。
同時,二者也都提供支持XML的各種格式。 除了在顯而易見的軟件價格上的區(qū)別之外,這兩個產(chǎn)品還有什么明顯的區(qū)別嗎?在這二者之間你是如何選擇的?讓我們看看這兩個產(chǎn)品的主要的不同之處,包括發(fā)行費用,性能以及它們的安全性。
根本的區(qū)別是它們遵循的基本原則 二者所遵循的基本原則是它們的主要區(qū)別:開放vs保守。 SQL服務(wù)器的狹隘的,保守的存儲引擎與MySQL服務(wù)器的可擴(kuò)展,開放的存儲引擎絕然不同。
雖然你可以使用SQL服務(wù)器的Sybase引擎,但MySQL能夠提供更多種的選擇,如MyISAM, Heap, InnoDB, and Berkeley DB。 MySQL不完全支持陌生的關(guān)鍵詞,所以它比SQL服務(wù)器要少一些相關(guān)的數(shù)據(jù)庫。
同時,MySQL也缺乏一些存儲程序的功能,比如MyISAM引擎聯(lián)支持交換功能。 發(fā)行費用:MySQL不全是免費,但很便宜 當(dāng)提及發(fā)行的費用,這兩個產(chǎn)品采用兩種絕然不同的決策。
對于SQL服務(wù)器,獲取一個免費的開發(fā)費用最常的方式是購買微軟的Office或者Visual Studio的費用。但是,如果你想用于商業(yè)產(chǎn)品的開發(fā),你必須還要購買SQL Server Standard Edition。
學(xué)?;蚍勤A利的企業(yè)可以不考慮這一附加的費用。 性能:先進(jìn)的MySQL 純粹就性能而言,MySQL是相當(dāng)出色的,因為它包含一個缺省桌面格式MyISAM。
MyISAM 數(shù)據(jù)庫與磁盤非常地兼容而不占用過多的CPU和內(nèi)存。MySQL可以運行于Windows系統(tǒng)而不會發(fā)生沖突,在UNIX或類似UNIX系統(tǒng)上運行則更好。
你還可以通過使用64位處理器來獲取額外的一些性能。因為MySQL在內(nèi)部里很多時候都使用64位的整數(shù)處理。
Yahoo!商業(yè)網(wǎng)站就使用MySQL作為后臺數(shù)據(jù)庫。 當(dāng)提及軟件的性能,SQL服務(wù)器的穩(wěn)定性要比它的競爭對手強(qiáng)很多。
但是,這些特性也要付出代價的。 比如,必須增加額外復(fù)雜操作,磁盤存儲,內(nèi)存損耗等等。
如果你的硬件和軟件不能充分支持SQL服務(wù)器,我建議你最好選擇其他如DBMS數(shù)據(jù)庫,因為這樣你會得到更好的結(jié)果。 安全功能 MySQL有一個用于改變數(shù)據(jù)的二進(jìn)制日志。
因為它是二進(jìn)制,這一日志能夠快速地從主機(jī)上復(fù)制數(shù)據(jù)到客戶機(jī)上。 即使服務(wù)器崩潰,這一二進(jìn)制日志也會保持完整,而且復(fù)制的部分也不會受到損壞。
在SQL服務(wù)器中,你也可以記錄SQL的有關(guān)查詢,但這需要付出很高的代價。 安全性 這兩個產(chǎn)品都有自己完整的安全機(jī)制。
只要你遵循這些安全機(jī)制,一般程序都不會出現(xiàn)什么問題。 這兩者都使用缺省的IP端口,但是有時候很不幸,這些IP也會被一些黑客闖入。
當(dāng)然,你也可以自己設(shè)置這些IP端口。 恢復(fù)性:先進(jìn)的SQL服務(wù)器 恢復(fù)性也是MySQL的一個特點,這主要表現(xiàn)在MyISAM配置中。
這種方式有它固有的缺欠,如果你不慎損壞數(shù)據(jù)庫,結(jié)果可能會導(dǎo)致所有的數(shù)據(jù)丟失。 然而,對于SQL服務(wù)器而言就表現(xiàn)得很穩(wěn)鍵。
SQL服務(wù)器能夠時刻監(jiān)測數(shù)據(jù)交換點并能夠把數(shù)據(jù)庫損壞的過程保存下來。 根據(jù)需要決定你的選擇 對于這兩種數(shù)據(jù)庫,如果非要讓我說出到底哪一種更加出色,也許我會讓你失望。
以我的觀點,任一對你的工作有幫助的數(shù)據(jù)庫都是很好的數(shù)據(jù)庫,沒有哪一個數(shù)據(jù)庫是絕對的出色,也沒有哪一個數(shù)據(jù)庫是絕對的差勁。 我想要告訴你的是你應(yīng)該多從你自己的需要出發(fā),即你要完成什么樣的任務(wù)?而不要單純地從軟件的功能出發(fā)。
如果你想建立一個。服務(wù)器體系,這一體系可以從多個不同平臺訪問數(shù)據(jù),參與數(shù)據(jù)庫的管理,那么你可以選用SQL服務(wù)器。
如果你想建立一個第三方站點,這一站點可以從一些客戶端讀取數(shù)據(jù),那么MySQL將是最好的選擇。 這兩者數(shù)據(jù)庫都能夠在。
或J2EE下運行正常,同樣,都能夠利用RAID。 。
4. mysql中事務(wù)和存儲過程的區(qū)別
存儲過程是:
通過一系列的SQL語句, 根據(jù)傳入的參數(shù)(也可以沒有), 通過簡單的調(diào)用,
完成比單個SQL語句更復(fù)雜的功能, 存儲在數(shù)據(jù)庫服務(wù)器端,只需要編譯過一次之后再次使用都不需要再進(jìn)行編譯。主要對存儲的過程進(jìn)行控制。
事務(wù)是一系列的數(shù)據(jù)更改操作組成的一個整體。一旦事務(wù)中包含的某操作失敗或用戶中止,用戶可以控制將事務(wù)體中所有操作撤消,返回事務(wù)開始前的狀態(tài)。
事務(wù)中的操作是一個整體,要么整體完成,要么全部不做。從而保證了數(shù)據(jù)的完整性。
Mysql中,MyISAM存儲引擎不支持事務(wù),InnoDB支持。
兩者都是數(shù)據(jù)庫中非常重要的知識。
5. 有關(guān)數(shù)據(jù)庫最基本最基礎(chǔ)知識
一 事務(wù)處理介紹 事務(wù)是這樣一種機(jī)制,它確保多個SQL語句被當(dāng)作單個工作單 元來處理。
事務(wù)具有以下的作用: * 一致性:同時進(jìn)行的查詢和更新彼此不會發(fā)生沖突,其他 用戶不會看到發(fā)生了變化但尚未提交的數(shù)據(jù)。 * 可恢復(fù)性:一旦系統(tǒng)故障,數(shù)據(jù)庫會自動地完全恢復(fù)未完 成的事務(wù)。
二 事務(wù)與一致性 事務(wù)是完整性的單位,一個事務(wù)的執(zhí)行是把數(shù)據(jù)庫從一個一 致的狀態(tài)轉(zhuǎn)換成另一個一致的狀態(tài)。因此,如果事務(wù)孤立執(zhí)行時 是正確的,但如果多個事務(wù)并發(fā)交錯地執(zhí)行,就可能相互干擾, 造成數(shù)據(jù)庫狀態(tài)的不一致。
在多用戶環(huán)境中,數(shù)據(jù)庫必須避免同 時進(jìn)行的查詢和更新發(fā)生沖突。這一點是很重要的,如果正在被 處理的數(shù)據(jù)能夠在該處理正在運行時被另一用戶的修改所改變, 那么該處理結(jié)果是不明確的。
不加控制的并發(fā)存取會產(chǎn)生以下幾種錯誤: 1 丟失修改(lost updates) 當(dāng)多個事務(wù)并發(fā)修改一個數(shù)據(jù)時,不加控制會得出錯誤的結(jié) 果,一個修改會覆蓋掉另一個修改。 2 讀的不可重復(fù)性 當(dāng)多個事務(wù)按某種時間順序存取若干數(shù)據(jù)時,如果對并發(fā)存 取不加控制,也會產(chǎn)生錯誤。
3 臟讀(DIRDY DATA),讀的不一致性 4 光標(biāo)帶來的當(dāng)前值的混亂 事務(wù)在執(zhí)行過程中它在某個表上的當(dāng)前查找位置是由光標(biāo)表 示的。光標(biāo)指向當(dāng)前正處理的記錄。
當(dāng)處理完該條記錄后,則指 向下一條記錄。在多個事務(wù)并發(fā)執(zhí)行時,某一事務(wù)的修改可能產(chǎn) 生負(fù)作用,使與這些光標(biāo)有關(guān)的事務(wù)出錯。
5 未釋放修改造成連鎖退出 一個事務(wù)在進(jìn)行修改操作的過程中可能會發(fā)生故障,這時需 要將已做的修改回退(Rollback)。如果在已進(jìn)行過或已發(fā)現(xiàn)錯 誤尚未復(fù)原之前允許其它事務(wù)讀已做過修改(臟讀),則會導(dǎo)致 連鎖退出。
6 一事務(wù)在對一表更新時,另外的事務(wù)卻修改或刪除此表的 定義。 數(shù)據(jù)庫會為每個事務(wù)自動地設(shè)置適當(dāng)級別的鎖定。
對于前面 講述的問題:臟讀、未釋放修改造成的連鎖退出、一事務(wù)在對一 表更新時另外的事務(wù)卻修改或刪除此表的定義,數(shù)據(jù)庫都會自動 解決。而另外的三個問題則需要在編程過程中人為地定義事務(wù)或 加鎖來解決。
三 事務(wù)和恢復(fù) 數(shù)據(jù)庫本身肩負(fù)著管理事務(wù)的責(zé)任。事務(wù)是最小的邏輯工作 單元,在這個工作單元中,對數(shù)據(jù)庫的所有更新工作,要么必須 全部成功,要么必須全部失?。ɑ赝耍?。
只要應(yīng)用程序指定了某 段程序為一個事務(wù)并做了相應(yīng)的處理(提交或回退),數(shù)據(jù)庫系 統(tǒng)會自動維護(hù)事務(wù)本身的特性。 四 ORACLE數(shù)據(jù)庫的事務(wù)定義 ORACLE事務(wù)從MIT、ROLLBACK、連接到數(shù)據(jù)庫或開始第一 條可執(zhí)行的SQL語句時開始,到一條MIT、ROLLBACK語句或退出 數(shù)據(jù)庫時結(jié)束。
如果在一個事務(wù)中包含DDL語句,則在DDL語句的 前后都會隱含地執(zhí)行MIT語句,從而開始或結(jié)束一個事務(wù)。 如果一個事務(wù)由于某些故障或者由于用戶改變主意而必須在 提交前取消它,則數(shù)據(jù)庫被恢復(fù)到這些語句和過程執(zhí)行之前的狀 態(tài)。
利用ROLLBACK語句可以在MIT命令前隨時撤消或回退一個 事務(wù)??梢曰赝苏麄€事務(wù),也可以會退部分事務(wù),但是不能回退 一個已經(jīng)被提交的事務(wù)。
回退部分事務(wù)的ROLLBACK命令為: ROLLBACK to savepoint 存儲點名 存儲點是用戶放入事務(wù)中的標(biāo)記,用來表示一個可被回退的 位置。存儲點通過在事務(wù)中放入一個SAVEPOINT命令而 *** 入。
該 命令的語法是: SAVEPOINT 存儲點名 如果在ROLLBACK語句中沒有給出存儲點名,則整個事務(wù)被回 退。 五 SYBASE數(shù)據(jù)庫的事務(wù)定義 SYBASE通過使用BEGIN TRANsaction和MIT TRANsaction命令指 示SQL將任意數(shù)目的語句作為一個單元來處理。
ROLLBACK TRANsaction 命令則允許用戶恢復(fù)到事務(wù)的開始,或恢復(fù)到事務(wù)內(nèi)部已經(jīng)被用SAVE TRANsaction命令定義的存儲點上。 BEGIN TRANsaction和MIT TRANsaction能夠包含任意數(shù)目的SQL 語句和存儲過程,方法很簡單: BEGIN TRANsaction [事務(wù)名稱] MIT TRANsaction 如果一個事務(wù)由于某些故障或者由于用戶改變主意而必須在提交 前取消它,則數(shù)據(jù)庫被恢復(fù)到這些語句和過程執(zhí)行之前的狀態(tài)。
利用ROLLBACK TRANsaction命令可以在MIT TRANsaction命令 前隨時回退一個事務(wù)??梢曰赝苏麄€事務(wù),也可以回退部分事務(wù),但 是不能回退一個已經(jīng)被提交的事務(wù)。
ROLLBACK TRANsaction命令為: ROLLBACK TRANsaction [事務(wù)名|存儲點名] 存儲點名是用戶放入事務(wù)中的標(biāo)記,用來表示一個可以被回退的 位置。存儲點名通過在事務(wù)中放入一個SAVE TRANsaction命令而 *** 入。
該命令的句法是: SAVE TRANsaction 存儲點名 如果在ROLLBACK TRANsaction中沒有給出存儲點名或事務(wù)名,則 事務(wù)被回退到批處理中的第一個BEGIN TRANsaction語句處。
只要字段值還可以繼續(xù)拆分,就不滿足第一范式。
范式設(shè)計得越詳細(xì),對某些實際操作可能會更好,但并非都有好處,需要對項目的實際情況進(jìn)行設(shè)定。
在滿足第一范式的前提下,其他列都必須完全依賴于主鍵列。 如果出現(xiàn)不完全依賴,只可能發(fā)生在聯(lián)合主鍵的情況下:
實際上,在這張訂單表中,product_name 只依賴于 product_id ,customer_name 只依賴于 customer_id。也就是說,product_name 和 customer_id 是沒用關(guān)系的,customer_name 和 product_id 也是沒有關(guān)系的。
這就不滿足第二范式:其他列都必須完全依賴于主鍵列!
拆分之后,myorder 表中的 product_id 和 customer_id 完全依賴于 order_id 主鍵,而 product 和 customer 表中的其他字段又完全依賴于主鍵。滿足了第二范式的設(shè)計!
在滿足第二范式的前提下,除了主鍵列之外,其他列之間不能有傳遞依賴關(guān)系。
表中的 customer_phone 有可能依賴于 order_id 、 customer_id 兩列,也就不滿足了第三范式的設(shè)計:其他列之間不能有傳遞依賴關(guān)系。
修改后就不存在其他列之間的傳遞依賴關(guān)系,其他列都只依賴于主鍵列,滿足了第三范式的設(shè)計!
查詢每門課的平均成績。
查詢 score 表中至少有 2 名學(xué)生選修,并以 3 開頭的課程的平均分?jǐn)?shù)。
分析表發(fā)現(xiàn),至少有 2 名學(xué)生選修的課程是 3-105 、3-245 、6-166 ,以 3 開頭的課程是 3-105 、3-245。也就是說,我們要查詢所有 3-105 和 3-245 的 degree 平均分。
查詢所有學(xué)生的 name,以及該學(xué)生在 score 表中對應(yīng)的 c_no 和 degree 。
通過分析可以發(fā)現(xiàn),只要把 score 表中的 s_no 字段值替換成 student 表中對應(yīng)的 name 字段值就可以了,如何做呢?
查詢所有學(xué)生的 no 、課程名稱 ( course 表中的 name ) 和成績 ( score 表中的 degree ) 列。
只有 score 關(guān)聯(lián)學(xué)生的 no ,因此只要查詢 score 表,就能找出所有和學(xué)生相關(guān)的 no 和 degree :
然后查詢 course 表:
只要把 score 表中的 c_no 替換成 course 表中對應(yīng)的 name 字段值就可以了。
查詢所有學(xué)生的 name 、課程名 ( course 表中的 name ) 和 degree 。
只有 score 表中關(guān)聯(lián)學(xué)生的學(xué)號和課堂號,我們只要圍繞著 score 這張表查詢就好了。
只要把 s_no 和 c_no 替換成 student 和 srouse 表中對應(yīng)的 name 字段值就好了。
首先把 s_no 替換成 student 表中的 name 字段:
再把 c_no 替換成 course 表中的 name 字段:
查詢 95031 班學(xué)生每門課程的平均成績。
在 score 表中根據(jù) student 表的學(xué)生編號篩選出學(xué)生的課堂號和成績:
這時只要將 c_no 分組一下就能得出 95031 班學(xué)生每門課的平均成績:
查詢在 3-105 課程中,所有成績高于 109 號同學(xué)的記錄。
首先篩選出課堂號為 3-105 ,在找出所有成績高于 109 號同學(xué)的的行。
查詢所有成績高于 109 號同學(xué)的 3-105 課程成績記錄。
查詢所有和 101 、108 號學(xué)生同年出生的 no 、name 、birthday 列。
查詢 '張旭' 教師任課的學(xué)生成績表。
首先找到教師編號:
通過 sourse 表找到該教師課程號:
通過篩選出的課程號查詢成績表:
查詢某選修課程多于5個同學(xué)的教師姓名。
首先在 teacher 表中,根據(jù) no 字段來判斷該教師的同一門課程是否有至少5名學(xué)員選修:
查看和教師編號有有關(guān)的表的信息:
我們已經(jīng)找到和教師編號有關(guān)的字段就在 course 表中,但是還無法知道哪門課程至少有5名學(xué)生選修,所以還需要根據(jù) score 表來查詢:
根據(jù)篩選出來的課程號,找出在某課程中,擁有至少5名學(xué)員的教師編號:
在 teacher 表中,根據(jù)篩選出來的教師編號找到教師姓名:
查詢 “計算機(jī)系” 課程的成績表。
思路是,先找出 course 表中所有 計算機(jī)系 課程的編號,然后根據(jù)這個編號查詢 score 表。
查詢 計算機(jī)系 與 電子工程系 中的不同職稱的教師。
查詢課程 3-105 且成績 至少 高于 3-245 的 score 表。
查詢課程 3-105 且成績高于 3-245 的 score 表。
查詢某課程成績比該課程平均成績低的 score 表。
查詢所有任課 ( 在 course 表里有課程 ) 教師的 name 和 department 。
查詢 student 表中至少有 2 名男生的 class 。
查詢 student 表中不姓 "王" 的同學(xué)記錄。
查詢 student 表中每個學(xué)生的姓名和年齡。
查詢 student 表中最大和最小的 birthday 值。
以 class 和 birthday 從大到小的順序查詢 student 表。
查詢 "男" 教師及其所上的課程。
查詢最高分同學(xué)的 score 表。
查詢和 "李軍" 同性別的所有同學(xué) name 。
查詢和 "李軍" 同性別且同班的同學(xué) name 。
查詢所有選修 "計算機(jī)導(dǎo)論" 課程的 "男" 同學(xué)成績表。
需要的 "計算機(jī)導(dǎo)論" 和性別為 "男" 的編號可以在 course 和 student 表中找到。
建立一個 grade 表代表學(xué)生的成績等級,并插入數(shù)據(jù):
查詢所有學(xué)生的 s_no 、c_no 和 grade 列。
思路是,使用區(qū)間 ( BETWEEN ) 查詢,判斷學(xué)生的成績 ( degree ) 在 grade 表的 low 和 upp 之間。
準(zhǔn)備用于測試連接查詢的數(shù)據(jù):
分析兩張表發(fā)現(xiàn),person 表并沒有為 cardId 字段設(shè)置一個在 card 表中對應(yīng)的 id 外鍵。如果設(shè)置了的話,person 中 cardId 字段值為 6 的行就插不進(jìn)去,因為該 cardId 值在 card 表中并沒有。
要查詢這兩張表中有關(guān)系的數(shù)據(jù),可以使用 INNER JOIN ( 內(nèi)連接 ) 將它們連接在一起。
完整顯示左邊的表 ( person ) ,右邊的表如果符合條件就顯示,不符合則補 NULL 。
完整顯示右邊的表 ( card ) ,左邊的表如果符合條件就顯示,不符合則補 NULL 。
完整顯示兩張表的全部數(shù)據(jù)。
在 MySQL 中,事務(wù)其實是一個最小的不可分割的工作單元。事務(wù)能夠 保證一個業(yè)務(wù)的完整性 。
比如我們的銀行轉(zhuǎn)賬:
在實際項目中,假設(shè)只有一條 SQL 語句執(zhí)行成功,而另外一條執(zhí)行失敗了,就會出現(xiàn)數(shù)據(jù)前后不一致。
因此,在執(zhí)行多條有關(guān)聯(lián) SQL 語句時, 事務(wù) 可能會要求這些 SQL 語句要么同時執(zhí)行成功,要么就都執(zhí)行失敗。
在 MySQL 中,事務(wù)的 自動提交 狀態(tài)默認(rèn)是開啟的。
自動提交的作用 :當(dāng)我們執(zhí)行一條 SQL 語句的時候,其產(chǎn)生的效果就會立即體現(xiàn)出來,且不能 回滾 。
什么是回滾?舉個例子:
可以看到,在執(zhí)行插入語句后數(shù)據(jù)立刻生效,原因是 MySQL 中的事務(wù)自動將它 提交 到了數(shù)據(jù)庫中。那么所謂 回滾 的意思就是,撤銷執(zhí)行過的所有 SQL 語句,使其回滾到 最后一次提交 數(shù)據(jù)時的狀態(tài)。
在 MySQL 中使用 ROLLBACK 執(zhí)行回滾:
由于所有執(zhí)行過的 SQL 語句都已經(jīng)被提交過了,所以數(shù)據(jù)并沒有發(fā)生回滾。那如何讓數(shù)據(jù)可以發(fā)生回滾?
將自動提交關(guān)閉后,測試數(shù)據(jù)回滾:
那如何將虛擬的數(shù)據(jù)真正提交到數(shù)據(jù)庫中?使用 COMMIT :
事務(wù)的實際應(yīng)用 ,讓我們再回到銀行轉(zhuǎn)賬項目:
這時假設(shè)在轉(zhuǎn)賬時發(fā)生了意外,就可以使用 ROLLBACK 回滾到最后一次提交的狀態(tài):
這時我們又回到了發(fā)生意外之前的狀態(tài),也就是說,事務(wù)給我們提供了一個可以反悔的機(jī)會。假設(shè)數(shù)據(jù)沒有發(fā)生意外,這時可以手動將數(shù)據(jù)真正提交到數(shù)據(jù)表中:COMMIT 。
事務(wù)的默認(rèn)提交被開啟 ( @@AUTOCOMMIT = 1 ) 后,此時就不能使用事務(wù)回滾了。但是我們還可以手動開啟一個事務(wù)處理事件,使其可以發(fā)生回滾:
仍然使用 COMMIT 提交數(shù)據(jù),提交后無法再發(fā)生本次事務(wù)的回滾。
事務(wù)的四大特征:
事務(wù)的隔離性可分為四種 ( 性能從低到高 ) :
查看當(dāng)前數(shù)據(jù)庫的默認(rèn)隔離級別:
修改隔離級別:
測試 READ UNCOMMITTED ( 讀取未提交 ) 的隔離性:
由于小明的轉(zhuǎn)賬是在新開啟的事務(wù)上進(jìn)行操作的,而該操作的結(jié)果是可以被其他事務(wù)(另一方的淘寶店)看見的,因此淘寶店的查詢結(jié)果是正確的,淘寶店確認(rèn)到賬。但就在這時,如果小明在它所處的事務(wù)上又執(zhí)行了 ROLLBACK 命令,會發(fā)生什么?
這就是所謂的 臟讀 ,一個事務(wù)讀取到另外一個事務(wù)還未提交的數(shù)據(jù)。這在實際開發(fā)中是不允許出現(xiàn)的。
把隔離級別設(shè)置為 READ COMMITTED :
這樣,再有新的事務(wù)連接進(jìn)來時,它們就只能查詢到已經(jīng)提交過的事務(wù)數(shù)據(jù)了。但是對于當(dāng)前事務(wù)來說,它們看到的還是未提交的數(shù)據(jù),例如:
但是這樣還有問題,那就是假設(shè)一個事務(wù)在操作數(shù)據(jù)時,其他事務(wù)干擾了這個事務(wù)的數(shù)據(jù)。例如:
雖然 READ COMMITTED 讓我們只能讀取到其他事務(wù)已經(jīng)提交的數(shù)據(jù),但還是會出現(xiàn)問題,就是 在讀取同一個表的數(shù)據(jù)時,可能會發(fā)生前后不一致的情況。* 這被稱為* 不可重復(fù)讀現(xiàn)象 ( READ COMMITTED ) 。
將隔離級別設(shè)置為 REPEATABLE READ ( 可被重復(fù)讀取 ) :
測試 REPEATABLE READ ,假設(shè)在兩個不同的連接上分別執(zhí)行 START TRANSACTION :
當(dāng)前事務(wù)開啟后,沒提交之前,查詢不到,提交后可以被查詢到。但是,在提交之前其他事務(wù)被開啟了,那么在這條事務(wù)線上,就不會查詢到當(dāng)前有操作事務(wù)的連接。相當(dāng)于開辟出一條單獨的線程。
無論小張是否執(zhí)行過 COMMIT ,在小王這邊,都不會查詢到小張的事務(wù)記錄,而是只會查詢到自己所處事務(wù)的記錄:
這是 因為小王在此之前開啟了一個新的事務(wù) ( START TRANSACTION ) * ,那么* 在他的這條新事務(wù)的線上,跟其他事務(wù)是沒有聯(lián)系的 ,也就是說,此時如果其他事務(wù)正在操作數(shù)據(jù),它是不知道的。
然而事實是,在真實的數(shù)據(jù)表中,小張已經(jīng)插入了一條數(shù)據(jù)。但是小王此時并不知道,也插入了同一條數(shù)據(jù),會發(fā)生什么呢?
報錯了,操作被告知已存在主鍵為 6 的字段。這種現(xiàn)象也被稱為 幻讀,一個事務(wù)提交的數(shù)據(jù),不能被其他事務(wù)讀取到 。
顧名思義,就是所有事務(wù)的 寫入操作 全都是串行化的。什么意思?把隔離級別修改成 SERIALIZABLE :
還是拿小張和小王來舉例:
此時會發(fā)生什么呢?由于現(xiàn)在的隔離級別是 SERIALIZABLE ( 串行化 ) ,串行化的意思就是:假設(shè)把所有的事務(wù)都放在一個串行的隊列中,那么所有的事務(wù)都會按照 固定順序執(zhí)行 ,執(zhí)行完一個事務(wù)后再繼續(xù)執(zhí)行下一個事務(wù)的 寫入操作 ( 這意味著隊列中同時只能執(zhí)行一個事務(wù)的寫入操作 ) 。
根據(jù)這個解釋,小王在插入數(shù)據(jù)時,會出現(xiàn)等待狀態(tài),直到小張執(zhí)行 COMMIT 結(jié)束它所處的事務(wù),或者出現(xiàn)等待超時。
轉(zhuǎn)載:
就是關(guān)閉自動提交,插入的數(shù)據(jù)暫不寫進(jìn)數(shù)據(jù)庫,保留到臨時區(qū)域,然后在提交
MySQL 事務(wù)
什么是事務(wù)?
MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。比如說,在人員管理系統(tǒng)中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構(gòu)成一個事務(wù)!
在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)。
事務(wù)處理可以用來維護(hù)數(shù)據(jù)庫的完整性,保證成批的 SQL 語句要么全部執(zhí)行,要么全部不執(zhí)行。
事務(wù)用來管理 insert,update,delete 語句
一般來說,事務(wù)是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
原子性:一個事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。
一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預(yù)定的工作。
隔離性:數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。
持久性:事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。
在 MySQL 命令行的默認(rèn)設(shè)置下,事務(wù)都是自動提交的,即執(zhí)行 SQL 語句后就會馬上執(zhí)行 COMMIT 操作。因此要顯式地開啟一個事務(wù)務(wù)須使用命令 BEGIN 或 START TRANSACTION,或者執(zhí)行命令 SET AUTOCOMMIT=0,用來禁止使用當(dāng)前會話的自動提交。
from 樹懶學(xué)堂 - 一站式數(shù)據(jù)知識平臺