MySql 學習之路-高階2

linux超發表於2018-06-26

目錄:

1.約束

2.ALTER TABLE

3.VIEW

1.約束

  說明:SQL約束用於規定表中的資料規則,如果存在違反約束的資料行為,行為會被約束終止,約束可以在建表是規定,也可以在建表後規定,通過ALTER TABLE 實現.

  語法:

CREATE TABLE TABLENAME
(
COLUMN_NAME1 DATA_TYPE(SIZE) CONSTRAINT_NAME,
COLUMN_NAME2 DATA_TYPE(SIZE) CONSTRAINT_NAME,
COLUMN_NAME3 DATA_TYPE(SIZE) CONSTRAINT_NAME
);

 約束有如下幾種常用:

NOT NULL                          -- 指示某列不能儲存NULL值
UNIQUE                            -- 保證某列的每行必須有唯一值
PRIMARY KEY                       -- 前2個約束的結合,每個表只能有一個PRIMARY KEY 約束    
CHECK                             -- 保證列中的值複合指定的條件
DEFAULT                           -- 規定沒有給列賦值時的預設值

針對以上約束,我們來看下具體的應用例項

  例項1:

1 CREATE TABLE TABLENAME
2 (
3 ID INT NOT NULL AUTO_INCREMENT,
4 NAME VARCHAR(255) UNIQUE ,
5 AGE INT ,
6 CITY VARCHAR(255) DEFAULT `CHINA`,
7 PRIMARY KEY (ID),
8 CHECK (AGE > 18)
9 );

如果給列起名字或者給多個列附加多個約束可以使用下面的方法

  例項2:

 1 CREATE TABLE TABLENAME
 2 (
 3 ID INT NOT NULL AUTO_INCREMENT,-- 自動填充此列 從1開始
 4 NAME VARCHAR(255) UNIQUE ,
 5 AGE INT ,
 6 CITY VARCHAR(255) DEFAULT `CHINA`,
 7 PRIMARY KEY (ID),
 8 CHECK (AGE > 18)
 9 CONSTRAINT 別名 約束名 (列1,列2,..)
10 );

如果多個列新增UNIQUE約束,第9行程式碼可以改成如下形式

CONSTRAINT UNIQUE_NAME UNIQUE (AGE,CITY)

如果多個列新增CHECK約束,第9行程式碼可以改成如下形式

CONSTRAINT CHECK_NAME CHECK (AGE>18 AND CITY = `CHINA`)

我們已經建立表的幾個約束,那麼如果我們執行如下SQL時會報錯

INSERT INTO TABLENAME VALUES(1,`XUECHAO`,22,`CH`);
INSERT INTO TABLENAME VALUES(2,`XUECHAO`,15,`CH`);

因為NAME已經新增了UNIQUE約束,AGE新增了CHECK約束

PS:我還是個菜鳥,理解的不是很全面, 我理解的約束就是這樣的,如果您有什麼不同的理解,可以評論區告訴我,很感謝!

2.ALTER TABLE

  說明:前面我們在建表的時候已經新增了約束,如果我們建表的時候沒有新增約束,那麼我們可以通過ALTER TABLE 在表後新增約束,下面來看看下面的例項

  例項1:

ALTER TABLE TABLENAME
ADD UNIQUE (ID);
或
ALTER TABLE TABLENAME 
ADD CONSTRAINT UN_NAME UNIQUE (ID , NAME);

新增別的約束也是同樣的原理和寫法

  說明:ALTER TABLE 能夠給表附加約束,還有另外一個用途,向表中新增新欄位,刪除欄位,修改欄位資料型別(我知道的就這些 ^_^)

  例項2:

1 ALTER TABLE TABLENAME ADD COLUMN SCORE INT;-- 新增欄位SCORE
2 
3 ALTER TABLE TABLENAME MODIFY SCORE VARCHAR(255); -- 修改欄位資料型別
4 
5 ALTER TABLE TABLENAME DROP COLUMN SCORE; -- 刪除欄位

檢視再補充吧,有點忙沒時間寫了。。。。。。。。。。。

 繼續….

3.VIEW

  說明:檢視是一張視覺化的表,是基於SQL語句的結果集的視覺化的表,檢視包含行和列,就像一個真實的表,檢視中的欄位就是來自一個或多個資料庫中的真實的表中的欄位。檢視總是顯示最新的資料,每當使用者查詢檢視時,資料庫引擎通過使用檢視的sql語句重建資料,我們可以看下建立檢視的格式應該就明白這句話了

  1.建立檢視:

  格式:

CREATE VIEW VIEW_NAME AS
SELECTE COLUMN_NAME FROM TABLE_NAME
WHERE CONDITION; 

   例項1:

我們以前面的表WEBSITES為例,假設我想需要這樣一個檢視:我希望每次查詢訪問量小於50的網站資訊,那麼我們如何建立這個檢視呢?

1 CREATE VIEW INTERNET AS
2 SELECT NAME,URL FROM WEBSITES
3 WHERE ALEXA < 50;

  例項2:

使用檢視,與查詢表資料一樣

SELECT * FROM INTERNET;

還可以新增條件:

SELECT * FROM INTERNET
WHERE NAME LIKE `%O%`; -- 查詢網站名字包含字母o的資料

是不是覺得定義檢視之後查詢變的更加簡單了呢^_^

  2.更新檢視

 更新檢視我們時通過 CREATE OR REPLACE 實現的

  格式:

1 CREATE OR REPLACE VIEW view_name AS
2 SELECT column_name(s)
3 FROM table_name
4 WHERE condition;

  例項:

比如上面剛建立的檢視我們需要新增一個ALEXA的新欄位,可以這樣實現

CREATE OR REPLACE VIEW INTERNET AS 
SELECT NAME ,URL,ALEXA FROM WEBSITES
WHERE ALEXA < 50;

  3.刪除檢視

  例項:

DROP VIEW INTERNET;

總結:好了,對檢視的操作到這就結束了,不是很全面,但是還是有點幫助的(自戀),想深入的學習的話再多找點資料看下吧,我這個適合入門 哈哈

雖然內容不多,不全面,但是還是能看出來點檢視的利與弊的,下面就來總結幾句(其實我也是在別的地方看到的,但是很好理解,也很全面,就借鑑一下):

利:

1.第一點: 
  使用檢視,可以定製使用者資料,聚焦特定的資料。 

  

  解釋: 

  在實際過程中,公司有不同角色的工作人員,我們以銷售公司為例的話, 

  採購人員,可以需要一些與其有關的資料,而與他無關的資料,對他沒 

  有任何意義,我們可以根據這一實際情況,專門為採購人員建立一個視 

  圖,以後他在查詢資料時,只需select  *  from  view_caigou   就可以啦。 

  

  第二點:使用檢視,可以簡化資料操作。 

  

  解釋:我們在使用查詢時,在很多時候我們要使用聚合函式,同時還要 

  顯示其它欄位的資訊,可能還會需要關聯到其它表,這時寫的語句可能 

  會很長,如果這個動作頻繁發生的話,我們可以建立檢視,這以後,我 

  們只需要select  *  from  view1就可以啦,這樣很方便。 

  

  第三點:使用檢視,基表中的資料就有了一定的安全性 

  

  因為檢視是虛擬的,物理上是不存在的,只是儲存了資料的集合,我們可以 

  將基表中重要的欄位資訊,可以不通過檢視給使用者,檢視是動態的資料的集 

  合,資料是隨著基表的更新而更新。同時,使用者對檢視,不可以隨意的更改 

  和刪除,可以保證資料的安全性。 

  

  第四點:可以合併分離的資料,建立分割槽檢視 

  

  隨著社會的發展,公司的業務量的不斷的擴大,一個大公司,下屬都設有很 

  多的分公司,為了管理方便,我們需要統一表的結構,定期檢視各公司業務 

  情況,而分別看各個公司的資料很不方便,沒有很好的可比性,如果將這些 

  資料合併為一個表格裡,就方便多啦,這時我們就可以使用union關鍵字, 

  將各分公司的資料合併為一個檢視。

2.弊

   1)效能差  

     sql server必須把檢視查詢轉化成對基本表的查詢,如果這個檢視是由一個複雜的多表查詢所定義,那麼,即使是檢視的一個簡單查詢,sql server也要把它變成一個複雜的結合體,需要花費一定的時間。

  2)修改限制  

     當使用者試圖修改試圖的某些資訊時,資料庫必須把它轉化為對基本表的某些資訊的修改,對於簡單的試圖來說,這是很方便的,但是,對於比較複雜的試圖,可能是不可修改的。

相關文章