大家對mysql數據庫有多少了解?當前大量的網站使用php語言,那么對應的就是mysql數據庫,這里就為大家分享一下mysql數據庫的相關知識,希望能幫助到大家。
目錄
-
一、數據庫概要
-
1.4.1. 什么是范式
-
1.4.2. 三大范式
-
1.4.3. 范式與效率
-
1.3.1、關系型數據庫
-
1.3.2、非關系型數據庫
-
1.1.1、人工處理階段
-
1.1.2、文件系統
-
1.1.3、數據庫管理系統
-
1.1、發展歷史
-
1.2、常見數據庫技術品牌、服務與架構
-
1.3、數據庫分類
-
1.4、數據庫規范化
-
二、MySQL介紹
-
2.1、MySQL概要
-
2.2、系統特性
-
2.3、存儲引擎
-
三、快速安裝運行MySQL數據庫
-
3.1.1、設置mysql遠程訪問
-
3.1.2、修改mysql用戶密碼
-
3.1.2、安裝服務
-
3.1、使用綠色版
-
3.2、使用安裝版
-
四、使用GUI操作MySQL
-
4.5.1、添加數據
-
4.5.2、刪除數據
-
4.5.3、修改表結構
-
4.5.4、外鍵
-
4.5.5、唯一鍵
-
4.1、關系型數據庫的典型概念
-
4.2、登錄數據庫
-
4.3、創建數據庫
-
4.4、創建表
-
4.5、管理數據
-
4.6、上機練習
-
五、使用SQL訪問MySQL數據庫
-
5.5.1、添加列
-
5.5.2、修改列
-
5.5.3、刪除列
-
5.5.4、重命名表
-
5.5.5、刪除表
-
5.5.6、刪除數據庫
-
5.5.7、一千行MySQL筆記
-
5.5.8、常用的SQL
-
5.2.1、表達式與條件查詢
-
5.2.2、聚合函數
-
5.0.1、新建數據庫
-
5.0.2、新建表
-
5.0.3、新建查詢
-
5.0、定義學生表Stu
-
5.1、增加數據
-
5.2、查詢數據
-
5.3、刪除數據
-
5.4、更新數據
-
5.5、修改表
-
六、下載程序、幫助、視頻
隨著移動互聯網的結束與人工智能的到來大數據變成越來越重要,下一個成功者應該是擁有海量數據的,數據與數據庫你應該知道。
一、數據庫概要
數據庫(database)是存儲與管理數據的軟件系統,就像一個存入數據的物流倉庫。
在商業領域,信息就意味著商機,取得信息的一個非常重要的途徑就是對數據進行分析處理,這就催生了各種專業的數據管理軟件,數據庫就是其中的一種。當然,數據庫管理系統也不是一下子就建立起來,它也是經過了不斷的豐富和發展,才有了今天的模樣。
1.1、發展歷史
1.1.1、人工處理階段
在20世紀50年代中期以前的計算機誕生初期,其處理能力很有限,只能夠完成一些簡單的運算,數據處理能力也很有限,這使得當時的計算機只能夠用于科學和工程計算。計算機上沒有專用的管理數據的軟件,數據由計算機或處理它的程序自行攜帶。當數據的存儲格式、讀寫路徑或方法發生變化的時候,其處理程序也必須要做出相應的改變以保持程序的正確性。
1.1.2、文件系統
20世紀50年代后期到60年代中期,隨著硬件和軟件技術的發展,計算機不僅用于科學計算,還大量用于商業管理中。在這一時期,數據和程序在存儲位置上已經完全分開,數據被單獨組織成文件保存到外部存儲設備上,這樣數據文件就可以為多個不同的程序在不同的時間所使用。
雖然程序和數據在存儲位置上分開了,而且操作系統也可以幫助我們對完成了數據的存儲位置和存取路徑的管理,但是程序設計仍然受到數據存儲格式和方法的影響,不能夠完全獨立于數據,而且數據的冗余較大。
1.1.3、數據庫管理系統
從20世紀70年代以來,計算機軟硬件技術取得了飛躍式的發展,這一時期最主要的發展就是產生了真正意義上的數據庫管理系統,它使得應用程序和數據之間真正的實現的接口統一、數據共享等,這樣應用程序都可以按照統一的方式直接操作數據,也就是應用程序和數據都具有了高度的獨立性。
1.2、常見數據庫技術品牌、服務與架構
發展了這么多年市場上出現了許多的數據庫系統,最強的個人認為是oracle,當然還有許多如:DB2、microsoft SQL Server、MySQL、SyBase等,下圖列出常見數據庫技術品牌、服務與架構。
1.3、數據庫分類
數據庫通常分為層次式數據庫、網絡式數據庫和關系式數據庫三種。
而不同的數據庫是按不同的數據結構來聯系和組織的。
而在當今的互聯網中,最常見的數據庫模型主要是兩種,即關系型數據庫和非關系型數據庫。
1.3.1、關系型數據庫
當前在成熟應用且服務與各種系統的主力數據庫還是關系型數據庫。
代表:Oracle、SQL Server、MySQL
1.3.2、非關系型數據庫
隨著時代的進步與發展的需要,非關系型數據庫應運而生。
代表:redis、Mongodb
NoSQL數據庫在存儲速度與靈活性方面有優勢,也常用于緩存。
1.4、數據庫規范化
經過一系列的步驟,我們現在終于將客戶的需求轉換為數據表并確立這些表之間的關系,那么是否我們現在就可以在開發中使用呢?答案否定的,為什么呢!同一個項目,很多人參與了需求的分析,數據庫的設計,不同的人具有不同的想法,不同的部門具有不同的業務需求,我們以此設計的數據庫將不可避免的包含大量相同的數據,在結構上也有可能產生沖突,在開發中造成不便。
1.4.1. 什么是范式
要設計規范化的數據庫,就要求我們根據數據庫設計范式――也就是數據庫設計的規范原則來做。范式可以指導我們更好地設計數據庫的表結構,減少冗余的數據,借此可以提高數據庫的存儲效率,數據完整性和可擴展性。
設計關系數據庫時,遵從不同的規范要求,設計出合理的關系型數據庫,這些不同的規范要求被稱為不同的范式,各種范式呈遞次規范,越高的范式數據庫冗余越小。目前關系數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎上進一步滿足更多規范要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數據庫只需滿足第三范式(3NF)就行了。
1.4.2. 三大范式
第一范式(1NF)
所謂第一范式(1NF)是指在關系模型中,對列添加的一個規范要求,所有的列都應該是原子性的,即數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一范式就是無重復的域。
例如:表1-1中,其中”工程地址”列還可以細分為省份,城市等。在國外,更多的程序把”姓名”列也分成2列,即”姓”和“名”。
雖然第一范式要求各列要保存原子性,不能再分,但是這種要求和我們的需求是相關聯的,如上表中我們對”工程地址”沒有省份,城市這樣方面的查詢和應用需求,則不需拆分,”姓名”列也是同樣如此。
表1-1 原始表
工程號 |
工程名稱 |
工程地址 |
員工編號 |
員工名稱 |
薪資待遇 |
職務 |
P001 |
港珠澳大橋 |
廣東珠海 |
E0001 |
Jack |
6000/月 |
工人 |
P001 |
港珠澳大橋 |
廣東珠海 |
E0002 |
Join |
7800/月 |
工人 |
P001 |
港珠澳大橋 |
廣東珠海 |
E0003 |
Apple |
8000/月 |
高級技工 |
P002 |
南海航天 |
海南三亞 |
E0001 |
Jack |
5000/月 |
工人 |
第二范式(2NF)
在1NF的基礎上,非Key屬性必須完全依賴于主鍵。第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數據庫表中的每個實例或記錄必須可以被唯一地區分。選取一個能區分每個實體的屬性或屬性組,作為實體的唯一標識。
第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二范式就是在第一范式的基礎上屬性完全依賴于主鍵。
例如:表1-1中,一個表描述了工程信息,員工信息等。這樣就造成了大量數據的重復。按照第二范式,我們可以將表1-1拆分成表1-2和表1-3:
l 工程信息表:(工程編號,工程名稱,工程地址):
表1-2 工程信息表
工程編號 |
工程名稱 |
工程地址 |
P001 |
港珠澳大橋 |
廣東珠海 |
P002 |
南海航天 |
海南三亞 |
l 員工信息表(員工編號,員工名稱,職務,薪資水平):
表1-3 員工信息表
員工編號 |
員工姓名 |
職務 |
薪資水平 |
E0001 |
Jack |
工人 |
3000/月 |
E0002 |
Join |
工人 |
3000/月 |
E0003 |
Apple |
高級技工 |
6000/月 |
這樣,表1-1就變成了兩張表,每個表只描述一件事,清晰明了。
第三范式(3NF)
第三范式是在第二范式基礎上,更進一層,第三范式的目標就是確保表中各列與主鍵列直接相關,而不是間接相關。即各列與主鍵列都是一種直接依賴關系,則滿足第三范式。
第三范式要求各列與主鍵列直接相關,我們可以這樣理解,假設張三是李四的兵,王五則是張三的兵,這時王五是不是李四的兵呢?從這個關系中我們可以看出,王五也是李四的兵,因為王五依賴于張三,而張三是李四的兵,所以王五也是。這中間就存在一種間接依賴的關系而非我們第三范式中強調的直接依賴。
現在我們來看看在第二范式的講解中,我們將表1-1拆分成了兩張表。這兩個表是否符合第三范式呢。在員工信息表中包含:”員工編號”、”員工名稱”、”職務”、”薪資水平”,而我們知道,薪資水平是有職務決定,這里”薪資水平”通過”職務”與員工相關,則不符合第三范式。我們需要將員工信息表進一步拆分,如下:
l 員工信息表:員工編號,員工名稱,職務
l 職務表:職務編號,職務名稱,薪資水平
現在我們已經了解了數據庫規范化設計的三大范式,下面我們再來看看對表1-1優化后的數據表:
員工信息表(Employee)
員工編號 |
員工姓名 |
職務編號 |
E0001 |
Jack |
1 |
E0002 |
Join |
1 |
E0003 |
Apple |
2 |
工程信息表(ProjectInfo)
工程編號 |
工程名稱 |
工程地址 |
P001 |
港珠澳大橋 |
廣東珠海 |
P002 |
南海航天 |
海南三亞 |
職務表(Duty)
職務編號 |
職務名稱 |
工資待遇 |
1 |
工人 |
3000/月 |
2 |
高級技工 |
6000/月 |
工程參與人員記錄表(Project_ Employee_info)
編號 |
工程編號 |
人員編號 |
1 |
P001 |
E0001 |
2 |
P001 |
E0002 |
3 |
P002 |
E0003 |
通過對比我們發現,表多了,關系復雜了,查詢數據變的麻煩了,編程中的難度也提高了,但是各個表中內容更清晰了,重復的數據少了,更新和維護變的更容易了,哪么如何平衡這種矛盾呢?
1.4.3. 范式與效率
在我們設計數據庫時,設計人員、客戶、開發人員通常對數據庫的設計有一定的矛盾,客戶更喜歡方便,清晰的結果,開發人員也希望數據庫關系比較簡單,降低開發難度,而設計人員則需要應用三大范式對數據庫進行嚴格規范化,減少數據冗余,提高數據庫可維護性和擴展性。由此可以看出,為了滿足三大范式,我們數據庫設計將會與客戶、開發人員產生分歧,所以在實際的數據庫設計中,我們不能一味的追求規范化,既要考慮三大范式,減少數據冗余和各種數據庫操作異常,又要充分考慮到數據庫的性能問題,允許適當的數據庫冗余。
二、MySQL介紹
2.1、MySQL概要
MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬于 Oracle 旗下產品。MySQL 是最流行的關系型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關系數據庫管理系統) 應用軟件之一。
MySQL是一種關系數據庫管理系統,關系數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數據庫的最常用標準化語言。MySQL 軟件采用了雙授權政策,分為社區版和商業版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站數據庫。
MySQL官網:https://www.mysql.com/
MySQL下載:https://www.mysql.com/downloads/
2.2、系統特性
1.使用 C和 C++編寫,并使用了多種編譯器進行測試,保證了源代碼的可移植性。
2.支持 AIX、FreeBSD、HP-ux、linux、Mac OS、Novel.netware、OpenBSD、OS/2 Wrap、Solaris、windows等多種操作系統。
3.為多種編程語言提供了 API。這些編程語言包括 C、C++、python、Java、perl、PHP、Eiffel、ruby,.NET和 Tcl 等。
5.優化的 SQL查詢算法,有效地提高查詢速度。
6.既能夠作為一個單獨的應用程序應用在客戶端服務器網絡環境中,也能夠作為一個庫而嵌入到其他的軟件中。
7.提供多語言支持,常見的編碼如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作數據表名和數據列名。
8.提供 TCP/IP、ODBC 和 JDBC等多種數據庫連接途徑。
9.提供用于管理、檢查、優化數據庫操作的管理工具。
10.支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
11.支持多種存儲引擎。
12.MySQL 是開源的,所以你不需要支付額外的費用。
13.MySQL 使用標準的 SQL數據語言形式。
14.MySQL 對 PHP 有很好的支持,PHP是目前最流行的 Web 開發語言。
15.MySQL是可以定制的,采用了 GPL協議,你可以修改源碼來開發自己的 MySQL 系統。
16.在線 DDL/更改功能,數據架構支持動態應用程序和開發人員靈活性(5.6新增)
17.復制全局事務標識,可支持自我修復式集群(5.6新增)
18.復制無崩潰從機,可提高可用性(5.6新增)
19.復制多線程從機,可提高性能(5.6新增)
20.3倍更快的性能(5.7新增)
21.新的優化器(5.7新增)
22.原生json支持(5.7新增)
23.多源復制(5.7新增)
24.GIS的空間擴展(5.7新增)
2.3、存儲引擎
MySQL數據庫根據應用的需要準備了不同的引擎,不同的引擎側重點不一樣,區別如下:
MyISAM MySQL 5.0 之前的默認數據庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務
InnoDB 事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定, MySQL 5.5 起成為默認數據庫引擎
BDB源 自 Berkeley DB,事務型數據庫的另一種選擇,支持Commit 和Rollback 等其他事務特性
Memory 所有數據置于內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數據量成正比的內存空間。并且其內容會在 MySQL 重新啟動時丟失
Merge 將一定數量的 MyISAM 表聯合而成一個整體,在超大規模數據存儲時很有用
Archive 非常適合存儲大量的獨立的,作為歷史記錄的數據。因為它們不經常被讀取。Archive 擁有高效的插入速度,但其對查詢的支持相對較差
Federated 將不同的 MySQL 服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分布式應用
Cluster/NDB 高冗余的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用
CSV 邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄里為每個數據表創建一個 .csv 文件。這是一種普通文本文件,每個數據行占用一個文本行。CSV 存儲引擎不支持索引。
BlackHole 黑洞引擎,寫入的任何數據都會消失,一般用于記錄 binlog 做復制的中繼
EXAMPLE 存儲引擎是一個不做任何事情的存根引擎。它的目的是作為 MySQL 源代碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發者。EXAMPLE 存儲引擎不支持編索引。
另外,MySQL 的存儲引擎接口定義良好。有興趣的開發者可以通過閱讀文檔編寫自己的存儲引擎。
三、快速安裝運行MySQL數據庫
MySQL以前一直是開源免費的,被Oracle收購后有些變化:以前的版本都是免費的,社區版按GPL協議開源免費,商業版提供更加豐富的功能,但收費。
社區版的下載地址:https://dev.mysql.com/downloads/ (免費)
企業版的下載地址:https://www.mysql.com/downloads/(收費)
3.1、使用綠色版
為了方便快捷的使用MySQL我已經準備好了一個綠化了的MySQL,解壓后就可以直接使用,不需要任何配置。
下載地址1:https://pan.baidu.com/s/1hrS5KUw 密碼: sug9
下載地址2:http://www.jb51.net/softs/594937.html
下載后直接解壓:
點擊啟動PStart.exe這是一個自定義菜單的小工具,為了整理資源用的。
里面有兩個MySQL的綠色版軟件5.0,5.5
navicat for MySQL是一個數據庫客戶端管理工具
點擊啟動PStart.exe后的結果如下:
點擊啟動MySQL服務,運行Navicat for MySQL即可。
*注意:上面的PStart只是一個整理文檔資料的工具,并非必要,如果啟動時有錯誤或為空時,可以直接關閉,直接啟動MySQL服務,如:
mysql_start.bat用于啟動MySql數據庫,mysql_stop.bat用于關閉MySql數據庫。
開發工具的啟動方式也一樣,如下所示:
navicat.exe用于啟動Navicat數據庫客戶端,最好發送快捷方式到桌面,省去每次打開文件夾的麻煩。
3.1.1、設置mysql遠程訪問
執行mysql 命令進入mysql 命令模式,執行如下SQL代碼
mysql>?use?mysql;? mysql>?GRANT?ALL?ON?*.*?TO?admin@'%'?IDENTIFIED?BY?'admin'?WITH?GRANT?OPTION;
#這句話的意思 ,允許任何IP地址(上面的 % 就是這個意思)的電腦 用admin帳戶 和密碼(admin)來訪問這個MySQL Server
#必須加類似這樣的帳戶,才可以遠程登陸。 root帳戶是無法遠程登陸的,只可以本地登陸
3.1.2、修改mysql用戶密碼
1.mysqladmin命令
格式如下(其中,USER為用戶名,PASSWORD為新密碼):
mysqladmin -u USER -p password PASSWORD
該命令之后會提示輸入原密碼,輸入正確后即可修改。
例如,設置root用戶的密碼為123456,則
mysqladmin -u root -p password 123456
2.UPdate user 語句
這種方式必須是先用root帳戶登入mysql,然后執行:
UPDATE?user?SET?password=PASSWORD('123456')?WHERE?user='root';FLUSH?PRIVILEGES;
3.SET PASSWORD 語句
這種方式也需要先用root命令登入mysql,然后執行:
SET PASSWORD FOR root=PASSWORD(‘123456’);
4.root密碼丟失的情況
使用 MySQL 自帶的一個工具”MySQL GUI Tools”,我一直用的是5.0版本的。 在安裝目錄中運行一個程序 MySQLSystemTrayMonitor.exe,運行完后在系統托盤會出現圖標。如果MySQL服務尚未安裝,則不會出現,可先通過Action>Manage MySQL Instances 先配置和安裝服務。如果已經安裝服務,鼠標右鍵點擊后,會出現”Configure Instance”的菜單。點擊后出現如下MySQL Administrator窗口:
假如原來的服務配置都正常的情況下,選中左側列表中的“啟動變量”,并在相應的右側標簽中選擇“安全”,勾選“禁用grant表”,然后“應用更改”。
并回到左側的“服務器控制”,和右側相應的“開始/停止服務”標簽,點擊啟動服務。此時,連接mysql已經不需要用戶名和密碼了,你可以修改root密碼。
3.1.2、安裝服務
首先我們先進入mysql的安裝目錄下的bin目錄、之后打開DOS命令窗口,進入該目錄下(一定要進入該目錄,否則操作錯誤)
執行DOS命令:
輸入命令:mysqld –install,之后出現如下界面。提示安裝服務成功。
注意是mysqld –install不是mysql –install
如果要卸載服務,可以輸入如下命令:mysqld –remove。出現如下界面。提示移除服務成功。
3.2、使用安裝版
MySQL5.5.27_64位安裝包下載地址1: https://pan.baidu.com/s/1minwz1m 密碼: ispn
MySQL5.5.56_64位安裝包下載地址2: http://www.jb51.net/softs/363920.html
MySQL5.7.17安裝包官網下載地址: https://dev.mysql.com/downloads/windows/installer/
選擇自定義:
安裝的組件信息:
服務器軟件目錄:
數據目錄:
點擊install安裝即可:
配置:
機器類型
是否支持事務功能:
innodb表空間:
連接數量:
字符集設定:
配置windows管理相關:
配置安全選項,設置管理員的用戶名與密碼:
最后執行配置即可:
配置后,會啟動服務。
新版的MySQL安裝包大了很多,安裝過程也有些不一樣。
四、使用GUI操作MySQL4.1、關系型數據庫的典型概念
數據庫 databse:數據的倉庫
表 table:數據是保存在表內,保存在一個表內的數據,應該具有相同的數據格式
行:行用于記錄數據
記錄:行內的數據
列:列用于規定數據格式
字段:數據的某個列
SQL:用來管理數據的語言。結構化查詢語言(SQL,Structured Query Language)
主鍵:唯一地標識表中的某一條記錄,不能空,不能重復
4.2、登錄數據庫
*連接本地數據庫時需要啟動服務
4.3、創建數據庫
?
4.4、創建表
列的類型:
整數: tinyint、smallint、mediumint、int、bigint
浮點數: Float、double、real、decimal
日期和時間: date、time、datetime、timestamp、year
字符串類型
字符串: char、varchar
文本: tinytext、text、mediumtext、longtext
二進制(可用來存儲圖片、音樂等): tinyblob、blob、mediumblob、longblob
列的約束:
4.5、管理數據4.5.1、添加數據
雙擊新建好的表名,打開表,就可以添加數據了。
4.5.2、刪除數據
4.5.3、修改表結構
如果想向現有的表中添加一列,則可以修改表結構:
4.5.4、外鍵
上面這個學生表是有些問題的:
a)、不便于修改,比如教室換成了305教室,則每個學員都要修改
b)、數據冗余,大量的重復數據
將表拆分成兩個,分解后問題解決,如下圖所示:
這里的班級編號就是外鍵,可以空,但不為空時他的值一定在要引用表中存在。如果學生表中的編號是主鍵這里就不應該重復,外鍵則可以重復也允許為空。
添加外鍵:
班級表:
學生表:
添加外鍵:
刪除與更新時可以實現級聯更新與刪除,當更新設置為CASCADE時主鍵變化引用主鍵的表也會一起變化,當刪除設置為CASCADE時刪除主鍵表,引用的記錄都將被刪除。
4.5.5、唯一鍵
唯一鍵,也稱(唯一約束),和主鍵的區別是可以為有多個唯一鍵并且值可以為NULL,但NULL也不能重復,也就是說只能有一行的值為NULL。它會隱式的創建唯一索引。
設置方法:索引 –> 添加索引 –> ?欄位名 添加你想設置唯一約束的列 –> 索引類型選擇 Unique?
#查詢 select?id,name?from?yuangong select?*?from?yuangong select?*?from?yuangong?where?salary>5000 #增加 INSERT?into?yuangong(name,salary,bumenId,mobile)?value('張為劍',2190.6,2,19889007867); INSERT?into?yuangong(name,salary,bumenId,mobile)?value('張娜拉',9871.6,1,19889007777); #修改 update?yuangong?set?salary=salary+1?where?id=7 #刪除 INSERT?into?yuangong(name,salary,bumenId,mobile)?value('張拉拉',9871.6,1,19889007777); delete?from?yuangong?where?id=8
4.6、上機練習
1、請創建一個新的數據庫叫HR,在HR數據庫中添加EMP表,EMP表的表結構如下所示
EMP表:員工信息
№ |
名稱 |
類型 |
描述 |
1 |
EMPNO |
int |
雇員的編號,主鍵,自動增長 |
2 |
ENAME |
VARCHAR(10) |
雇員的姓名,由10位字符所組成,不為空,唯一鍵 |
3 |
JOB |
VARCHAR(9) |
雇員的職位 |
4 |
MGR |
int |
雇員對應的領導編號,領導也是雇員,可空(可刪除這一列) |
5 |
HIREDATE |
TimeStamp |
雇員的雇傭日期,默認為當前日期 |
6 |
SAL |
Numeric(7,2) |
基本工資,其中有兩位小數,五位整數,一共是七位 |
7 |
COMM |
Numeric(7,2) |
獎金,傭金 |
8 |
DEPTNO |
int |
雇員所在的部門編號,可空,外鍵fk_deptno |
9 |
DETAIL |
Text |
備注,可空 |
Dept:部門表
№ |
名稱 |
類型 |
描述 |
1 |
DeptNO |
int |
部門的編號,主鍵,自動增長 |
2 |
DNAME |
VARCHAR(10) |
部門名,由50位字符所組成,不為空,唯一鍵 |
3 |
DTel |
VARCHAR(10) |
電話,可空 |
2、根據上面的表結構完成表的創建,表名為emp
3、在表中添加5條以上的數據
4、完成下列查詢要求
4.1查詢所有員工信息
4.2查詢所有工資介于2000-5000間的員工姓名、職位與工資
4.3查詢所有姓“張”的員工
4.4 按工資降序查詢出2014年到2015年間入職的員工
4.5、將工資普遍上調20%
4.6、將工資低于3000元的員工獎金修改為工資的2.8倍
4.7、刪除編號為5或者姓“王”的員工
五、使用SQL訪問MySQL數據庫
5.0、定義學生表Stu
(id編號,name姓名,sex性別,age年齡,…)
5.0.1、新建數據庫
5.0.2、新建表
5.0.3、新建查詢
5.1、增加數據
insert 語句可以用來將一行或多行數據插到數據庫表中, 使用的一般形式如下:
Insert into 表名(字段列表) values (值列表);
insert [into] 表名 [(列名1, 列名2, 列名3, …)] values (值1, 值2, 值3, …);
insert into students values(NULL, “張三”, “男”, 20, “18889009876”);
有時我們只需要插入部分數據, 或者不按照列的順序進行插入, 可以使用這樣的形式進行插入:
insert into students (name, sex, age) values(“李四”, “女”, 21);
#1、添加數據 insert?into?stu(name,sex,age)?values('張學友','男',18); insert?into?stu(name,sex,age)?values('張娜拉','女',73); insert?into?stu(name,sex,age)?values('張家輝','男',23); insert?into?stu(name,sex,age)?values('張匯美','女',85); insert?into?stu(name,sex,age)?values('張鐵林','男',35);
5.2、查詢數據
select 語句常用來根據一定的查詢規則到數據庫中獲取數據, 其基本的用法為:
select 字段名 from 表名稱 [查詢條件];
查詢學生表中的所有信息:select * from students;
查詢學生表中所有的name與age信息:select name, age from students;
也可以使用通配符 * 查詢表中所有的內容, 語句: select * from students;
#1、添加數據 insert?into?stu(name,sex,age)?values('張學友','男',18); insert?into?stu(name,sex,age)?values('張娜拉','女',73); insert?into?stu(name,sex,age)?values('張家輝','男',23); insert?into?stu(name,sex,age)?values('張匯美','女',85); insert?into?stu(name,sex,age)?values('張鐵林','男',35); insert?into?stu(name,sex,age)?values('張國立','男',99); #2、查詢數據 #2.1、查詢所有學生 select?id,name,sex,age?from?stu; #2.2、查詢年齡大于80歲女學生 select?id,name,sex,age?from?stu?where?age>80?and?sex='女';
結果:
5.2.1、表達式與條件查詢
where 關鍵詞用于指定查詢條件, 用法形式為: select 列名稱 from 表名稱 where 條件;
以查詢所有性別為女的信息為例, 輸入查詢語句: select * from students where sex=”女”;
where 子句不僅僅支持 “where 列名 = 值” 這種名等于值的查詢形式, 對一般的比較運算的運算符都是支持的, 例如 =、>、=、
示例:
查詢年齡在21歲以上的所有人信息: select * from students where age > 21;
查詢名字中帶有 “王” 字的所有人信息: select * from students where name like “%王%”;
查詢id小于5且年齡大于20的所有人信息: select * from students where id20;
5.2.2、聚合函數
獲得學生總人數:select count(*) from students
獲得學生平均分:select avg(mark) from students
獲得最高成績:select max(mark) from students
獲得最低成績:select min(mark) from students
獲得學生總成績:select sum(mark) from students
5.3、刪除數據
delete from 表名 [刪除條件];
刪除表中所有數據:delete from students;
刪除id為10的行: delete from students where id=10;
刪除所有年齡小于88歲的數據: delete from students where age
#1、添加數據----- insert?into?stu(name,sex,age)?values('張學友','男',18); insert?into?stu(name,sex,age)?values('張娜拉','女',73); insert?into?stu(name,sex,age)?values('張家輝','男',23); insert?into?stu(name,sex,age)?values('張匯美','女',85); insert?into?stu(name,sex,age)?values('張鐵林','男',35); insert?into?stu(name,sex,age)?values('張國立','男',99); #2、查詢數據----- #2.1、查詢所有學生 select?id,name,sex,age?from?stu; #2.2、查詢年齡大于80歲女學生 select?id,name,sex,age?from?stu?where?age>80?and?sex='女'; #2.3、查詢平均年齡 select?AVG(age)?from?stu?where?sex='女'; #3、修改數據----- #3.1、將編號為1的學生年齡加大1歲 update?stu?set?age=age+1?where?id=1; #3.2、將80歲以上的女學生年齡修改為90歲且將姓名后增加“老人” #CONCAT(str1,str2,...)?連接字符串 update?stu?set?age=90,name=CONCAT(name,'(老人)')?where?age>=80?and?sex='女'; #3.3、將編號4的學生名字修改為張匯美 update?stu?set?name='張匯美'?where?id=4; #4、刪除數據----- #4.1、刪除年齡大于70歲的學生 delete?from?stu?where?age>70; #4.2、刪除所有學生 delete?from?stu;
5.4、更新數據
update 語句可用來修改表中的數據, 基本的使用形式為:
update 表名稱 set 列名稱=新值 where 更新條件;
Update 表名 set 字段=值 列表 更新條件
使用示例:
將id為5的手機號改為默認的”-“: update students set tel=default where id=5;
將所有人的年齡增加1: update students set age=age+1;
將手機號為 13723887766 的姓名改為 “張果”, 年齡改為 19: update students set name=”張果”, age=19 where tel=”13723887766″;
5.5、修改表
alter table 語句用于創建后對表的修改, 基礎用法如下:
5.5.1、添加列
基本形式: alter table 表名 add 列名 列數據類型 [after 插入位置];
示例:
在表的最后追加列 address: alter table students add address char(60);
在名為 age 的列后插入列 birthday: alter table students add birthday date after age;
5.5.2、修改列
基本形式: alter table 表名 change 列名稱 列新名稱 新數據類型;
示例:
將表 tel 列改名為 phone: alter table students change tel phone char(12) default “-“;
將 name 列的數據類型改為 char(9): alter table students change name name char(9) not null;
5.5.3、刪除列
基本形式: alter table 表名 drop 列名稱;
示例:
刪除 age 列: alter table students drop age;
5.5.4、重命名表
基本形式: alter table 表名 rename 新表名;
示例:
重命名 students 表為temp: alter table students rename temp;
5.5.5、刪除表
基本形式: drop table 表名;
示例: 刪除students表: drop table students;
5.5.6、刪除數據庫
基本形式: drop database 數據庫名;
示例: 刪除lcoa數據庫: drop database lcoa;
5.5.7、一千行MySQL筆記
/*?啟動MySQL?*/ net?start?mysql /*?連接與斷開服務器?*/ mysql?-h?地址?-P?端口?-u?用戶名?-p?密碼 /*?跳過權限驗證登錄MySQL?*/ mysqld?--skip-grant-tables --?修改root密碼 密碼加密函數password() update?mysql.user?set?password=password('root'); SHOW?PROCESSLIST?--?顯示哪些線程正在運行 SHOW?VARIABLES?--? /*?數據庫操作?*/?------------------ --?查看當前數據庫 ?select?database(); --?顯示當前時間、用戶名、數據庫版本 ?select?now(),?user(),?version(); --?創建庫 ?create?database[?if?not?exists]?數據庫名?數據庫選項 ?數據庫選項: ??CHARACTER?SET?charset_name ??COLLATE?collation_name --?查看已有庫 ?show?databases[?like?'pattern'] --?查看當前庫信息 ?show?create?database?數據庫名 --?修改庫的選項信息 ?alter?database?庫名?選項信息 --?刪除庫 ?drop?database[?if?exists]?數據庫名 ??同時刪除該數據庫相關的目錄及其目錄內容 /*?表的操作?*/?------------------ --?創建表 ?create?[temporary]?table[?if?not?exists]?[庫名.]表名?(?表的結構定義?)[?表選項] ??每個字段必須有數據類型 ??最后一個字段后不能有逗號 ??temporary?臨時表,會話結束時表自動消失 ??對于字段的定義: ???字段名?數據類型?[NOT?NULL?|?NULL]?[DEFAULT?default_value]?[AUTO_INCREMENT]?[UNIQUE?[KEY]?|?[PRIMARY]?KEY]?[COMMENT?'string'] --?表選項 ?--?字符集 ??CHARSET?=?charset_name ??如果表沒有設定,則使用數據庫字符集 ?--?存儲引擎 ??ENGINE?=?engine_name? ??表在管理數據時采用的不同的數據結構,結構不同會導致處理方式、提供的特性操作等不同 ??常見的引擎:InnoDB?MyISAM?Memory/Heap?BDB?Merge?Example?CSV?MaxDB?Archive ??不同的引擎在保存表的結構和數據時采用不同的方式 ??MyISAM表文件含義:.frm表定義,.MYD表數據,.MYI表索引 ??InnoDB表文件含義:.frm表定義,表空間數據和日志文件 ??SHOW?ENGINES?--?顯示存儲引擎的狀態信息 ??SHOW?ENGINE?引擎名?{LOGS|STATUS}?--?顯示存儲引擎的日志或狀態信息 ?--?數據文件目錄 ??DATA?DIRECTORY?=?'目錄' ?--?索引文件目錄 ??INDEX?DIRECTORY?=?'目錄' ?--?表注釋 ??COMMENT?=?'string' ?--?分區選項 ??PARTITION?BY?...?(詳細見手冊) --?查看所有表 ?SHOW?TABLES[?LIKE?'pattern'] ?SHOW?TABLES?FROM?表名 --?查看表機構 ?SHOW?CREATE?TABLE?表名?(信息更詳細) ?DESC?表名?/?DESCRIBE?表名?/?EXPLAIN?表名?/?SHOW?COLUMNS?FROM?表名?[LIKE?'PATTERN'] ?SHOW?TABLE?STATUS?[FROM?db_name]?[LIKE?'pattern'] --?修改表 ?--?修改表本身的選項 ??ALTER?TABLE?表名?表的選項 ??EG:?ALTER?TABLE?表名?ENGINE=MYISAM; ?--?對表進行重命名 ??RENAME?TABLE?原表名?TO?新表名 ??RENAME?TABLE?原表名?TO?庫名.表名?(可將表移動到另一個數據庫) ??--?RENAME可以交換兩個表名 ?--?修改表的字段機構 ??ALTER?TABLE?表名?操作名 ??--?操作名 ???ADD[?COLUMN]?字段名??--?增加字段 ????AFTER?字段名???--?表示增加在該字段名后面 ????FIRST????--?表示增加在第一個 ???ADD?PRIMARY?KEY(字段名)?--?創建主鍵 ???ADD?UNIQUE?[索引名]?(字段名)--?創建唯一索引 ???ADD?INDEX?[索引名]?(字段名)?--?創建普通索引 ???ADD? ???DROP[?COLUMN]?字段名??--?刪除字段 ???MODIFY[?COLUMN]?字段名?字段屬性??--?支持對字段屬性進行修改,不能修改字段名(所有原有屬性也需寫上) ???CHANGE[?COLUMN]?原字段名?新字段名?字段屬性??--?支持對字段名修改 ???DROP?PRIMARY?KEY?--?刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性) ???DROP?INDEX?索引名?--?刪除索引 ???DROP?FOREIGN?KEY?外鍵?--?刪除外鍵 --?刪除表 ?DROP?TABLE[?IF?EXISTS]?表名?... --?清空表數據 ?TRUNCATE?[TABLE]?表名 --?復制表結構 ?CREATE?TABLE?表名?LIKE?要復制的表名 --?復制表結構和數據 ?CREATE?TABLE?表名?[AS]?SELECT?*?FROM?要復制的表名 --?檢查表是否有錯誤 ?CHECK?TABLE?tbl_name?[,?tbl_name]?...?[option]?... --?優化表 ?OPTIMIZE?[LOCAL?|?NO_WRITE_TO_BINLOG]?TABLE?tbl_name?[,?tbl_name]?... --?修復表 ?REPAIR?[LOCAL?|?NO_WRITE_TO_BINLOG]?TABLE?tbl_name?[,?tbl_name]?...?[QUICK]?[EXTENDED]?[USE_FRM] --?分析表 ?ANALYZE?[LOCAL?|?NO_WRITE_TO_BINLOG]?TABLE?tbl_name?[,?tbl_name]?... /*?數據操作?*/?------------------ --?增 ?INSERT?[INTO]?表名?[(字段列表)]?VALUES?(值列表)[,?(值列表),?...] ??--?如果要插入的值列表包含所有字段并且順序一致,則可以省略字段列表。 ??--?可同時插入多條數據記錄! ??REPLACE?與?INSERT?完全一樣,可互換。 ?INSERT?[INTO]?表名?SET?字段名=值[,?字段名=值,?...] --?查 ?SELECT?字段列表?FROM?表名[?其他子句] ??--?可來自多個表的多個字段 ??--?其他子句可以不使用 ??--?字段列表可以用*代替,表示所有字段 --?刪 ?DELETE?FROM?表名[?刪除條件子句] ??沒有條件子句,則會刪除全部 --?改 ?UPDATE?表名?SET?字段名=新值[,?字段名=新值]?[更新條件] /*?字符集編碼?*/?------------------ --?MySQL、數據庫、表、字段均可設置編碼 --?數據編碼與客戶端編碼不需一致 SHOW?VARIABLES?LIKE?'character_set_%'?--?查看所有字符集編碼項 ?character_set_client??客戶端向服務器發送數據時使用的編碼 ?character_set_results??服務器端將結果返回給客戶端所使用的編碼 ?character_set_connection?連接層編碼 SET?變量名?=?變量值 ?set?character_set_client?=?gbk; ?set?character_set_results?=?gbk; ?set?character_set_connection?=?gbk; SET?NAMES?GBK;?--?相當于完成以上三個設置 --?校對集 ?校對集用以排序 ?SHOW?CHARACTER?SET?[LIKE?'pattern']/SHOW?CHARSET?[LIKE?'pattern']?查看所有字符集 ?SHOW?COLLATION?[LIKE?'pattern']??查看所有校對集 ?charset?字符集編碼??設置字符集編碼 ?collate?校對集編碼??設置校對集編碼 /*?數據類型(列類型)?*/?------------------ 1.?數值類型 --?a.?整型?---------- ?類型???字節??范圍(有符號位) ?tinyint??1字節?-128?~?127??無符號位:0?~?255 ?smallint?2字節?-32768?~?32767 ?mediumint?3字節?-8388608?~?8388607 ?int???4字節 ?bigint??8字節 ?int(M)?M表示總位數 ?-?默認存在符號位,unsigned?屬性修改 ?-?顯示寬度,如果某個數不夠定義字段時設置的位數,則前面以0補填,zerofill?屬性修改 ??例:int(5)?插入一個數'123',補填后為'00123' ?-?在滿足要求的情況下,越小越好。 ?-?1表示bool值真,0表示bool值假。MySQL沒有布爾類型,通過整型0和1表示。常用tinyint(1)表示布爾型。 --?b.?浮點型?---------- ?類型????字節??范圍 ?float(單精度)??4字節 ?double(雙精度)?8字節 ?浮點型既支持符號位?unsigned?屬性,也支持顯示寬度?zerofill?屬性。 ??不同于整型,前后均會補填0. ?定義浮點型時,需指定總位數和小數位數。 ??float(M,?D)??double(M,?D) ??M表示總位數,D表示小數位數。 ??M和D的大小會決定浮點數的范圍。不同于整型的固定范圍。 ??M既表示總位數(不包括小數點和正負號),也表示顯示寬度(所有顯示符號均包括)。 ??支持科學計數法表示。 ??浮點數表示近似值。 --?c.?定點數?---------- ?decimal?--?可變長度 ?decimal(M,?D)?M也表示總位數,D表示小數位數。 ?保存一個精確的數值,不會發生數據的改變,不同于浮點數的四舍五入。 ?將浮點數轉換為字符串來保存,每9位數字保存為4個字節。 2.?字符串類型 --?a.?char,?varchar?---------- ?char?定長字符串,速度快,但浪費空間 ?varchar?變長字符串,速度慢,但節省空間 ?M表示能存儲的最大長度,此長度是字符數,非字節數。 ?不同的編碼,所占用的空間不同。 ?char,最多255個字符,與編碼無關。 ?varchar,最多65535字符,與編碼有關。 ?一條有效記錄最大不能超過65535個字節。 ??utf8?最大為21844個字符,gbk?最大為32766個字符,latin1?最大為65532個字符 ?varchar?是變長的,需要利用存儲空間保存?varchar?的長度,如果數據小于255個字節,則采用一個字節來保存長度,反之需要兩個字節來保存。 ?varchar?的最大有效長度由最大行大小和使用的字符集確定。 ?最大有效長度是65532字節,因為在varchar存字符串時,第一個字節是空的,不存在任何數據,然后還需兩個字節來存放字符串的長度,所以有效長度是64432-1-2=65532字節。 ?例:若一個表定義為?CREATE?TABLE?tb(c1?int,?c2?char(30),?c3?varchar(N))?charset=utf8;?問N的最大值是多少??答:(65535-1-2-4-30*3)/3 --?b.?blob,?text?---------- ?blob?二進制字符串(字節字符串) ??tinyblob,?blob,?mediumblob,?longblob ?text?非二進制字符串(字符字符串) ??tinytext,?text,?mediumtext,?longtext ?text?在定義時,不需要定義長度,也不會計算總長度。 ?text?類型在定義時,不可給default值 --?c.?binary,?varbinary?---------- ?類似于char和varchar,用于保存二進制字符串,也就是保存字節字符串而非字符字符串。 ?char,?varchar,?text?對應?binary,?varbinary,?blob. 3.?日期時間類型 ?一般用整型保存時間戳,因為PHP可以很方便的將時間戳進行格式化。 ?datetime?8字節?日期及時間??1000-01-01?00:00:00?到?9999-12-31?23:59:59 ?date??3字節?日期???1000-01-01?到?9999-12-31 ?timestamp?4字節?時間戳??19700101000000?到?2038-01-19?03:14:07 ?time??3字節?時間???-838:59:59?到?838:59:59 ?year??1字節?年份???1901?-?2155 ? datetime?“YYYY-MM-DD?hh:mm:ss” timestamp?“YY-MM-DD?hh:mm:ss” ???“YYYYMMDDhhmmss” ???“YYMMDDhhmmss” ???YYYYMMDDhhmmss ???YYMMDDhhmmss date??“YYYY-MM-DD” ???“YY-MM-DD” ???“YYYYMMDD” ???“YYMMDD” ???YYYYMMDD ???YYMMDD time??“hh:mm:ss” ???“hhmmss” ???hhmmss year??“YYYY” ???“YY” ???YYYY ???YY 4.?枚舉和集合 --?枚舉(enum)?---------- enum(val1,?val2,?val3...) ?在已知的值中進行單選。最大數量為65535. ?枚舉值在保存時,以2個字節的整型(smallint)保存。每個枚舉值,按保存的位置順序,從1開始逐一遞增。 ?表現為字符串類型,存儲卻是整型。 ?NULL值的索引是NULL。 ?空字符串錯誤值的索引值是0。 --?集合(set)?---------- set(val1,?val2,?val3...) ?create?table?tab?(?gender?set('男',?'女',?'無')?); ?insert?into?tab?values?('男,?女'); ?最多可以有64個不同的成員。以bigint存儲,共8個字節。采取位運算的形式。 ?當創建表時,SET成員值的尾部空格將自動被刪除。 /*?選擇類型?*/ --?PHP角度 1.?功能滿足 2.?存儲空間盡量小,處理效率更高 3.?考慮兼容問題 --?IP存儲?---------- 1.?只需存儲,可用字符串 2.?如果需計算,查找等,可存儲為4個字節的無符號int,即unsigned ?1)?PHP函數轉換 ??ip2long可轉換為整型,但會出現攜帶符號問題。需格式化為無符號的整型。 ??利用sprintf函數格式化字符串 ??sprintf("%u",?ip2long('192.168.3.134')); ??然后用long2ip將整型轉回IP字符串 ?2)?MySQL函數轉換(無符號整型,UNSIGNED) ??INET_ATON('127.0.0.1')?將IP轉為整型 ??INET_NTOA(2130706433)?將整型轉為IP ?? /*?列屬性(列約束)?*/?------------------ 1.?主鍵 ?-?能唯一標識記錄的字段,可以作為主鍵。 ?-?一個表只能有一個主鍵。 ?-?主鍵具有唯一性。 ?-?聲明字段時,用?primary?key?標識。 ??也可以在字段列表之后聲明 ???例:create?table?tab?(?id?int,?stu?varchar(10),?primary?key?(id)); ?-?主鍵字段的值不能為null。 ?-?主鍵可以由多個字段共同組成。此時需要在字段列表后聲明的方法。 ??例:create?table?tab?(?id?int,?stu?varchar(10),?age?int,?primary?key?(stu,?age)); 2.?unique?唯一索引(唯一約束) ?使得某字段的值也不能重復。 ? 3.?null?約束 ?null不是數據類型,是列的一個屬性。 ?表示當前列是否可以為null,表示什么都沒有。 ?null,?允許為空。默認。 ?not?null,?不允許為空。 ?insert?into?tab?values?(null,?'val'); ??--?此時表示將第一個字段的值設為null,?取決于該字段是否允許為null ? 4.?default?默認值屬性 ?當前字段的默認值。 ?insert?into?tab?values?(default,?'val');?--?此時表示強制使用默認值。 ?create?table?tab?(?add_time?timestamp?default?current_timestamp?); ??--?表示將當前時間的時間戳設為默認值。 ??current_date,?current_time 5.?auto_increment?自動增長約束 ?自動增長必須為索引(主鍵或unique) ?只能存在一個字段為自動增長。 ?默認為1開始自動增長。可以通過表屬性?auto_increment?=?x進行設置,或?alter?table?tbl?auto_increment?=?x; 6.?comment?注釋 ?例:create?table?tab?(?id?int?)?comment?'注釋內容'; 7.?foreign?key?外鍵約束 ?用于限制主表與從表數據完整性。 ?alter?table?t1?add?constraint?`t1_t2_fk`?foreign?key?(t1_id)?references?t2(id); ??--?將表t1的t1_id外鍵關聯到表t2的id字段。 ??--?每個外鍵都有一個名字,可以通過?constraint?指定 ?存在外鍵的表,稱之為從表(子表),外鍵指向的表,稱之為主表(父表)。 ?作用:保持數據一致性,完整性,主要目的是控制存儲在外鍵表(從表)中的數據。 ?MySQL中,可以對InnoDB引擎使用外鍵約束: ?語法: ?foreign?key?(外鍵字段)?references?主表名?(關聯字段)?[主表記錄刪除時的動作]?[主表記錄更新時的動作] ?此時需要檢測一個從表的外鍵需要約束為主表的已存在的值。外鍵在沒有關聯的情況下,可以設置為null.前提是該外鍵列,沒有not?null。 ?可以不指定主表記錄更改或更新時的動作,那么此時主表的操作被拒絕。 ?如果指定了?on?update?或?on?delete:在刪除或更新時,有如下幾個操作可以選擇: ?1.?cascade,級聯操作。主表數據被更新(主鍵值更新),從表也被更新(外鍵值更新)。主表記錄被刪除,從表相關記錄也被刪除。 ?2.?set?null,設置為null。主表數據被更新(主鍵值更新),從表的外鍵被設置為null。主表記錄被刪除,從表相關記錄外鍵被設置成null。但注意,要求該外鍵列,沒有not?null屬性約束。 ?3.?restrict,拒絕父表刪除和更新。 ?注意,外鍵只被InnoDB存儲引擎所支持。其他引擎是不支持的。 /*?建表規范?*/?------------------ ?--?Normal?Format,?NF ??-?每個表保存一個實體信息 ??-?每個具有一個ID字段作為主鍵 ??-?ID主鍵?+?原子表 ?--?1NF,?第一范式 ??字段不能再分,就滿足第一范式。 ?--?2NF,?第二范式 ??滿足第一范式的前提下,不能出現部分依賴。 ??消除符合主鍵就可以避免部分依賴。增加單列關鍵字。 ?--?3NF,?第三范式 ??滿足第二范式的前提下,不能出現傳遞依賴。 ??某個字段依賴于主鍵,而有其他字段依賴于該字段。這就是傳遞依賴。 ??將一個實體信息的數據放在一個表內實現。 /*?select?*/?------------------ select?[all|distinct]?select_expr?from?->?where?->?group?by?[合計函數]?->?having?->?order?by?->?limit a.?select_expr ?--?可以用?*?表示所有字段。 ??select?*?from?tb; ?--?可以使用表達式(計算公式、函數調用、字段也是個表達式) ??select?stu,?29+25,?now()?from?tb; ?--?可以為每個列使用別名。適用于簡化列標識,避免多個列標識符重復。 ??-?使用?as?關鍵字,也可省略?as. ??select?stu+10?as?add10?from?tb; b.?from?子句 ?用于標識查詢來源。 ?--?可以為表起別名。使用as關鍵字。 ??select?*?from?tb1?as?tt,?tb2?as?bb; ?--?from子句后,可以同時出現多個表。 ??--?多個表會橫向疊加到一起,而數據會形成一個笛卡爾積。 ??select?*?from?tb1,?tb2; c.?where?子句 ?--?從from獲得的數據源中進行篩選。 ?--?整型1表示真,0表示假。 ?--?表達式由運算符和運算數組成。 ??--?運算數:變量(字段)、值、函數返回值 ??--?運算符: ???=,?,?,?!=,?=,?>,?!,?&&,?||,? ???in?(not)?null,?(not)?like,?(not)?in,?(not)?between?and,?is?(not),?and,?or,?not,?xor ???is/is?not?加上ture/false/unknown,檢驗某個值的真假 ???與功能相同,可用于null比較 d.?group?by?子句,?分組子句 ?group?by?字段/別名?[排序方式] ?分組后會進行排序。升序:ASC,降序:DESC ? ?以下[合計函數]需配合?group?by?使用: ?count?返回不同的非NULL值數目?count(*)、count(字段) ?sum?求和 ?max?求最大值 ?min?求最小值 ?avg?求平均值 ?group_concat?返回帶有來自一個組的連接的非NULL值的字符串結果。組內字符串連接。 e.?having?子句,條件子句 ?與?where?功能、用法相同,執行時機不同。 ?where?在開始時執行檢測數據,對原數據進行過濾。 ?having?對篩選出的結果再次進行過濾。 ?having?字段必須是查詢出來的,where?字段必須是數據表存在的。 ?where?不可以使用字段的別名,having?可以。因為執行WHERE代碼時,可能尚未確定列值。 ?where?不可以使用合計函數。一般需用合計函數才會用?having ?SQL標準要求HAVING必須引用GROUP?BY子句中的列或用于合計函數中的列。 f.?order?by?子句,排序子句 ?order?by?排序字段/別名?排序方式?[,排序字段/別名?排序方式]... ?升序:ASC,降序:DESC ?支持多個字段的排序。 g.?limit?子句,限制結果數量子句 ?僅對處理好的結果進行數量限制。將處理好的結果的看作是一個集合,按照記錄出現的順序,索引從0開始。 ?limit?起始位置,?獲取條數 ?省略第一個參數,表示從索引0開始。limit?獲取條數 h.?distinct,?all?選項 ?distinct?去除重復記錄 ?默認為?all,?全部記錄 /*?UNION?*/?------------------ ?將多個select查詢的結果組合成一個結果集合。 ?SELECT?...?UNION?[ALL|DISTINCT]?SELECT?... ?默認?DISTINCT?方式,即所有返回的行都是唯一的 ?建議,對每個SELECT查詢加上小括號包裹。 ?ORDER?BY?排序時,需加上?LIMIT?進行結合。 ?需要各select查詢的字段數量一樣。 ?每個select查詢的字段列表(數量、類型)應一致,因為結果中的字段名以第一條select語句為準。 /*?子查詢?*/?------------------ ?-?子查詢需用括號包裹。 --?from型 ?from后要求是一個表,必須給子查詢結果取個別名。 ?-?簡化每個查詢內的條件。 ?-?from型需將結果生成一個臨時表格,可用以原表的鎖定的釋放。 ?-?子查詢返回一個表,表型子查詢。 ?select?*?from?(select?*?from?tb?where?id>0)?as?subfrom?where?id>1; --?where型 ?-?子查詢返回一個值,標量子查詢。 ?-?不需要給子查詢取別名。 ?-?where子查詢內的表,不能直接用以更新。 ?select?*?from?tb?where?money?=?(select?max(money)?from?tb); ?--?列子查詢 ??如果子查詢結果返回的是一列。 ??使用?in?或?not?in?完成查詢 ??exists?和?not?exists?條件 ???如果子查詢返回數據,則返回1或0。常用于判斷條件。 ???select?column1?from?t1?where?exists?(select?*?from?t2); ?--?行子查詢 ??查詢條件是一個行。 ??select?*?from?t1?where?(id,?gender)?in?(select?id,?gender?from?t2); ??行構造符:(col1,?col2,?...)?或?ROW(col1,?col2,?...) ??行構造符通常用于與對能返回兩個或兩個以上列的子查詢進行比較。 ?--?特殊運算符 ?!=?all()?相當于?not?in ?=?some()?相當于?in。any?是?some?的別名 ?!=?some()?不等同于?not?in,不等于其中某一個。 ?all,?some?可以配合其他運算符一起使用。 /*?連接查詢(join)?*/?------------------ ?將多個表的字段進行連接,可以指定連接條件。 --?內連接(inner?join) ?-?默認就是內連接,可省略inner。 ?-?只有數據存在時才能發送連接。即連接結果不能出現空行。 ?on?表示連接條件。其條件表達式與where類似。也可以省略條件(表示條件永遠為真) ?也可用where表示連接條件。 ?還有?using,?但需字段名相同。?using(字段名) ?--?交叉連接?cross?join ??即,沒有條件的內連接。 ??select?*?from?tb1?cross?join?tb2; --?外連接(outer?join) ?-?如果數據不存在,也會出現在連接結果中。 ?--?左外連接?left?join ??如果數據不存在,左表記錄會出現,而右表為null填充 ?--?右外連接?right?join ??如果數據不存在,右表記錄會出現,而左表為null填充 --?自然連接(natural?join) ?自動判斷連接條件完成連接。 ?相當于省略了using,會自動查找相同字段名。 ?natural?join ?natural?left?join ?natural?right?join select?info.id,?info.name,?info.stu_num,?extra_info.hobby,?extra_info.sex?from?info,?extra_info?where?info.stu_num?=?extra_info.stu_id; /*?導入導出?*/?------------------ select?*?into?outfile?文件地址?[控制格式]?from?表名;?--?導出表數據 load?data?[local]?infile?文件地址?[replace|ignore]?into?table?表名?[控制格式];?--?導入數據 ?生成的數據默認的分隔符是制表符 ?local未指定,則數據文件必須在服務器上 ?replace?和?ignore?關鍵詞控制對現有的唯一鍵記錄的重復的處理 --?控制格式 fields?控制字段格式 默認:fields?terminated?by?' '?enclosed?by?''?escaped?by?'' ?terminated?by?'string'?--?終止 ?enclosed?by?'char'??--?包裹 ?escaped?by?'char'??--?轉義 ?--?示例: ??SELECT?a,b,a+b?INTO?OUTFILE?'/tmp/result.text' ??FIELDS?TERMINATED?BY?','?OPTIONALLY?ENCLOSED?BY?'"' ??LINES?TERMINATED?BY?' ' ??FROM?test_table; lines?控制行格式 默認:lines?terminated?by?' ' ?terminated?by?'string'?--?終止 ? /*?insert?*/?------------------ select語句獲得的數據可以用insert插入。 可以省略對列的指定,要求?values?()?括號內,提供給了按照列順序出現的所有字段的值。 ?或者使用set語法。 ?insert?into?tbl_name?set?field=value,...; 可以一次性使用多個值,采用(),?(),?();的形式。 ?insert?into?tbl_name?values?(),?(),?(); 可以在列值指定時,使用表達式。 ?insert?into?tbl_name?values?(field_value,?10+10,?now()); 可以使用一個特殊值?default,表示該列使用默認值。 ?insert?into?tbl_name?values?(field_value,?default); 可以通過一個查詢的結果,作為需要插入的值。 ?insert?into?tbl_name?select?...; 可以指定在插入的值出現主鍵(或唯一索引)沖突時,更新其他非主鍵列的信息。 ?insert?into?tbl_name?values/set/select?on?duplicate?key?update?字段=值,?…; /*?delete?*/?------------------ DELETE?FROM?tbl_name?[WHERE?where_definition]?[ORDER?BY?...]?[LIMIT?row_count] 按照條件刪除 指定刪除的最多記錄數。Limit 可以通過排序條件刪除。order?by?+?limit 支持多表刪除,使用類似連接語法。 delete?from?需要刪除數據多表1,表2?using?表連接操作?條件。 /*?truncate?*/?------------------ TRUNCATE?[TABLE]?tbl_name 清空數據 刪除重建表 區別: 1,truncate?是刪除表再創建,delete?是逐條刪除 2,truncate?重置auto_increment的值。而delete不會 3,truncate?不知道刪除了幾條,而delete知道。 4,當被用于帶分區的表時,truncate?會保留分區 /*?備份與還原?*/?------------------ 備份,將數據的結構與表內數據保存起來。 利用?mysqldump?指令完成。 --?導出 1.?導出一張表 mysqldump?-u用戶名?-p密碼?庫名?表名?>?文件名(D:/a.sql) 2.?導出多張表 mysqldump?-u用戶名?-p密碼?庫名?表1?表2?表3?>?文件名(D:/a.sql) 3.?導出所有表 mysqldump?-u用戶名?-p密碼?庫名?>?文件名(D:/a.sql) 4.?導出一個庫? mysqldump?-u用戶名?-p密碼?-B?庫名?>?文件名(D:/a.sql) 可以-w攜帶備份條件 --?導入 1.?在登錄mysql的情況下: source?備份文件 2.?在不登錄的情況下 mysql?-u用戶名?-p密碼?庫名?<p>5.5.8、常用的SQL</p><p class="jb51code"><br></p><pre class="brush:sql;">/*==============================================================*/ /*?DBMS?name:??MySQL?5.0?????????*/ /*?Created?on:??2017/3/5?10:29:05???????*/ /*==============================================================*/ drop?table?if?exists?Address; drop?table?if?exists?ArticleComment; drop?table?if?exists?ArticleType; drop?table?if?exists?Articles; drop?table?if?exists?DictSub; drop?table?if?exists?DictTop; drop?table?if?exists?OrderPdt; drop?table?if?exists?Orders; drop?table?if?exists?ProductComment; drop?table?if?exists?Products; drop?table?if?exists?Users; /*==============================================================*/ /*?Table:?Address????????????*/ /*==============================================================*/ create?table?Address ( ?`AddressId`?int?not?null?auto_increment?comment?'收貨地址編號', ?`UserId`?int?not?null?comment?'用戶編號', ?`Province`?varchar(50)?not?null?comment?'省', ?`City`?varchar(50)?not?null?comment?'市', ?`County`?varchar(50)?not?null?comment?'縣/區', ?`Street`?varchar(300)?not?null?comment?'詳細地址', ?`RevName`?varchar(30)?not?null?comment?'收貨人姓名', ?`PostCode`?varchar(20)?comment?'郵政編碼', ?`Mobile`?varchar(50)?not?null?comment?'手機', ?`Phone`?varchar(50)?comment?'電話', ?`IsDefault`?bool?comment?'是否為默認地址', ?primary?key?(AddressId) ); alter?table?Address?comment?'收貨地址'; /*==============================================================*/ /*?Table:?ArticleComment??????????*/ /*==============================================================*/ create?table?ArticleComment ( ?`ArticleCommentId`?int?not?null?auto_increment?comment?'文章評論編號', ?`ArticleId`?int?not?null?comment?'文章編號', ?`UserId`?int?not?null?comment?'用戶編號', ?`ArticleCommentContent`?varchar(4000)?not?null?comment?'文章評論內容', ?`ArticleCommentDate`?timestamp?default?CURRENT_TIMESTAMP?comment?'文章評論時間', ?`ArticleCommentState`?int?default?1?comment?'狀態', ?`ArticleRemark`?int?comment?'打分', ?`ArticleCommentReserver1`?varchar(4000)?comment?'備用1', ?`ArticleCommentReserver2`?varchar(4000)?comment?'備用2', ?primary?key?(ArticleCommentId) ); alter?table?ArticleComment?comment?'文章評論'; /*==============================================================*/ /*?Table:?ArticleType???????????*/ /*==============================================================*/ create?table?ArticleType ( ?`ArticleTypeId`?int?not?null?auto_increment?comment?'文章欄目編號', ?`ArticleTypeName`?varchar(200)?comment?'文章欄目名稱', ?`ArticleTypeState`?int?default?1?comment?'狀態', ?`ArticleTypeDesc`?varchar(4000)?comment?'文章欄目描述', ?`ArticleTypePicture`?varchar(400)?comment?'文章欄目圖片', ?`ArticleTypeReserve1`?varchar(4000)?comment?'備用1', ?`ArticleTypeReserve2`?varchar(4000)?comment?'備用2', ?primary?key?(ArticleTypeId) ); alter?table?ArticleType?comment?'文章欄目'; /*==============================================================*/ /*?Table:?Articles????????????*/ /*==============================================================*/ create?table?Articles ( ?`ArticleId`?int?not?null?auto_increment?comment?'文章編號', ?`ArticleTypeId`?int?not?null?comment?'文章欄目編號', ?`ArticleTitle`?varchar(400)?not?null?comment?'文章標題', ?`ArticleContent`?text?comment?'文章內容', ?`ArticleDate`?timestamp?default?CURRENT_TIMESTAMP?comment?'文章發布時間', ?`ArticleAuthor`?varchar(200)?comment?'文章發布者', ?`ArticleFileName`?varchar(100)?comment?'靜態文件名', ?`ArticleThumbNail`?varchar(200)?comment?'縮略圖片', ?`ArticleAddition`?varchar(200)?comment?'附件名稱', ?`ArticleLevel`?int?comment?'顯示的優先級', ?`ArticleIsAllowComment`?integer?default?1?comment?'是否允許評論', ?`ArticleState`?int?default?1?comment?'狀態', ?`ArticleHotCount`?int?comment?'點擊次數', ?`ArticleReserve1`?varchar(4000)?comment?'備用1', ?`ArticleReserve2`?varchar(4000)?comment?'備用2', ?`ArticleReserve3`?numeric(8,0)?comment?'備用3', ?primary?key?(ArticleId) ); alter?table?Articles?comment?'文章'; /*==============================================================*/ /*?Table:?DictSub????????????*/ /*==============================================================*/ create?table?DictSub ( ?`SubId`?int?not?null?auto_increment?comment?'子項編號', ?`DictId`?int?not?null?comment?'字典編號', ?`SubName`?varchar(200)?not?null?comment?'子項名稱', ?`SubDesc`?varchar(4000)?comment?'子項描述', ?`SubReserve1`?varchar(4000)?comment?'保留備用1', ?primary?key?(SubId) ); alter?table?DictSub?comment?'字典子項'; /*==============================================================*/ /*?Table:?DictTop????????????*/ /*==============================================================*/ create?table?DictTop ( ?`DictId`?int?not?null?auto_increment?comment?'字典編號', ?`DictName`?varchar(100)?not?null?comment?'字典名稱', ?`DictDesc`?varchar(4000)?comment?'字典描述', ?`DictReserve1`?varchar(4000)?comment?'保留備用', ?primary?key?(DictId) ); alter?table?DictTop?comment?'字典'; /*==============================================================*/ /*?Table:?OrderPdt????????????*/ /*==============================================================*/ create?table?OrderPdt ( ?`OrderPdtId`?int?not?null?auto_increment?comment?'訂單商品編號', ?`Id`?int?not?null?comment?'編號', ?`UserId`?int?not?null?comment?'用戶編號', ?`OrderId`?int?comment?'訂單號', ?`PdtAmount`?int?comment?'訂購數量', ?`PdtPrice`?decimal?comment?'單價', ?`PdtReserve1`?varchar(2000)?comment?'備用1', ?`PdtReserve2`?varchar(4000)?comment?'備用2', ?primary?key?(OrderPdtId) ); alter?table?OrderPdt?comment?'訂單商品'; /*==============================================================*/ /*?Table:?Orders????????????*/ /*==============================================================*/ create?table?Orders ( ?`OrderId`?int?not?null?auto_increment?comment?'訂單號', ?`AddressId`?int?not?null?comment?'收貨地址編號', ?`OrderState`?int?default?1?comment?'訂單狀態', ?`ExpressNO`?varchar(50)?comment?'快遞編號', ?`ExpressName`?varchar(50)?comment?'快遞名稱', ?`PayMoney`?decimal?comment?'應支付', ?`PayedMoney`?decimal?comment?'已支付', ?`SendInfo`?varchar(300)?comment?'發貨人信息', ?`BuyDate`?timestamp?default?CURRENT_TIMESTAMP?comment?'下單時間', ?`PayDate`?datetime?comment?'支付時間', ?`SendDate`?datetime?comment?'發貨時間', ?`ReceivDate`?datetime?comment?'收貨時間', ?`OrderMessage`?varchar(4000)?comment?'附言', ?`UserId`?integer?comment?'用戶編號', ?`OrderReserve1`?varchar(4000)?comment?'備用1', ?`OrderReserve2`?varchar(4000)?comment?'備用2', ?`OrderReserve3`?decimal?comment?'備用3', ?primary?key?(OrderId) ); alter?table?Orders?comment?'訂單'; /*==============================================================*/ /*?Table:?ProductComment??????????*/ /*==============================================================*/ create?table?ProductComment ( ?`ProductCommentId`?int?not?null?auto_increment?comment?'商品評論編號', ?`ProductId`?int?not?null?comment?'商品編號', ?`UserId`?int?not?null?comment?'用戶編號', ?`ProductCommentContent`?varchar(4000)?comment?'商品評論內容', ?`ProductCommentDate`?timestamp?default?CURRENT_TIMESTAMP?comment?'商品評論時間', ?`ProductCommentState`?int?comment?'狀態', ?`ProductCommentRemark`?int?comment?'打分', ?`ProductCommentReserve1`?varchar(4000)?comment?'備用1', ?`ProductCommentReserve2`?varchar(4000)?comment?'備用2', ?primary?key?(ProductCommentId) ); alter?table?ProductComment?comment?'商品評論'; /*==============================================================*/ /*?Table:?Products????????????*/ /*==============================================================*/ create?table?Products ( ?`Id`?int?not?null?auto_increment?comment?'編號', ?`Name`?varchar(200)?not?null?comment?'名稱', ?`SubIdColor`?int?not?null?comment?'所屬顏色', ?`SubIdBrand`?int?not?null?comment?'所屬品牌', ?`SubIdInlay`?int?not?null?comment?'所屬鑲嵌', ?`SubIdMoral`?int?not?null?comment?'所屬寓意', ?`SubIdMaterial`?int?not?null?comment?'所屬種水', ?`SubIdTopLevel`?int?not?null?comment?'一級分類編號', ?`MarketPrice`?decimal?comment?'市場參考價', ?`MyPrice`?decimal?not?null?comment?'玉源直銷價', ?`Discount`?decimal?default?1?comment?'折扣', ?`Picture`?varchar(200)?comment?'圖片', ?`Amount`?int?comment?'庫存量', ?`Description`?text?comment?'詳細描述', ?`State`?int?default?1?comment?'狀態', ?`AddDate`?timestamp?default?CURRENT_TIMESTAMP?comment?'上貨日期', ?`Hang`?int?comment?'掛件', ?`RawStone`?int?comment?'賭石', ?`Size`?varchar(200)?comment?'尺寸', ?`ExpressageName`?varchar(100)?comment?'快遞名稱', ?`Expressage`?decimal?comment?'快遞費', ?`AllowComment`?int?default?1?comment?'是否允許評論', ?`Reserve1`?varchar(4000)?comment?'保留備用1', ?`Reserve2`?varchar(4000)?comment?'保留備用2', ?`Reserve3`?decimal(0)?comment?'保留備用3', ?primary?key?(Id) ); alter?table?Products?comment?'商品'; /*==============================================================*/ /*?Table:?Users?????????????*/ /*==============================================================*/ create?table?Users ( ?`UserId`?int?not?null?auto_increment?comment?'用戶編號', ?`UserName`?varchar(200)?not?null?comment?'用戶名', ?`Password`?varchar(512)?not?null?comment?'密碼', ?`Email`?varchar(100)?not?null?comment?'郵箱', ?`Sex`?varchar(10)?comment?'性別', ?`State`?int?default?1?comment?'狀態', ?`RightCode`?int?comment?'權限狀態', ?`RegDate`?timestamp?default?CURRENT_TIMESTAMP?comment?'注冊時間', ?`RegIP`?varchar(200)?comment?'注冊IP', ?`LastLoginDate`?datetime?comment?'最近登錄時間', ?`UserReserve1`?varchar(4000)?comment?'保留備用1', ?`UserReserve2`?varchar(4000)?comment?'保留備用2', ?`UserReserve3`?varchar(4000)?comment?'保留備用3', ?primary?key?(UserId) ); alter?table?Users?comment?'用戶'; alter?table?Address?add?constraint?FK_AddressBelongUser?foreign?key?(UserId) ??references?Users?(UserId)?on?delete?restrict?on?update?restrict; alter?table?ArticleComment?add?constraint?FK_ArticleCommentForArticle?foreign?key?(ArticleId) ??references?Articles?(ArticleId)?on?delete?restrict?on?update?restrict; alter?table?ArticleComment?add?constraint?FK_ArticleCommentForUser?foreign?key?(UserId) ??references?Users?(UserId)?on?delete?restrict?on?update?restrict; alter?table?Articles?add?constraint?FK_ArticleBelongType?foreign?key?(ArticleTypeId) ??references?ArticleType?(ArticleTypeId)?on?delete?restrict?on?update?restrict; alter?table?DictSub?add?constraint?FK_BelongDict?foreign?key?(DictId) ??references?DictTop?(DictId)?on?delete?cascade?on?update?cascade; alter?table?OrderPdt?add?constraint?FK_BelongOrder?foreign?key?(OrderId) ??references?Orders?(OrderId)?on?delete?cascade?on?update?cascade; alter?table?OrderPdt?add?constraint?FK_CartForUser?foreign?key?(UserId) ??references?Users?(UserId)?on?delete?restrict?on?update?restrict; alter?table?OrderPdt?add?constraint?FK_OrderDepProduct?foreign?key?(Id) ??references?Products?(Id)?on?delete?restrict?on?update?restrict; alter?table?Orders?add?constraint?FK_OrderBelongAddress?foreign?key?(AddressId) ??references?Address?(AddressId)?on?delete?restrict?on?update?restrict; alter?table?ProductComment?add?constraint?FK_ProductCommentBelongUsers?foreign?key?(UserId) ??references?Users?(UserId)?on?delete?restrict?on?update?restrict; alter?table?ProductComment?add?constraint?FK_ProductCommentForProduct?foreign?key?(ProductId) ??references?Products?(Id)?on?delete?restrict?on?update?restrict; alter?table?Products?add?constraint?FK_BelongBrand?foreign?key?(SubIdMaterial) ??references?DictSub?(SubId)?on?delete?restrict?on?update?restrict; alter?table?Products?add?constraint?FK_BelongColor?foreign?key?(SubIdBrand) ??references?DictSub?(SubId)?on?delete?restrict?on?update?restrict; alter?table?Products?add?constraint?FK_BelongInlay?foreign?key?(SubIdInlay) ??references?DictSub?(SubId)?on?delete?restrict?on?update?restrict; alter?table?Products?add?constraint?FK_BelongMaterial?foreign?key?(SubIdColor) ??references?DictSub?(SubId)?on?delete?restrict?on?update?restrict; alter?table?Products?add?constraint?FK_BelongMoral?foreign?key?(SubIdTopLevel) ??references?DictSub?(SubId)?on?delete?restrict?on?update?restrict; alter?table?Products?add?constraint?FK_BelongTopLevel?foreign?key?(SubIdMoral) ??references?DictSub?(SubId)?on?delete?restrict?on?update?restrict;
六、下載程序、幫助、視頻
最全php程序員工具箱:http://tool.php.cn/
MySQL5.7.17安裝包官網下載地址:?http://tool.php.cn/
MYSQL 5.7.12下載地址:http://tool.php.cn/
SQLPro for Mysql1.0.13下載地址:http://tool.php.cn/
文檔中沒有您可以查幫助:
相關推薦:
# linux# 數據庫# php# mysql# windows# http# sql# 字符串# html# python# 接口# https# Java# json# 架構# redis# 算法# 線程# oracle# select# 數據結構# 數據類型# microsoft# 分布式# for# NULL# delete# table# 多線程# default# 正則表達式# navicat# database# int# count# 運算符# date# timestamp# char# 字符串類型# .net# perl# ruby# 人工智能# Float# double# 數字類型# 服務器網絡# ux