1.數據庫:高效的存儲和處理數據的介質(介質主要有兩種:硬盤和內存)。redis
2.數據庫的分類:
一:按數據庫存儲介質的不一樣
1)關係型數據庫DBMS
2)非關係型數據庫NoSQL(not only SQL)算法
3.數據庫產品:
一:關係型數據庫產品:
1)大型:Oracle、DB2
2)中型:SQLServer、Mysql
3)小型:access
二:非關係型數據庫產品:
membird、mongodb、redissql
4.兩種數據庫的區別:
一:關係型數據庫:安全(保存在磁盤數據基本不可能丟失)、浪費空間
二:非關係型數據庫:效率高(保存在磁盤)、數據(斷電)容易丟失mongodb
5.關係型數據庫:數據庫
(1)關係型數據庫:是一種創建在關係模型(數學模型)上的數據庫。express
(2)關係模型:一種創建在關係上的模型,關係模型包含三個方面:
數據結構:解決數據存儲的問題、二維表(行、列)
操做指令集合:全部的SQL語句
完整性約束:表內數據約束(字段與字段),表與表之間的約束(外鍵)編程
(3)關係型數據庫的設計?
從須要存儲的需求中分析,若是是一類數據(實體)應該設計成一張二維表,
表是由表頭(字段名:用來規定數據的名稱)和數據(實際存儲的數據單元)部分組成。
案例:分析教學系統進行處理:講師負責教學,教學生,在教室教學生
1)找出系統中存在的實體:
講師表、學生表、班級表
2)找出實體中存在的數據信息:
講師:姓名、性別、年齡、工資
學生:姓名、性別、學號、學科
班級:班級名稱、教室編號數組
(4)關係型數據庫維護的關係:維護實體內部,實體與實體之間的聯繫。安全
(5)服務器
(6)
-- ============================
數據庫操做:
一:建立:
CREATE DATABASE DBNAME [DEFAULT] CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
字符集:CHARACTER SET UTF8 CHARACTER SET = CHARSET
校對集:COLLATE UTF8_GENERAL_CI CI不區分大小寫、CS區分大小寫
###### 校對集依賴於字符集
#顯示全部的校對集: SHOW COLLATION [LIKE 'pattern(%_)']
#顯示全部的字符集:SHOW CHARACTER SET [LIKE 'pattern(%_)'] CHARACTER SET = CHARSET
例子:
CREATE DATABASE 中國 DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
SET NAMES GBK; -- 告訴服務器SQL使用的編碼
二:刪除:DROP DATABASE DBNAME;
三:查詢:
1)查看數據庫:SHOW DATABASES [LIKE 'pattern(%_)'];
2)查看數據庫建立語法:SHOW CREATE DATABASE DBNAME;
四:修改數據庫:
1)修改數據庫名稱:低版本支持(5.1.7)、高版本不支持(5.1.23)
2)修改數據庫字符集:ALTER DATABASE DBNAME [DEFAULT] CHARACTER SET GBK/UTF8
3)修改數據庫校對集:ALTER DATABASE DBNAME [DEFAULT] COLLATE UTF8_GENERAL_CI
4)修改字符集和校對集:ALTER DATABASE DBNAME [DEFAULT] CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
五:進入數據庫環境:USE DBNAME[;]
表操做:
一:建立表:
CREATE TABLE [IF NOT EXISTS] [DBNAME.]TABLENAME(
字段名稱1 數據類型1 約束1,
字段名稱2 數據類型2 約束2,
......
字段名稱n 數據類型n 約束n
)[表選項];
IF NOT EXISTS:檢查做用
表選項:控制表的表現:
1)字符集:CHARACTER SET/CHARSET 具體字符集、保證表中存儲數據的字符集
2)校對集:COLLATE 具體的校對集
3)存儲引擎:ENGINE具體的存儲引擎(innodb、myisam)
二:刪除數據表:
DROP TABLE TABLENAME1,TABLENAME2,... ;
當刪除數據表的SQL指定執行以後,該表和表中的數據都會被刪除。
******刪除有危險,操做需謹慎(不可逆)
三:查看錶
1)查看錶:SHOW TABLES [LIKE 'pattern(%_)'];
2)查看錶建立語法:SHOW CREATE TABLE TABLENAME \G (縱向)\g(橫向)
3)查看錶結構:SHOW COLUMNS FROM/DESC/DESCRIBE TABLENAME;
四:修改數據表:
表自己存在,還包含字段:
1)修改表自己:
修改表名:RENAME TABLE OLDTABLENAME TO NEWTABLENAME;
修改表選項:ALTER TABLE TABLENAME OPTION [=] OPTIONVALUE
例如:ALTER TABLE t_test1 CHARSET [=] GBK;
2)修改表字段:
新增字段:
ALTER TABLE TABLENAME ADD COLUMNNAME 數據類型 [約束] [POSITION(FIRST/AFTER)];
FIRST : 第一個位置。
AFTER : 在哪一個字段的後面。
刪除字段:
ALTER TABLE TABLENAME DROP COLUMNNAME;
修改字段:
修改字段類型或屬性:
ALTER TABLE TABLENAME MODIFY COLUMNNAME 數據類型 [屬性] [POSITION(FIRST/AFTER)];
修改字段名稱:
ALTER TABLE TABLENAME CHANGE OLDCOLUMNNAME NEWCOLUMNNAME 數據類型 [屬性] [POSITION(FIRST/AFTER)];
******若是表中字段已經存在數據,刪除字段會刪除該字段的全部數據,並且是不可逆的。
數據操做:
一:新增數據:
INSERT INTO TABLENAME VALUES(...),(...),...;
INSERT INTO TABLENAME(FIELD1,FIELD2,FIELD3...) VALUES(...),(...),...;
******有時候使用VALUE代替VALUES也能夠。
二:刪除數據:
DELETE FROM
三:查看數據
SELECT */COLUMN1,COLUMN2,... FEROM TABLENAME1,TABLENAME2,... [WHERE條件];
四:更新數據:
UPDATE TABLE1,TABLE2,... SET COLUMN1=VALUE1,COLUMN2=VALUE2,...[WHERE條件];
中文數據問題:
SHOW CHARACTER SET [LIKE 'pattern(%_)']; -- 查看數據庫支持的字符集
SHOW VARIABLES [LIKE 'pattern(%_)']; -- 查看數據庫變量
查看服務器對外使用的字符集:
SHOW VARIABLES LIKE 'CHARACTER_SET%';
修改服務器默認客戶端使用的字符集:
SET CHARACTER_SET_CLIENT=GBK;
修改服務器給定客戶端使用的字符集:
SET CHARACTER_SET_RESULTS=GBK;
******SET 變量=值; -- 只是會話級別的修改,只對當前客戶端窗口有效。
設置服務器對客戶端的字符集的認知:
SET NAMES GBK;
校對集:
數據比較的方式。
三種格式:
_bin:binary,二進制進行比較,取出二進制位,一位一位的比較,
從左到右,區分大小寫。
_cs:case sensitive,大小寫敏感。
_ci:case insensitive,大小寫不敏感。
查看數據庫全部的校對集:
SHOW COLLATION [LIKE 'pattern(%_)'];
******校對集應用:
只有當數據進行比較的時候,校對集纔會生效。
校對集必須在沒有數據以前聲明好,
若是有了數據,再聲明校對集,那麼校對集對數據無效。
列屬性:
空屬性:NULL、NOT NULL
默認值:DEFAULT
註解:COMMENT
主鍵:PRIMARY KEY
惟一鍵:UNIQUE KEY
自增加:AUTO_INCREMENT
CREATE TABLE t_pri(
stu_code VARCHAR(50) PRIMARY KEY,
-- 第一種方式建立PRIMARY KEY
-- 優勢:很是直接、缺點:只能只用一個字段;
stu_name VARCHAR(20) NOT NULL
)ENGINE INNODB DEFAULT CHARSET UTF8 COLLATE UTF8_GENERAL_CI;
CREATE TABLE db_test1.t_pri2(
univ_code VARCHAR(50),
stu_code VARCHAR(50),
PRIMARY KEY(univ_code,stu_code)
-- 第二種方式建立PRIMARY KEY
-- 能夠建立複合主鍵
)ENGINE INNODB DEFAULT CHARSET UTF8 COLLATE UTF8_GENERAL_CI;
-- 第三種方式:追加主鍵
ALTER TABLE TABLENAME MODIFY COLUMNNAME ...;
ALTER TABLE TABLENAME ADD PRIMARY KEY(主鍵字段);
刪除主鍵:一個表只能有一個主鍵,因此刪除起來很方便
ALTER TABLE TABLENAME DROP PRIMARY KEY;
自增加:AUTO_INCREMENT
如何肯定下一次自增加呢?
經過查看錶的建立語句就能夠看到。
修改下一個自增加的值:
只能向上修改,向下修改對自增加無效。
ALTER TABLE TABLENAME AUTO_INCREMENT = 值;
查看自增加變量:
SHOW VARIABLES LIKE 'AUTO_INCREMENT%';
修改自增加起始值、步長是對整個數據的修改
會話級修改(SET):
SET AUTO_INCREMENT_INCREMENT = 值;
SET AUTO_INCREMENT_OFFSET = 值;
刪除自增加:
ALTER TABLE TABLENAME MODIFY COLUMNNAME DATATYPE;
惟一鍵:UNIQUE KEY
一張表能夠有多個惟一鍵。
刪除惟一鍵:(刪除索引)
ALTER TABLE TABLENAME DROP INDEX 索引名稱;
索引:
幾乎全部的索引都是創建在字段之上。
索引:系統根據某種算法,將已經有的數據(將來可能新增的數據),
單獨創建一個文件;可以實現快速的匹配數據,而且可以快速的找到對應
表中的記錄。
索引的意義:
提高數據的查詢效率、
約束數據的有效性。
增長索引的前提條件:
索引自己會產生索引文件(
有時候可能比數據文件大)
會很是耗費磁盤空間。
若是某個字段須要做爲查詢的常用,
那麼可使用索引(必定會想辦法增長)
若是某個字段須要進行數據的有效性約束,
也可能使用索引。
MySQL中提供了多種索引:
1)主鍵索引:PRIMARY KEY
2)惟一索引:UNIQUE KEY
3)全文索引:FULLTEXT INDEX
4)普通索引:INDEX
全文索引:FULLTEXT
針對文章內部的關鍵字進行索引。
全文索引的最大問題:在於如何肯定關鍵字。
英文很容易:英文單詞與單詞之間都有空格。
中文肯定關鍵字很難:
沒有空格、並且中文能夠各類隨意組合(分詞:SPHINX)
修改索引:
ALTER TABLE TABLENAME ADD INDEX INDEXNAME ON COLUMNNAME 數據類型;
表關係:
將實體與實體之間的關係最終反應到數據庫表的設計上來,
將關係分爲三種:一對1、一對多(多對一)、多對多
全部的關係都是指表與表之間的關係。
範式:
NORMAL FORMAT,是一種離散數學中的知識,是爲了
解決一種數據的存儲與優化的問題:保存數據存儲以後,
凡是可以經過關係找出來的數據,堅定再也不重複存儲。
範式的終極目標是爲了減小數據的冗餘。
範式:是一種分層結構的規範。
能夠分爲六層。每一層都比上一層更加嚴格。
若要知足下一層的範式,前提是須要知足上一層的範式。
1NF、2NF、3NF、4NF、5NF、6NF
MYSQL屬於關係型數據庫:
有空間的浪費,爲了致力於節省存儲空間的,與範式全部
解決的問題不謀而合,在設計數據庫的時候,會利用範式來知
指導設計。
可是數據庫不單是要解決空間問題、還要保證效率問題、
可是範式只爲解決空間問題,因此數據庫的設計又不可能徹底按照範式的要求實現,通常狀況下,數據庫設計
只須要嗎,知足前三種範式的需求便可。
範式在數據庫的設計當中具備指導的意義,
但不是強制規範。
-- =================================================
數據的高級操做:
1.新增數據:
基本語法:
INSERT INTO 代表[(字段列表)] VALUES(值列表1),(值列表2)...(值列表n);
在插入數據的時候,假設主鍵對應的值已經存在
插入時必定會失敗。
問題:主鍵衝突?
當主鍵存在衝突的時候、咱們能夠選擇性的進行處理、
更新和替換。
主鍵衝突時更新操做?
INSERT INTO 代表[(字段列表(包含主鍵))]
VALUES(值列表) ON DUPLICATE KEY UPDATE
字段=新值;
主鍵衝突時替換操做?
REPLACE INTO 代表[(字段列表(包含主鍵))] VALUES(值列表);
蠕蟲複製:
蠕蟲:分裂生長
從已有的數據中去獲取數據,而後又將數據進行新增操做、
數據成倍的增長。
表建立的高級操做:從已有的表中新建表結構。
CREATE TABLE 表名 LIKE 數據庫名稱.表名稱;
蠕蟲複製:先查詢出表數據,而後將查出來的數據新增一遍
INSERT INTO 代表[(字段列表)] SELECT 字段列表/* FROM 表名;
蠕蟲複製的意義:
從已有表複製數據到新表。
能夠迅速讓表中的數據膨脹到必定的數量級別、
測試表的壓力和效率。
2.更新數據:
基本語法:
UPDATE 表名 SET 字段=值 [WHERE條件];
高級新增語法:
UPDATE 表名 SET 字段=值 [WHERE條件][LIMIT 更新數量];
3.刪除數據:
與更新相似、可使用LIMIT來限制刪除數量
DELETE FROM 表名 [WHERE條件][LIMIT 刪除數量];
刪除:若是表中存在自增加、那麼當刪除表中數據以後、
自增加不會還原。
先刪除表、又新建立表:
清空表、重置自增加。
TRUNCATE 表名稱;
4.查詢數據:
完整語句結構:
SELECT [SELECT選項(ALL(默認)、DISTINCT)] 字段/* FROM
表名稱1,表名稱2,...,表名稱n
[WHERE子句] [GROUP BY子句] [HAVING 子句]
[ORDER BY子句] [LIMIT 子句];
字段別名:
當數據進行查詢出來的時候、有時候名字不必定知足需求(多表查詢時),
可能會出現字段重名的狀況、這時就須要對字段名稱進行重命名、別名
字段 [AS] 別名
外鍵(FOREIGN KEY):外面的鍵(再也不本身的表)
若是一張表中有一個字段(非主鍵)指向另外一張表的
主鍵,那麼該字段被稱爲外鍵。
外鍵能夠在建立表的時候或建立表以後增長(可是要考慮數據的問題)
一張表能夠有多個外鍵。
外鍵的建立方式:
1.建立表的時候增長外鍵:
在全部表字段以後,格式:
[CONSTRAINT 外鍵名字(方便維護外鍵)] FOREIGN KEY(外鍵字段) REFERENCES(外鍵的引用) 另外一張表(表字段);
2.在新增表以後增長外鍵:
ALTER TABLE 表名 ADD [CONSTRAINT 外鍵名字] FOREIGN KEY REFERENCES 另外一張表(表字段);
修改(刪除)外鍵:
外鍵不可修改、只能先刪除、後新增。
格式:
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名字;
(一張表能夠有多個外鍵、可是每一個外鍵的名字不能相同!)
外鍵的刪除不能經過查看錶結構語句體現、
能夠經過查看錶的建立語句體現。
外鍵的做用:
默認有兩點做用:
1.對父表的約束:
父表進行讀寫操做時,(刪除、更新都涉及到主鍵自己),
若是對應的主鍵在表中已經被數據所引用,那麼就不容許操做。
2.對子表的約束:子表在進行數據的讀寫操做時,外鍵字段值
在父表中不存在、則操做失敗。
外鍵條件:
1.外鍵要存在:首先必須保證表的存儲引擎是INNODB(MYSQL 默認的存儲引擎)
若是不是INNODB存儲引擎、那麼外鍵雖然能夠建立成功、
可是沒有約束效果
2.外鍵字段的字段類型(列類型)必須與父表的主鍵類型徹底一致。
3.一張表中的外鍵名字不能重複。
4.增長外鍵的字段數據已經存在,必須保證數據和父表中的數據相對應。
外鍵的約束模式:
外鍵的約束指的是外鍵的做用。
上面講得做用,都是外鍵默認的做用。
外鍵有三種約束模式:(都是針對父表的約束)
1.DISTRICT:嚴格模式(默認的)、父表不能刪除或更新一個已經被子表數據引用的記錄。
2.CASCADE:級聯模式、父表的操做、對應的子表也跟着被刪除。
3.SET NULL:置空模式、父表操做以後、子表對應的數據(外鍵字段)被置空。
一般一個合理的約束模式:
刪除的時候子表置空、更新的時候子表級聯操做。
指定外鍵約束模式的語法格式:
FOREIGN KEY(外鍵字段) REFERENCES 父表(主鍵字段)
ON DELETE SET NULL
ON UPDATE CASCADE;
****** 刪除置空的前提條件:外鍵字段容許爲空。
若是不知足條件、外鍵沒法建立。
外鍵雖然很強大、可以進行各類約束、
可是對於JAVA來講、外鍵的約束下降了JAVA對程序的可控性、
一般在實際開發中,不多使用外鍵來處理。
外鍵在關係型數據庫中的地位很是重要、可是咱們不多使用。
聯合查詢:
講屢次查詢(多SELECT語句),在記錄數上進行拼接(字段不增長)。
基本語法:
多條SELECT語句構成:每一條SELECT語句獲取的字段數必須嚴格一致。
格式:
SELECT 語句1
UNION[UNION ALL]
SELECT 語句2
...
UNION[UNION ALL]
SELECT 語句n;
UNION 選項:鏈接兩個SELECT語句。
UNION ALL:保留全部(無論重複)
DISTINCT:去重(整個重複)默認的。
聯合查詢只要求字段數同樣,
聯合查詢的意義:
1.查詢同一張表、可是需求不一樣。
2.多張表的結構是徹底同樣的,保存的數據(結構)也是同樣的。
【數據庫分表】
1.垂直分表。
2.水平分表。
******聯合查詢中ORDER BY 的使用:
在聯合查詢中要使用ORDER BY進行排序、
要使用"()"將SELECT語句括起來
******要使得聯合查詢中的ORDER BY語句生效,
SELECT查詢語句還得搭配LIMIT使用。
子查詢:SUB QUERY,就是在某個查詢的結果之上進行的。
(一條SELECT語句內包含了另一條SELECT語句。)
子查詢分類:
子查詢有兩種分類方式:
1.按位置分類。
2.按結果分類。
按位置分類:
1)FROM 子查詢:子查詢跟在FROM以後。
2)WHERE 子查詢:子查詢出如今WHERE條件中。
3)EXISTS子查詢:子查詢出如今EXISTS裏面。
按結果分類:
根據子查詢獲得的數據進行分類(
理論上任何一個查詢的結果均可以理解爲二維表)
1)標量子查詢:結果是一行一列。
2)列子查詢:一列多行(一排記錄)
3)行子查詢:子查詢獲得的結果是多列一行或多行多列。
1)、2)、3)出如今WHERE以後。
4)表子查詢獲得的結果是多行多列(出如今FROM以後)
標量子查詢:
SELECT 一個字段名 FROM 表名 WHERE 字段名=(SELECT 字段名 FROM ...)
列子查詢:
SELECT id FROM ... WHERE id IN(SELECT id FROM ...)
幾個相似的條件:ALL 、SOME 、ANY
ANY 、SOME 在確定句中兩個條件是同樣的。
ANY 、SOME 在否認句中是不同的。
=ANY
=SOME
=ALL
!=ANY
!=SOME
!=ALL
******NULL空字段值不參與比較。
行子查詢:
SELECT * FROM ... WHERE (age,height) = (SELECT MAX(age),MAX(height) FROM ...)
******行元素的比較(age,height) = (SELECT MAX(age),MAX(height) FROM ...)
表子查詢:
子查詢結果返回的是一個多行多列的二維表。
子查詢返回的結果當作二維表來使用。
EXISTS子查詢:
EXISTS:是否存在的意思。
用來判斷某些條件是否知足、一般是跨表的條件。
EXISTS是接在WHERE以後,返回的結果是0或1。
SELECT * FROM ... WHERE EXISTS(SELECT * FROM ... WHERE ...)
視圖:view
是一種有結構(行、列)可是沒結果(結構中不真實存放數據)的虛擬表。
虛擬表的結構來源不是本身定義,而是從對應的基表中產生(視圖的數據來源)。
建立視圖基本語法:
CREATE VIEW 視圖名稱
AS (SELECT ... [普通查詢|鏈接查詢|聯合查詢|子查詢]);
建立單表視圖:
基表來源只有一個。
建立多表視圖:
基原本源至少有兩個。
*注意字段重名問題。
查看視圖:
查看視圖的結構。
SHOW TABLES [LIKE ''];
SHOW CREATE TABLE/VIEW 視圖名稱;
DESC 視圖名稱;
使用視圖:
主要是爲了查詢,將視圖當作表同樣查詢就OK.
視圖的執行:
其實本質就是執行封裝的SELECT語句。
應用於封裝基表的查詢。
修改視圖:
視圖自己不可修改,可是視圖自己的來源是能夠修改。
修改視圖語法:
ALTER VIEW 視圖名稱 AS 新的SELECT語句;
刪除視圖:
語法:DROP VIEW 視圖名稱;
視圖的意義:
1.視圖能夠減小SQL語句,將一條複雜的查詢語句使用視圖進行保存,
之後能夠直接對視圖進行操做。
2.數據安全,視圖操做主要是針對查詢的,若是的視圖進行結構處理,
不會影響基表數據(相對安全)。
3.視圖每每是在大項目中使用,並且是多系統使用.
能夠對外可提供有用的數據,隱藏關鍵數據,數據安全。
4.視圖能夠對外提供友好型,不一樣的視圖提供不一樣的數據,
對外好像專門設計。
5.視圖能夠更好的進行權限控制。
視圖數據操做:
視圖確實是能夠進行數據寫操做的,可是有不少限制。
將數據直接在視圖上進行操做。
視圖新增數據:
單表視圖能夠新增數據、可是表中包含不爲空字段可是不出如今視圖中
就不能夠插入。
視圖刪除數據:
多表視圖不能刪除。
單表視圖能夠刪除。
視圖更新數據:
單表、多表視圖均可以更新數據。
******視圖更新數據限制:WITH CHECK OPTION , 若是對視圖
進行新增的時候,限定了某個字段有限制:
那麼對視圖進行數據更新操做,系統會進行驗證:要
保證更新以後,數據依然能夠被實體查詢出來,不然不讓更新。
視圖算法:
系統對視圖以及外部查詢視圖的SELECT語句的一種解析方式。
視圖算法分爲三種:
1.UNDEFINED:未定義(默認的),
這不是一種實際使用的算法,告訴系統,視圖沒有定義算法。
2.TEMPTABLE:臨時表算法。系統應該先執行視圖的SELECT
語句,後執行外部查詢語句。
3.MERGE:合併算法,系統現將視圖對應的SELECT語句與外部視圖的
的算法進行合併查詢,效率高。
指定視圖算法的語法規則:
CREATE ALGORITHM=視圖算法 VIEW 視圖名稱 AS SELECT ...;
如何選用視圖算法:
若是視圖語句中會包含一個查詢子句(五子句),並且頗有可能
順序比外部查詢語句高後,必定要使用TENPTABLE算法,
其餘狀況能夠不用指定(默認便可)。
數據的備份與還原:
備份:將當前已有的數據或者記錄保留。
還原:將已經保存的數據恢復到對應表中。
爲何要作備份還原?
1.防止數據丟失:被盜,誤操做。
2.保存數據記錄。
數據備份還原的方式有不少種:
1.數據表備份
2.單表數據備份
3.SQL備份
4.增量備份
數據表備份:不須要經過sql備份:
直接進入到數據庫文件夾複製對應的表結構以及
數據文件,之後還原的時候,直接將備份的內容放進去便可。
數據表備份有前提條件:
根據不一樣的存儲引擎有不一樣的區別
存儲引擎:
MYSQL進行數據存儲的方式:
1.INNODB
2.MYISAM
對比MYISAM和INNODB:
INNODB:自由表結構,數據所有存儲到ibdata1文件中
依賴當前數據庫
MYISAM:表、數據、索引所有單獨分開存儲。
不依賴任何數據庫,直接放到對應的數據庫下便可使用。
單表數據備份:
每次只能備份一張表,只能備份數據,不能備份表結構。
一般的應用:將表中的數據進行導出到文件。
備份:從表中選出一部分數據保存到外部的文件。
語法:(前提:外部文件不存在)
SELECT */字段列表 INTO OUTFILE 文件所在路徑 FROM 數據源;
高級備份語法:
本身制定字段和行的處理方式。
字段處理FIELDS:
ENCLOSED BY : 字段使用什麼內容包裹,默認是空字符串''。
TERMINATED BY : 字段以什麼結束,默認是tab鍵'\t'
行處理LIENS:
STARTING BY : 每行以什麼開始,默認是''空字符串
TERMINATED BY : 每行以什麼結束,默認是換行符'\r\n'
SELECT */字段列表 INTO OUTFILE 文件所在路徑
FIELDS
...
LINES
...
FROM 數據源;
單表數據還原:
將一個外部保存的數據恢復到表中(若是表不存在,那麼SORRY)
LOAD DATA INFILE 文件路徑 INTO TABLE 表名
FIELDS
...
LINES
...;
SQL備份:
備份的是SQL語句,系統就會對錶結構以及數據進行處理,
編程對應的SQL語句,而後進行備份,還原的時候只要執行
SQL指令就能夠了。
MYSQL自己沒有提供備份的指令。
須要利用MYSQL提供的備份軟件:MYSQLDUMP.EXE指令
MYSQLDUMP.EXE也是一種客戶端,須要操做服務器,必須進行
鏈接認證。
語法:·
MYSQLDUMP/MYSQLDUMP.EXE -H ip -P 端口 -U 用戶 -P 密碼
數據庫名稱 [數據表1][數據表2]...[數據表n]
> 文件所在路徑
整個數據庫備份:
MYSQLDUMP/MYSQLDUMP.EXE -H ip -P 端口 -U 用戶 -P 密碼
數據庫名稱
> 文件所在路徑
SQL還原:
兩種方式:
1.MYSQL客戶端還原:
MYSQL/MYSQL.EXE -H ip -P 端口 -U 用戶 -P 密碼 數據庫名稱 < 備份文件路徑
2.使用SQL指令:SOURCE
語法:SOURCE 文件所在路徑;
SQL備份的以優缺點:
1.優勢:能夠備份表、庫結構。
2.缺點:會浪費空間(增長額外的SQL指令)。
增量備份:
不是針對數據或者SQL指令進行備份,
是針對MYSQL服務器的日誌文件進行備份。
增量備份:指定時間段開始備份,備份數據不會重複,
並且全部的操做都會備份。
事務安全:
事務(transaction):一系列要發生的連續的操做。
事務安全:一種保護連續操做同時知足(實現)的一種機制。
事務安全的意義:保證數據操做的完整性。
事務操做:
事務操做分爲兩種:
1.自動事務
2.手動事務
手動事務:
1.開啓事務:告訴系統一下全部的增刪改操做,不要直接操做數據表,
先存放到事務日誌。
START TRANSACTION;
2.操做數據表。
3.關閉事務:
選擇性的將日誌文件中的操做結果保存到數據表或
清空事務日誌。
a)提交事務:COMMIT
b)回滾事務:ROLLBACK
使用事務的前提:
數據庫的存儲引擎必須是INNODB(免費)、BDB(收費)
事務原理:
事務操做原理:事務開啓以後,全部的操做都會保存到事務日誌,
事務日誌只有在獲得COMMIT命令纔會同步到數據表,其它任何命令
都會清空事務日誌。
客戶端 服務端 數據庫
1.鏈接認證: 驗證身份,創建鏈接
開啓一個臨時事務日誌(當前用戶當次鏈接有效)
臨時日誌文件
2.直接SQL增刪改操做 接收SQL語句,執行SQL語句: ---->同步到數據庫
結果直接寫入到數據表。
3.開啓事務: 改變原來的操做機制:
後續的全部寫操做,先寫入臨時
日誌文件。
SQL操做: 接收SQL語句,執行SQL語句:
結果先寫入臨時事務日誌文件。
查詢操做結果: 會從數據表查詢,通過臨時日誌文件
結果加工後返回。
事務結束:COMMIT/ 清空臨時事務日誌文件:
ROLLBACK/ COMMIT會同步日誌結果到數據表,
其它 ROLLBACK是直接清空日誌文件。
事務:回滾點
回滾點:在某個成功的操做完成以後,
後續的操做有可能成功或失敗,可是無論後續的
操做時成功或失敗,前面操做都已經成功,能夠在當前成功的
位置,設置一個回滾點,能夠供後續失敗操做返回到該位置,
而不是返回全部操做。
設置回滾點語法:
SAVEPOINT 回滾點名稱;
回滾到回滾點語法:
ROLLBACK TO 回滾點名稱;
自動事務處理:
在MYSQL中,默認的都是自動事務處理,
用戶操做完會當即同步到數據表中。
自動事務:系統經過AUTOCOMMIT變量控制。
查看系統自動事務變量:
SHOW VARIABLES LIKE 'AUTOCOMMIT';
關閉自動事務:
SET AUTOCOMMIT = OFF;
注意:一般狀況下都會使用自動事務。
事務特性:
事務的四大特性:
1.ATOMIC原子性。事務的整個操做是一個總體,不可分割,
要麼所有成功,要麼所有失敗。
2.CONSISTENCY,一致性,事務操做先後,數據表中的數據沒有變化。
3.ISOLATION,隔離性,事務操做相互隔離不受影響。
4.DURBILITY,持久性,數據一旦提交,不可改變,永久的改變數據表數據。
鎖機制:
在MYSQL中,INNODB存儲引擎默認使用的是行鎖,
當在事務操做的過程當中,若是沒有使用索引,SQL操做
就會全表檢索,鎖機制就會自動升級到表鎖。
事務的隔離級別:
READ UNCOMMITTED
READ COMMITTED
REAPTABLE READ
SERIALIZABLE
SQL變量:
變量分爲兩種:
系統變量和自定義變量。
查看系統變量:
SHOW VARIABLES [LIKE '%_'];
查看系統具體變量值:
SELECT @@變量名1,@@變量名2,...,@@變量名n;
修改系統變量:
兩種方式:
會話級別的修改和全局級別的修改
會話級別:
SET 變量名 = 值;或SET @@變量名 = 值;
全局級別:
SET GLOBAL 變量名 = 值;
自定義變量:
系統爲了區分系統變量,
規定用戶自定義變量必須使用一個@符號。
定義自定義變量:
SET @變量名 = 值;
SET @變量名 := 值;
查看自定義變量:
SELECT @變量名;
MYSQL容許從數據表中獲取數據,而後賦值給變量,
兩種方式:
方案一:
SELECT @變量名1 := 字段名1,@變量名2 := 字段名2,...,@變量名n := 字段名n FROM ...;
方案二:
只有賦值,不看結果,要求很嚴格,數據記錄最多隻容許獲取一條,
由於MYSQL不支持數組。
SELECT 字段名1,字段名2,...,字段名n FROM ... INTO 變量名1,變量名2,...,變量名n;
******全部的自定義變量都是會話級別,當次用戶鏈接有效,不區分數據庫。
MYSQL觸發器TRIGGER:
需求:有兩張表,一張訂單表,一張商品表,每生成一個訂單,
意味着商品的庫存要對應的減小。
觸發器trigger:事先爲某張表綁定好一段代碼,當表中的某些內容
發生改變的時候(增刪改),系統會自動觸發(執行)代碼。
觸發器:事件類型、觸發事件、觸發對象
事件類型:增INSERT 刪DELETE 改UPDATE 三種類型。
觸發時間:BEFORE AFTER
觸發對象:表中的每一條記錄(行)。
******一張表中只能擁有一種觸發時間的一種類型的觸發器:
最多一張表有6個觸發器。
建立觸發器:
語法格式:
-- 臨時修改語句結束符
-- 自定義符號:後續代碼中只有遇到自定義符號纔算結束。
DELIMITER
CREATE TRIGGER 觸發器名稱 事件類型 ON 表名 FOR EACH ROW
BEGIN -- 表明左大括號,開始
END -- 表明右大括號,結束
-- 語句結束符
-- 自定義符號
-- 將臨時結束符號修正:
DELIMITER ;
***在MYSQL中,沒有大括號和小括號之說。
對需求製做觸發器:訂單生成一個,商品庫存對應減小。
查看觸發器:
SHOW TRIGGERS [LIKE '%_']
查看觸發器建立語句:
SHOW CRAETE TRIGGER 觸發器名稱;
***全部的觸發器都會保存到一張表中:INFOMATION_SCHEMA.TRIGGERS
使用觸發器:
不須要手動調用,而是某種狀況發生時,觸發器會自動觸發(執行)。
修改觸發器和刪除觸發器:
觸發器不能修改、只能先刪除後新增。
刪除觸發器語法:
DROP TRIGGER 觸發器名稱;
觸發器記錄:
觸發器記錄:是使無論觸發器是否觸發了,
只要是當某種操做準備執行,系統就會將當前要操做的記錄的當前狀態
和即將執行以後的新的狀態分別保留下來,供觸發器使用。其中要操做當前狀態
保存到old中,操做以後的可能形態保存到new中.
觸發器的意義:
能夠很好的協調錶內部的數據處理順序和關係.
可是從Java角度出發, 觸發器會增長數據庫維護的難度, 因此較少使用觸發器.
MYSQL代碼執行結構:
循環控制: 在循環內部進行循環判斷和控制.
Mysql中沒有對應continue和break. 可是有替代品.
Iterate: 迭代 , 相似continue, 後面的代碼不執行, 循環從新來過.
Leave: 離開, 相似break,整個循環接收.
使用方式: Iterate/Leave 循環名字;
MYSQL代碼執行結構:
1.順序結構(默認)
2.判斷結構
3.循環結構
2.判斷結構:
結構語法:
IF express1 THEN handlerResult1
ELSEIF express2 THEN handlerResult2
...
ELSEIF expressn THEN handlerResultn
ELSE handlerResultELSE
END IF;
3.循環結構:
循環名稱:WHILE ... DO ... END WHILE;
循環名稱:REPEAT ... UNTIL ... END REPEAT;
循環名稱:LOOP ... 判斷語句(iterate/leave) END LOOP;
MYSQL中if , case 語句使用總結:
1.IF函數:
IF(express1,express2,express3)
express1爲true,函數返回express2,不然返回express3.
2.IFNULL函數:
IFNULL(express1,express2)
express1不爲空返回自己,不然返回express2.
3.CASE表達式:
結構:
CASE 字段名
WHEN 值1 THEN 結果值1
WHEN 值2 THEN 結果值2
...
WHEN 值n THEN 結果值n
ELSE 結果值else
END
4.IF判斷語句:
語法格式:
IF express1 THEN handlerResult1
ELSEIF express2 THEN handlerResult2
...
ELSEIF expressn THEN handlerResultn
ELSE handlerResultELSE
END IF;
MYSQL函數:
函數:講一段代碼塊封裝到一個結構中,在須要執行
代碼塊的時候,調用結構執行便可。
系統函數:系統定義好的函數,直接調用便可。
任何函數都有返回值,所以函數的調用是經過SELECT調用。
MYSQL中,字符串的基本操做單位(最多見的是字符)
自定義函數:
函數的要素:
1.函數名
2.參數列表(形參、實參)
3.返回值
4.函數體(做用域)
建立函數:
格式:
DELIMITER $$
CREATE FUNCTION 函數名([形參列表]) RETURNS 數據類型
BEGIN
函數體;
RETURN 返回值;
END
$$
DELIMITER ;
自定義函數和系統函數的調用方式同樣。
查看函數:
SHOW FUNCTION STATUS [LIKE '%_'];
******函數屬於特定的數據庫下。
查看函數的建立語法:
SHOW CREATE FUNCTION 函數名;
修改和刪除函數:
函數不能修改,只能先刪除再建立。
刪除語法:
DROP FUNCTION 函數名;
函數參數:
參數分爲兩種:
定義的參數叫形參。
調用時的參數叫實參。能夠是數值,也能夠是變量。
形參:必須指定類型。
******@定義的變量爲全局變量,沒有@定義的變量爲局部變量。
全局變量能夠在任何地方使用,局部變量只能在函數內部使用。
局部函數只能在函數體執行以前定義。
全局變量聲明語法:
SET @變量名 = 值;
局部變量聲明語法:
DECLARE 變量名 變量類型 DEFAULT 值;
******要修改變量必須使用SET關鍵字,無論是全局變量仍是局部變量。
存儲過程:
存儲過程簡稱過程PROCEDURE,是一種用來處理數據的方式。
存儲過程是一種沒有返回值的函數。
建立存儲過程:
語法格式:
DELIMITER $$
CREATE PROCEDURE 存儲過程名稱([參數列表])
BEGIN
過程體;
END
$$
DELIMITER ;
查看存儲過程:
SHOW PROCEDURE STATUS [LIKE '%_'];
查看存儲過程建立語法:
SHOW CREATE PROCEDURE 存儲過程名稱;
調用存儲過程:
存儲過程沒有返回值,意味着不能使用SELECT來調用。
CALL 存儲過程名稱([實參列表]);
修改和刪除存儲過程:
存儲過程只能先刪除後新增。
刪除存儲過程格式:
DROP PROCEDURE 儲存過程名稱;
存儲過程參數:
函數的參數須要數據類型指定, 過程比函數更嚴格.
存儲過程還有本身的類型限定: 三種類型
IN: 數據只是從外部傳入給內部使用(值傳遞): 能夠是數值也能夠是變量
OUT: 只容許過程內部使用(不用外部數據), 給外部使用的.(引用傳遞: 外部的數據會被先清空纔會進入到內部): 只能是變量
INOUT: 外部能夠在內部使用,內部修改也能夠給外部使用: 典型的引用傳遞: 只能傳變量
******OUT和INOUT類型屬於引用傳遞,內部改變影響外部值。
******存儲過程對於變量的操做(返回)是滯後的: 是在存儲過程調用結束的時候,
纔會從新將內部修改的值賦值給外部傳入的全局變量.
******在存儲過程調用結束以後:OUT類型和INOUT類型會將內部 對應的局部變量值從新返回給傳入的對應全局變量。