sql語句分類按功能(定義、操縱、控制、查詢)分類
DDL 數據定義語言,定義表、庫、視圖
DML 對數據表記錄增加、修改和刪除操作
DCL 授權、事務控制、條件判斷
常見的面試題:
1.如何刪除表:
drop table table_name;
2.創建索引:
對於查詢占主要的應用來說,索引顯的尤為重要。很多時候性能問題就是因為我們沒有添加索引或者更為有效的索引。如何不添加索引的話,那么查詢所有哪怕只是查詢一條特定的數據都會進行全表掃描。如果一張表的數據量比較大而且符合條件的結果又很少,那么不加索引會引起致命的性能下降。但是也不是什么情況都非得建立索引不可,比如性別就只有兩個值,建索引不僅沒什么優勢,還會影響到跟新速度,這被稱為過度索引。
3.復合索引:
比如一條sql語句: select * from user where area='beijing' and age='male';
如果我們在area和age上分別創建單個索引的話,由於mysql查詢每次只能使用一個索引,所以雖然這樣做已經比全表掃描效率提高了不少,但索引的功能不僅僅如此,如我們在area和age上建立復合索引的話,查詢速度就會大大提高。如果我們創建了(area, age, salary)的復合索引,那么其實相當於創建了(area,age,salary)、 (area,age)、(area)三個索引,這被稱為最佳左前綴特性。因此我們在創建復合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。
4.索引不會包含有NULL值的列:
只要列中包含有null值都將不會被包含在索引中 ,復合索引只要有一列含有null值,那么這一列對此復合索引是無效的。所以我們在設計數據庫是盡量不要讓字段的默認值為null。
5.使用短索引:
對串列進行索引,如果有可能應該指定一個前綴長度,例如有一個長度char(255)的列,如果在前10或20個字符內,多數值是唯一的,那么就不要對這個列進行索引。短索引不僅可以提高查詢效率而且可以提高I/O效率和減少內存占用。
6.排序的索引問題:
mysql查詢只使用一個索引,如果where語句中已經使用了索引,那么order by 后的字段將不會加索引。 因此數據庫默認排序可以符合要求的情況下不要使用排序操作,盡量不要使用含多個列的排序如果需要請給這些列加上復合索引。
7.LIKE語句操作:
一般情況下不建議使用like操作,如果必須,如何使用也是一個技術,如(like %aaa%)不會使用索引,而(like aaa%)會使用索引。
8.Mysql數據庫設置數據類型時應注意什么:
① varchar 和 char 類型,varchar是變長的,需要額外1-2個字節存儲,能節約空間,可能對性能有幫助。但由於是變長的,可能會發生碎片,如更新數據。
② 使用ENUM(Mysql枚舉類)代替字符串類型,數據實際存儲為整型。
③ 盡量不要使用字符串類型來作為標識符,因為它們占了很多內存而且通常比整數型要慢,
9.Mysql的幾種備份方式:
①、 邏輯備份:使用mysql自帶的mysqldump工具進行備份。備份成sql文件形式。
優點:最大好處是能夠與正在運行的mysql自動協同工作,在運行期間可以確保備份是當時的點,它會自動將對應操作的表鎖定,不允許其他用戶修改(只能訪問)。可能會阻止修改操作。sql文件通用方便移植。
缺點:備份的速度比較慢。如果是數據量很多的時候。就很耗時間。如果數據庫服務器處在提供給用戶服務狀態,在這段長時間操作過程中,意味着要鎖定表(一般是讀鎖定,只能讀不能寫入數據)。那么服務就會影響的。
②、物理備份:直接拷貝mysql的數據目錄。
直接拷貝只適用於myisam類型的表。這種類型的表是與機器獨立的。但實際情況是,你設計數據庫的時候不可能全部使用myisam類型表。你也不可能因為myisam類型表與機器獨立,方便移植,於是就選擇這種表,這並不是選擇它的理由。
缺點:你不能去操作正在運行的mysql服務器(在拷貝的過程中有用戶通過應用程序訪問更新數據,這樣就無法備份當時的數據)可能無法移植到其他機器上去。
③、雙機熱備份。
mysql數據庫沒有增量備份的機制。當數據量太大的時候備份是一個很大的問題。還好mysql數據庫提供了一種主從備份的機制(也就是雙機熱備)
優點:適合數據量大的時候。現在明白了。大的互聯網公司對於mysql數據備份,都是采用熱機備份。搭建多台數據庫服務器,進行主從復制
10.Mysql添加索引
普通索引 添加INDEX
alter table table_name add index index_name ('column'); ----- alter table user add index age_search ('age');
主鍵索引 添加 primary key
alter table table_name add primary key ('column');
唯一索引 添加 unique
alter table table_name add unique ('column');
全文索引 添加 fulltext
alter table table_name add fulltext ('column');
多列索引
alter table table_name add index ('column1','column2','column3');
11. 什么情況下添加索引:
表的主關鍵詞
表的字段唯一約束
直接條件查詢的字段
查詢中與它表關聯的字段
查詢中排序的字段
查詢中統計或分組統計的字段
12.什么情況下應不建或者少建索引:
表記錄太少
經常插入、刪除、修改的表
數據重復且分布均勻的表字段
經常和主字段一起查詢而且主字段索引值比較多的表字段
13.千萬級Mysql數據庫建立索引的事項以及提高性能的手段:
對查詢進行優化,避免全表掃描
應盡量避免在where子句中對字段進行null值判斷
應盡量避免在where子句中使用 != 或 <> 操作符
in 和 not in 慎用
避免使用通配符
如果在where子句中使用參數,也會導致全表查詢
14.Mysql調優:
15.各種函數的用法:
16.查詢語句(單表,多表):
分組查詢:
group by 單獨使用,查詢結果只顯示一個分組的一條記錄。 : select * from table_tablename group by sex;
select
sex,group_concat(
name
)
from
employee
group
by
sex;
與集合函數一起使用: select
sex,
count
(sex)
from
employee
group
by
sex;
與HAVING一起使用:“having條件表達式”,可以限制輸出結果。只有滿足條件表達式的結果才顯示。 elect
sex,
count
(sex)
from
employee
group
by
sex
having
count
(sex) >= 3;
按多組進行分組: select
*
from
employee
group
by
d_id,sex;
與with rollup一起使用,使用with rollup將會在所有記錄的最后加上一條記錄,這條記錄是上面所有記錄的總和
連接查詢:
內連接查詢:當兩個表中具有相同意義的字段值相等時,就查詢出該條記錄。select num,name,employee.d_id,age,d_name from employee,department where employee.d_id = department.d_id因字段名相同,所以取d_id字 段值時最好指定哪張表的字段。
外連接查詢: select 屬性名列表 from 表名1 left|right join 表名2 on 表名1.屬性名1=表名2.屬性名2;左連接查詢:進行左連接查詢時,可以查出表名1中所指的表中所有記錄。而表名2所指表中,只能查詢出匹配的記錄。
實例:select num,name,employee.d_id,age,d_name from employee left join department on employee.d_id = department.d_id;
與左連接相反,可以查詢出表名2中的的所有記錄,而表名1中所指的表中,只查詢出匹配的記錄。