Mysql快速入門


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類型會將內部 對應的局部變量值從新返回給傳入的對應全局變量。  

相關文章
相關標籤/搜索