MySQL 面試題集錦
目前國外 GitHub、Airbnb、Yelp、Coursera 均在使用 MySQL 資料庫,國內阿里巴巴、去哪兒網、騰訊、魅族、京東的部分關鍵業務同樣使用了 MySQL 資料庫。MySQL 也是眾多資料庫排行榜單的第一名,針對此開發者和一線互聯網企業都在用的開源資料庫, 筆者在網路已有的一線公司面試題基礎上進一步做了整理,列出面試中常見的一系列MySQL 問題。
1、一張表,裡面有 ID 自增主鍵,當 insert 了 17 條記錄之後,刪除了第 15,16,17 條記錄,再把 Mysql 重啟,再 insert 一條記錄,這條記錄的 ID 是 18 還是 15 ?
· 如果表的類型是MyISAM, 那麼是18。 因為MyISAM表會把自增之間的最大ID記錄到數據文件里,重啟MRSQL自增主鍵的最大ID也不會丟失。
· 如果表的類型是InnoDM,那麼是15。InnoDB表只是把自增主鍵的最大ID記錄到內存中,所以重啟資料庫或者是對錶進行OPTIMIZE操作,都會導致最大ID丟失。
2、MySQL 的技術特點是什麼 ?
MySQL 資料庫軟體是一個客戶端或伺服器系統,其中包括:支持各種客戶端程序和庫的多線程 SQL 伺服器、不同的後端、廣泛的應用程序編程介面和管理工具。
3、Heap 表是什麼 ?
· HEAP 表存在於內存中,用於臨時高速存儲;
· BLOB 或 TEXT 欄位是不允許的;
· 只能使用比較運算符 =,<=> (不允許<、 >、<= 或 >=);
· HEAP 表不支持 AUTO_INCREMENT;
· 索引不可為 NULL;
4、MySQL 伺服器默認埠是什麼 ?
MySQL 伺服器的默認埠是 3306。
5、與 Oracle 相比,MySQL 有什麼優勢 ?
· MySQL 是開源軟體,隨時可用,無需付費;
· MySQL 是攜帶型的;
· 帶有命令提示符的 GUI;
· 使用 MySQL 查詢瀏覽器支持管理;
6、如何區分 FLOAT 和 DOUBLE?
以下是 FLOAT 和 DOUBLE 的區別:
· 浮點數以 8 位精度存儲在 FLOAT 中,並且有四個位元組。
· 浮點數存儲在 DOUBLE 中,精度為 18 位,有八個位元組。
7、區分 CHAR_LENGTH 和 LENGTH?
CHAR_LENGTH 是字元數,而 LENGTH 是位元組數。Latin 字元的這兩個數據是相同的,但是對於 Unicode 和其他編碼,它們是不同的。
8、請簡潔描述 MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別 ?
SQL 標準定義的四個隔離級別為:
·未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會話中未提交事務修
改的數據;
·提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數資料庫默認都是
該級別 (不重複讀);
·可重複讀(Repeated Read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致
的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重複讀,但是還存在幻象
讀;
·串列讀(Serializable):完全串列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會
阻塞;
四種隔離界別說明:
臟讀: 臟讀就是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據(一個事務讀取到另一事務未提交的更新數據)。
不可重複讀: 是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重複讀。
幻讀:第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。
9、在 MySQL 中 ENUM 的用法是什麼 ?
ENUM 是一個字元串對象,用於指定一組預定義的值,並可在創建表時使用。
Create table size ( name ENUM ( Smail,Medium,Large ) ;
詳述參見: MySQL enum類型 - MySQL教程?
10、如何定義 REGEXP?
REGEXP 是模式匹配,其中匹配模式在搜索值的任何位置。
11、CHAR 和 VARCHAR 的區別 ?
以下是 CHAR 和 VARCHAR 的區別:
·CHAR 和 VARCHAR 類型在存儲和檢索方面有所不同
·CHAR 列長度固定為創建表時聲明的長度,長度值範圍是 1 到 255
·當 CHAR 值被存儲時,它們被用空格填充到特定長度,檢索 CHAR 值時需刪除尾隨空格。
一言以蔽: char 表示定長,長度固定,varchar表示變長,即長度可變;對 char 來說,最多能存放的字元個數 255,和編碼無關。而 varchar 呢,最多能存放 65532 個字元。
12、列的字元串類型可以是什麼 ?
字元串類型是:
·SET
·BLOB
·ENUM
·CHAR
·TEXT
·VARCHAR
13、如何獲取當前的 MySQL 版本 ?
SELECT VERSION ( ) ; 用於獲取當前 MySQL 的版本。
14、MySQL 中使用什麼存儲引擎 ?
存儲引擎稱為表類型,數據使用各種技術存儲在文件中。
技術涉及:
·Storage mechanism
·Locking levels
·Indexing
·Capabilities and functions.
15、MySQL 驅動程序是什麼 ?
以下是 MySQL 中可用的驅動程序:
·PHP 驅動程序
·JDBC 驅動程序
·ODBC 驅動程序
·CWRAPPER
·PYTHON 驅動程序
·PERL 驅動程序
·RUBY 驅動程序
·CAP11PHP 驅動程序
·Ado.net5.mxj
16、TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 數據類型上做什麼 ?
創建表時 TIMESTAMP 列用 Zero 更新。只要表中的其他欄位發生更改,UPDATE CURRENT_TIMESTAMP 修飾符就將時間戳欄位更新為當前時間。
17、主鍵和候選鍵有什麼區別 ?
表格的每一行都由主鍵唯一標識 , 一個表只有一個主鍵。
主鍵也是候選鍵。按照慣例,候選鍵可以被指定為主鍵,並且可以用於任何外鍵引用。
18、如何使用 Unix shell 登錄 MySql?
我們可以通過以下命令登錄:
# [ mysql dir ] /bin/mysql -h hostname -u -p
19、 myisamchk 是用來做什麼的 ?
它用來壓縮 MyISAM 表,這減少了磁碟或內存使用。
20、MYSQL 資料庫伺服器性能分析的方法命令有哪些 ?
21、如何控制 HEAP 表的最大尺寸 ?
Heal 表的大小可通過稱為 max_heap_table_size 的 MySQL 配置變數來控制。
22、MyISAM Static 和 MyISAM Dynamic 有什麼區別 ?
在 MyISAM Static 上的所有欄位有固定寬度。動態 MyISAM 表將具有像 TEXT,BLOB 等欄位,以適應不同長度的數據類型。
MyISAM Static 在受損情況下更容易恢復。
23、federated 表是什麼 ?
federated 表,允許訪問位於其他伺服器資料庫上的表。
24、如果一個表有一列定義為 TIMESTAMP,將發生什麼 ?
每當行被更改時,時間戳欄位將獲取當前時間戳。
25、列設置為 AUTO INCREMENT 時,如果在表中達到最大值,會發生什麼情況 ?
它會停止遞增,任何進一步的插入都將產生錯誤,因為密鑰已被使用。
26、怎樣才能找出最後一次插入時分配了哪個自動增量 ?
LAST_INSERT_ID 將返回由 Auto_increment 分配的最後一個值,並且不需要指定表名稱。
27、你怎麼看到為表格定義的所有索引 ?
索引是通過以下方式為表格定義的:
SHOW INDEX FROM ;
28.、LIKE 聲明中的 % 和 _ 是什麼意思 ?
% 對應於 0 個或更多字元,_ 只是 LIKE 語句中的一個字元。
29、如何在 Unix 和 MySQL 時間戳之間進行轉換 ?
UNIX_TIMESTAMP 是從 MySQL 時間戳轉換為 Unix 時間戳的命令
FROM_UNIXTIME 是從 Unix 時間戳轉換為 MySQL 時間戳的命令
30、列對比運算符是什麼 ?
在 SELECT 語句的列比較中使用 =,,,,,AND,OR 或 LIKE 運算符。
31、我們如何得到受查詢影響的行數 ?
行數可以通過以下代碼獲得:
SELECT COUNT ( user_id ) FROM users;
32、Mysql 查詢是否區分大小寫 ?
不區分
SELECT VERSION ( ) , CURRENT_DATE;
SeLect version ( ) , current_date;
seleCt vErSiOn ( ) , current_DATE;
所有這些例子都是一樣的,MySQL 不區分大小寫。
33.、LIKE 和 REGEXP 操作有什麼區別 ?
LIKE 和 REGEXP 運算符用於表示 ^ 和 %。
SELECT * FROM employee WHERE emp_name REGEXP "^b";
SELECT * FROM employee WHERE emp_name LIKE "%b";
34.、BLOB 和 TEXT 有什麼區別 ?
BLOB 是一個二進位對象,可以容納可變數量的數據。有四種類型的 BLOB -
·TINYBLOB
·MEDIUMBLOB 和
·LONGBLOB
它們只能在所能容納價值的最大長度上有所不同。
TEXT 是一個不區分大小寫的 BLOB。四種 TEXT 類型
·TINYTEXT
·MEDIUMTEXT 和
·LONGTEXT
它們對應於四種 BLOB 類型,並具有相同的最大長度和存儲要求。
BLOB 和 TEXT 類型之間的唯一區別在於對 BLOB 值進行排序和比較時區分大小寫,對 TEXT 值不區分大小寫。
35、mysql_fetch_array 和 mysql_fetch_object 的區別是什麼 ?
以下是 mysql_fetch_array 和 mysql_fetch_object 的區別:
mysql_fetch_array ( ) - 將結果行作為關聯數組或來自資料庫的常規數組返回。
mysql_fetch_object - 從資料庫返回結果行作為對象。
36、我們如何在 mysql 中運行批處理模式 ?
以下命令用於在批處理模式下運行:
mysql;
mysql mysql.out
37、MyISAM 表格將在哪裡存儲,並且還提供其存儲格式 ?
每個 MyISAM 表格以三種格式存儲在磁碟上:
· ".frm" 文件存儲表定義
· 數據文件具有 ".MYD" ( MYData ) 擴展名
索引文件具有 ".MYI" ( MYIndex ) 擴展名
38.、MySQL 中有哪些不同的表格 ?
共有 5 種類型的表格:
·MyISAM
·Heap
·Merge
·INNODB
·ISAM
MyISAM 是 MySQL 的默認存儲引擎。
39、ISAM 是什麼 ?
ISAM 簡稱為索引順序訪問方法。它是由 IBM 開發的,用於在磁帶等輔助存儲系統上存儲和檢索數據。
40、InnoDB 是什麼 ?
lnnoDB 是一個由 Oracle 公司開發的 Innobase Oy 事務安全存儲引擎。
41、MySQL 如何優化 DISTINCT?
DISTINCT 在所有列上轉換為 GROUP BY,並與 ORDER BY 子句結合使用。
1
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
42、如何輸入字元為十六進位數字 ?
如果想輸入字元為十六進位數字,可以輸入帶有單引號的十六進位數字和前綴 ( X ) ,或者只用 ( Ox ) 前綴輸入十六進位數字。
如果表達式上下文是字元串,則十六進位數字串將自動轉換為字元串。
43、如何顯示前 50 行 ?
在 MySql 中,使用以下代碼查詢顯示前 50 行:
SELECT*FROM
LIMIT 0,50;
44、可以使用多少列創建索引 ?
任何標準表最多可以創建 16 個索引列。
45、NOW ( ) 和 CURRENT_DATE ( ) 有什麼區別 ?
NOW ( ) 命令用於顯示當前年份,月份,日期,小時,分鐘和秒。
CURRENT_DATE ( ) 僅顯示當前年份,月份和日期。
46、什麼樣的對象可以使用 CREATE 語句創建 ?
以下對象是使用 CREATE 語句創建的:
·DATABASE
·EVENT
·FUNCTION
·INDEX
·PROCEDURE
·TABLE
·TRIGGER
·USER
·VIEW
47.、MySql 表中允許有多少個 TRIGGERS?
在 MySql 表中允許有六個觸發器,如下:
·BEFORE INSERT
·AFTER INSERT
·BEFORE UPDATE
·AFTER UPDATE
·BEFORE DELETE and
·AFTER DELETE
48、什麼是非標準字元串類型 ?
以下是非標準字元串類型:
·MEDIUMTEXT
49、什麼是通用 SQL 函數 ?
·CONCAT ( A, B ) - 連接兩個字元串值以創建單個字元串輸出。通常用於將兩個或多個欄位合併為一個欄位。
·FORMAT ( X, D ) - 格式化數字 X 到 D 有效數字。
·CURRDATE ( ) , CURRTIME ( ) - 返回當前日期或時間。
·NOW ( ) - 將當前日期和時間作為一個值返回。
·MONTH ( ) ,DAY ( ) ,YEAR ( ) ,WEEK ( ) ,WEEKDAY ( ) - 從日期值中提取給定數據。
·HOUR ( ) ,MINUTE ( ) ,SECOND ( ) - 從時間值中提取給定數據。
·DATEDIFF ( A,B ) - 確定兩個日期之間的差異,通常用於計算年齡
·SUBTIMES ( A,B ) - 確定兩次之間的差異。
·FROMDAYS ( INT ) - 將整數天數轉換為日期值。
50、解釋訪問控制列表
ACL ( 訪問控制列表 ) 是與對象關聯的許可權列表。這個列表是 MySQL 伺服器安全模型的基礎,它有助於排除用戶無法連接的問題。
MySQL 將 ACL ( 也稱為授權表 ) 緩存在內存中。當用戶嘗試認證或運行命令時,MySQL 會按照預定的順序檢查 ACL 的認證信息和許可權。
推薦閱讀:
※memcached plugin(handlersocket),Memcached的一點看法
※為什麼 PostgreSQL 在國內流行度遠不如 MySQL,主要是哪些方面的原因造成的?
※常見sql注入原理詳解!
※MongoDB的空間分配
※mysql表數據已排序好,order by查詢速度會不會更快?