天天看點

mysql面試中的坑

手機号存成什麼類型,長度多長?

char(11)

字元集是哪個?需要注釋嗎?

由字元組成的集合則成為字元集,字元集由于包含字元的多少與異同而形成了各種不同的字元集

需要 不然我怎麼知道是什麼編碼的

工作中使用存儲過程、視圖、觸發器、Event?

視圖

視圖隻是一種邏輯對象,是一種虛拟表,它并不是實體對象,因為視圖不占實體存儲空間,在視圖中被查詢的表稱為視圖的基表,大多數的select語句都可以用在建立視圖中

優點:集中使用者使用的資料,掩碼資料的複雜性,簡化權限管理以及為向其他應用程式輸出而重新組織資料等等。

create view view_name [(column[,...n])]
     with encryption
     as select_statement
     with check option
           

存儲過程

存儲過程是存儲在伺服器上的一組預編譯的Transact-SQL語句,存儲過程是一種封裝重複任務操作的一種方法,支援使用者提供的變量,具有強大的程式設計功能

優點:與其他應用程式共享應用程式的邏輯,是以確定一緻的資料通路和操縱。提供一種安全機制加速存儲過程的執行,提高系統的性能減少網絡交通

存儲過程的類型:系統存儲過程、本地存儲過程、臨時存儲過程、遠端存儲過程和擴充存儲過程。不同類型的存儲過程具有不同的作用。

執行存儲過程有兩種方法:

方法一:直接執行存儲過程,就是調用execute語句來執行存儲過程

方法二:在insert語句中執行存儲過程

create procedure procedure_name
     @parameter data_type
       with{recompile|encryption|recompile,encryption}
          as sql_statement
           

觸發器

當有操作影響到觸發器保護的資料時,觸發器就自動發生,是以,觸發器是在特定表上進行定義的,該表也稱為觸發器表,也是一種特殊類型的存儲過程,與存儲過程的差別:存儲過程可以由使用者直接調用執行,但是觸發器不能被直接調用執行。

觸發器的類型:insert類型,update類型,delete類型。

工作原理:

(insert)當向表中插入資料時,insert觸發器觸發執行,當insert觸發器觸發時,新的記錄增加到觸發器表中和inserted表中。觸發器可以檢查inserted表,來确定該觸發器的操作是否應該執行和如何執行,在inserted表中的那些記錄,總是觸發器表中一行或多行記錄的備援;

(delete)當觸發一個delete觸發器時,被删除的記錄放在一個特殊的deleted表中。deleted表是一個邏輯表,用來儲存已經從表中删除的記錄;

(update)修改一條記錄就等于插入一條新記錄和删除一條舊記錄,當在某一個update觸發器表的上面修改一條記錄時,表中原來的記錄移動到deleted表中,修改過的記錄插入到了inserted表中,觸發器可以檢查deleted表和inserted表以及被修改的表。

文法:

create trigger trigger_name
    on {table |view}
    with encryprion
    {for|after|instead of}{[delete][,][insert][,][update]}
    as sql _statement
           

主外鍵做什麼,實際中你們用嗎?

主鍵:是能夠唯一的辨別一組資料的資料元素;比如說:學号,姓名,年齡,性别,課程号課程中學号是唯一的,是以可以設它為主鍵;

外鍵:一組資料的主鍵是另一組資料的的元素;

比如說:課程名,課程号,任課老師,這組中可以吧課程号設為主鍵

這時,課程号是上一組的元素,下一組的主鍵,就可以稱它為外鍵;

索引怎麼用?

索引可以加快資料庫通路的效率,相當于給原來的記錄作一個key-value的結構

資料庫裡面索引是用樹來做的,B+數

搜尋中也用到了索引

索引分為:

普通索引

唯一索引

聚集索引

主鍵索引

聯合索引

添加索引指令

ALTER TABLE <表名> ADD INDEX (<字段>);

存儲過程用嗎?

我覺得存儲過程最大的優勢,應該在于它可以将很多複雜的處理放到伺服器端來處理,

比如,你要進行很複雜的業務處理,寫一條單純的sql文不行,這個時候,如果你通過java或其他程式來處理的話,可能要通路很多次資料庫,然後進行資料整合啊,業務判斷啊,等等一系列處理,那麼這樣的處理過程肯定是很花時間的,這個時候如果利用存儲過程,比如把這些資料性的業務處理全部放到存儲過程中來做,那麼交由伺服器來處理,肯定要比程式快的多,而且以後維護這部分東西,也隻需要修改這個存儲過程就可以,而不需要去修改程式,這樣也變的容易維護!

但是如果是很簡單的東西,那麼把所有的sql都不要了,都放到伺服器的存儲過程中,也許某天,你的伺服器就挂掉了!

是以必須從多方面來考慮,到底應該有那種方式來處理,不能單純的隻考慮能不能實作這一點,這樣sql确實沒必要了,但是這也是不現實的!

什麼時候用TEXT、BLOB類型?大檔案或者大照片怎麼存的?

在儲存較大文本時,

通常會選擇使用 TEXT 或者 BLOB,二者之間的主要差别是 BLOB 能用來儲存二進制資料,比

如照片;而 TEXT 隻能儲存字元資料,比如一篇文章或者日記。TEXT 和 BLOB 中有分别包括

TEXT、MEDIUMTEXT、LONGTEXT 和 BLOB、MEDIUMBLOB、LONGBLOB3 種不同的類型,它們

之間的主要差別是存儲文本長度不同和存儲位元組不同,使用者應該根據實際情況選擇能夠滿足

需求的最小存儲類型。

BLOB 和 TEXT 值會引起一些性能問題,特别是在執行了大量的删除操作時.

可以使用合成的(Synthetic)索引來提高大文本字段(BLOB 或 TEXT)的查詢性能;

如果雜湊演算法生成的字元串帶有尾部空格,就不要把它們存儲在 CHAR 或 VARCHAR 列中,它們會受到尾部空格去除的影響。合

成的散列索引對于那些 BLOB 或 TEXT 資料列特别有用。用散列辨別符值查找的速度比搜尋BLOB列本身的速度快很多。

檔案儲存到本地,存儲他的位址

你們使用什麼引擎?

①Mylsam 不支援事務,适用于選擇密集型,插入密集型,mysql預設的引擎

②innodb 适用于更新密集型,支援事務,自動災難恢複,行級鎖,外鍵限制

③memory出發點是速度,采用邏輯存儲媒體是記憶體

④merge 一組myisam 表的集合

我們使用2

int(11),是什麼意思,varchar(20)是什麼意思?

在mysql5.x版本的資料庫中:

int類型資料的位元組大小是固定的4個位元組;

但是int(5)和int(11)差別在于,顯示的資料位數一個是5位一個是11位,在開啟zerofill(填充零)情況下,若int(5)存儲的數字長度是小于5的則會在不足位數的前面補充0,但是如果int(5)中存儲的數字長度大于5位的話,則按照實際存儲的顯示(資料大小在int類型的4個位元組範圍内即可),也就是說int(M)的M不代表資料的長度;

varchar(20)中的20表示的是varchar資料的資料長度最大是20,超過則資料庫不會存儲;

總結: int(M) M表示的不是資料的最大長度,隻是資料寬度,并不影響存儲多少位長度的資料;

varchar(M) M表示的是varchar類型資料在資料庫中存儲的最大長度,超過則不存;

删除指令你知道哪些?

drop table

drop 是直接删除表資訊,速度最快,但是無法找回資料

例如删除 user 表:

drop table user;

truncate (table)

truncate 是删除表資料,不删除表的結構,速度排第二,但不能與where一起使用

例如删除 user 表:

truncate table user;

delete from

delete 是删除表中的資料,不删除表結構,速度最慢,但可以與where連用,可以删除指定的行

例如删除user表的所有資料

delete from user;

删除user表的指定記錄

delete from user where user_id = 1;

三種方式的差別

相同點

truncate和不帶where子句的delete,drop都會删除表内的資料;

drop,truncate都是DDL語句(資料定義語言),執行後會自動送出;

不同點

語句類型:delete語句是資料庫操作語言(DML),truncate,drop是資料庫定義語言(DDL);

效率:一般來說 drop > truncate> delete;

是否删除表結構:truncate和delete 隻删除資料不删除表結構,truncate 删除後将重建索引(新插入資料後id從0開始記起),而 delete不會删除索引 (新插入的資料将在删除資料的索引後繼續增加),drop語句将删除表的結構包括依賴的限制,觸發器,索引等;

安全性:drop和truncate删除時不記錄MySQL日志,不能復原,delete删除會記錄MySQL日志,可以復原;

傳回值:delete 操作後傳回删除的記錄數,而 truncate 傳回的是0或者-1(成功則傳回0,失敗傳回-1);

小知識

delete 與 delete from 差別

如果隻針對一張表進行删除,則效果一樣;如果需要聯合其他表,則需要使用from

delete tb1 from tb1 m where id in (select id from tb2);

用法總結

希望删除表結構時,用 drop;

希望保留表結構,但要删除所有記錄時, 用 truncate;

希望保留表結構,但要删除部分記錄時, 用 delete。

你了解事務嗎?

事務是作為單個邏輯工作單元執行的一系列操作。可以是一條SQL語句也可以是多條SQL語句。

事務具有四個特性

原子性:不可分隔、成則具成、敗則具敗。

一緻性:事務在完成時,必須使所有的資料都保持一緻狀态

隔離性:獨立的執行互不幹擾。由并發事務所作的修改必須與任何其他并發事務所作的修改隔離。

持久性:事務務完成之後,它對于系統的影響是永久性的。該修改即使出現系統故障也将一直保持。

應用程式主要通過指定事務啟動和結束的時間來控制事務。