Java面試題之--------MySql

想起來什麼寫什麼比較隨意。

一、連表查詢方式(仔細品味,想想其實超級簡單)

Left join

1、左連接的定義:是以左表爲基礎,根據ON後給出的兩表的條件將兩表連接起來。結果會將左表所有的查詢信息列出,而右表只列出ON後條件與左表滿足的部分。左連接全稱爲左外連接,是外連接的一種。

right join

2、右連接的定義,是以右表爲基礎,根據ON後給出的兩表的條件將兩表連接起來。結果會將右表所有的查詢信息列出,而左表只列出ON後條件與右表滿足的部分。右連接全稱爲右外連接,是外連接的一種。

inner join

3、內連接:使用比較運算符根據每個表共有的列的值匹配兩個表中的行。

二、mysql的索引(看情況使用,也是超級簡單)

mysql的索引分爲單列索引(主鍵索引,唯一索引,普通索引)和組合索引.

關於MySQL索引的好處,如果正確合理設計並且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。對於沒有索引的表,單表查詢可能幾十萬數據就是瓶頸,而通常大型網站單日就可能會產生幾十萬甚至幾百萬的數據,沒有索引查詢會變的非常緩慢。還是以WordPress來說,其多個數據表都會對經常被查詢的字段添加索引,比如wp_comments表中針對5個字段設計了BTREE索引。

1、 普通的索引

目的很簡單就是爲了提高訪問的速度。

-直接添加

CREATE INDEX IndexName ON `TableName`(`字段名`(length))

–修改表結構的方式添加索引

ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))

第一種方式 :

CREATE INDEX account_Index ON award(account(10));

第二種方式: 

ALTER TABLE award ADD INDEX account_Index(account(10))

2、 唯一索引

創建唯一索引的目的不是爲了提高訪問速度,而只是爲了避免數據出現重複。唯一索引可以有多個但索引列的值必須唯一,索引列的值允許有空值。如果能確定某個數據列將只包含彼此各不相同的值,在爲這個數據列創建索引的時候就應該使用關鍵字UNIQUE,把它定義爲一個唯一索引。

第一種方式 :

CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length));

第二種方式: 

 ALTER TABLE TableName ADD UNIQUE (column_list)  

 

CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(account(10));

3、主鍵索引

不允許有空值,(在B+TREE中的InnoDB引擎中,主鍵索引起到了至關重要的地位)

主鍵索引建立的規則是 int優於varchar,一般在建表的時候創建,最好是與表的其他字段不相關的列或者是業務不相關的列.一般會設爲 int 而且是 AUTO_INCREMENT自增類型的。

4、組合索引

需要加索引的字段,要在where條件中

數據量少的字段不需要加索引

如果where條件中是OR關係,加索引不起作用

符合最左原則

一個表中含有多個單列索引不代表是組合索引,通俗一點講 組合索引是:包含多個字段但是隻有索引名稱

其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);

CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);

個人理解就是一個一個建立普通索引的話太麻煩,不如以一下子就建立一個組合索引。.

注意事項:(組合索引無效的時候)組合和複合一個概念。

對於複合索引:Mysql從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進行查找,但不支持 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效。

所以說創建複合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜索或僅對前幾列執行搜索時,複合索引非常有用;僅對後面的任意列執行搜索時,複合索引則沒有用處。

三、視圖(很有用,但是經常被忽略)

總而言之,使用視圖的大部分情況是爲了保障數據安全性,提高查詢效率。

使用show create view語句查看視圖信息

視圖的更改:

create or replace view view_name as select語句;

在視圖存在的情況下可對視圖進行修改,視圖不在的情況下可創建視圖

刪除:

drop view 視圖名稱;

視圖的作用實在是太強大了,以下是我體驗過的好處:

作用一:

    提高了重用性,就像一個函數。如果要頻繁獲取user的name和goods的name。就應該使用以下sql語言。示例:

        select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;

    但有了視圖就不一樣了,創建視圖other。示例

        create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;

    創建好視圖後,就可以這樣獲取user的name和goods的name。示例:

        select * from other;

    以上sql語句,就能獲取user的name和goods的name了。

作用二:

    對數據庫重構,卻不影響程序的運行。假如因爲某種需求,需要將user拆房表usera和表userb,該兩張表的結構如下:

        測試表:usera有id,name,age字段

        測試表:userb有id,name,sex字段

    這時如果php端使用sql語句:select * from user;那就會提示該表不存在,這時該如何解決呢。解決方案:創建視圖。以下sql語句創建視圖:

        create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;

        以上假設name都是唯一的。此時php端使用sql語句:select * from user;就不會報錯什麼的。這就實現了更改數據庫結構,不更改腳本程序的功能了。

作用三:

    提高了安全性能。可以對不同的用戶,設定不同的視圖。例如:某用戶只能獲取user表的name和age數據,不能獲取sex數據。則可以這樣創建視圖。示例如下:

        create view other as select a.name, a.age from user as a;

    這樣的話,使用sql語句:select * from other; 最多就只能獲取name和age的數據,其他的數據就獲取不了了。

作用四:

    讓數據更加清晰。想要什麼樣的數據,就創建什麼樣的視圖。經過以上三條作用的解析,這條作用應該很容易理解了吧

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章