2020最全mysql面試題

一.概念

1.事務

(1)什麼是事物?

將一組增刪改查看成一個執行單元,要麼全成功,要麼有一個失敗,數據庫就會回滾,所有操作都不生效

(2)事務的特性?

  • ①原子性:將一組增刪改看成一個整體,要不全成功,要不有一個失敗,數據庫就回滾,所有操作都不生效

  • ②一致性:事務開始前的狀態和事務執行後的狀態保持一致

  • ③隔離性:當多個用戶併發訪問數據庫時,線程會爲用戶開啓一個事務,事務與事務相互隔離,互不干擾

  • ④持久性:一旦事務執行生效會永久運用到數據庫,即使設備故障也不影響

(3)不考慮隔離性導致的問題

  • ①髒讀:當事務A訪問了事務B未提交的數據,並使用了它
  • ②幻讀:當事務A訪問了數據表,事務B修改或刪除了數據,導致事務A讀取與實際不符合,類似出現幻覺
  • ③不可重複讀:當事務A多次訪問同一條數據,事務B修改了它,導致事務A兩次讀取的數據不一樣

(4)四個隔離級別

  • ①Read uncommitted:讀未提交,最低隔離級別,可能會出現所有情況
  • ②Read committed:讀提交,可以避免幻讀
  • ③Repeatable read:可重複讀,可以避免幻讀和不可重複讀
  • ④Serialzable:串行化,可以避免髒讀、幻讀和不可重複讀。

(5)事務的操作

  • 開啓事務:begin
  • 提交事務:commit
  • 回滾事務:rollback

2.重要的MySQL引擎

①MyISAM:不支持事務,查詢速度相對較慢,將數據儲存在三個文件,一個放索引,一個放數據,一個放表結構
②InnoDB:支持事務,查詢速度相對較快,將數據儲存在兩個文件中,一個放表結構,一個放數據和索引

3.常用的數據類型

int 存儲整數類型,默認存儲十一位
char 存儲定長字符串,無論字符串長度是否夠長,都佔用規定大小
varchar 存儲變長字符串,大小隨字符串長度變化
datetime 存儲日期類型 H:H:H S:S:S
decimal 存儲小數,兩個參數,第一個參數爲長度,第二個參數爲幾位小數

4.字段約束

unsigned 約定字符是有符號還是無符號
primary 主鍵約束
foreign 外鍵約束
unique 唯一約束
int(4) 最大寬度
not null 不能爲空
auto_increment 自增

5.常見的索引

primary key 唯一索引,不可重複且不能爲空
unique 唯一索引,不可重複可以爲空
index 普通索引,可以爲空可以重複
多列索引 可以爲空可以重複

6.視圖

(1)定義:是一張虛擬的表,儲存着複雜的查詢語句

(2)優點:

  • ①簡單:存儲着複雜的sql語句,使用時可以直接調用視圖
  • ②安全:數據具有對庫和表的權限管理,但是沒有對字段的管理權限,使用視圖可以實現權限管理
  • ③數據獨立性:視圖基於源表,源表的結構改變不會影響視圖

(3)缺點:

  • ①維護和管理成本增大,對數據遷移有很大影響
  • ②如果存儲簡單的查詢語句,視圖會按照複雜的查詢語句執行,會降低執行效率

(4)添加視圖:

crate view 視圖名 as(查詢語句);

(5)查看所有視圖:

show table status where comment='view';

(6)查看視圖表:

select * from 視圖名;

(7)刪除視圖:

drop view 視圖名;

7.觸發器

(1)定義:

觸發器(trigger)也叫觸發程序,觸發器是一種特殊的存儲過程,但是觸發器不需要語句調用,也不需要手動啓動,通過有增刪改事件觸發,當指定表發生指定動作,將激活觸發器。

(2)添加觸發器語句:

create trigger 觸發器名字 觸發時間 觸發事件 on 表名 for each row begin 觸發後的事件 end;

(3)查看所有觸發器:

select * from information_schema.triggers/G;

(4)刪除觸發器:

drop trigger 觸發器名字;

8.Mysql優化:

爲什麼要優化?

一個應用吞吐量瓶頸往往出現在數據庫的處理速度上,隨着應用程序的使用和業務的拓展,數據庫數據量逐漸增多,數據庫處理壓力逐漸增大,關係型數據庫數據存放在磁盤上的,讀寫速度較慢(與內存中的數據相比)

優化方式:

  • 設計表的時候嚴格根據數據庫的設計範式來設計數據庫;
  • select 後儘量不使用*
  • 儘量不使用嵌套查詢,使用連接查詢或者where查詢
  • sql關鍵詞儘量使用大寫
  • 儘量使用邏輯外交不使用物理外鍵
  • 給查詢頻繁的字段添加索引,並且遵循最左原則(儘量將首選關鍵字段放在最前邊)
  • 垂直分庫分表:把一些不經常讀的數據或者結果複雜的表拆分成多張表,較少磁盤I/O操作;
  • 水平分庫分表:於數據量龐大的表,使用水平分庫分表
  • 使用緩存,把經常訪問到的數據而且不需要經常變化的數據放在緩存中,能節約磁盤IO;
  • 優化硬件;
  • 主從分離讀寫;採用主從複製把數據庫的讀操作和寫入操作分離開來;

9.索引:

(1)定義:一種高效獲取數據的存儲結構,類似於子字典的目錄
(2)優點:提升數據的查詢速度,減少io操作
(3)缺點:維護成本高,會降低其他操作的執行速度

(4)添加索引:

alter table 表名 add 索引類型 索引名(字段名);

(5)查看所有:

show index from 表名;

(6)刪除主鍵索引:

alter table 表名 drop primary key;

(7)刪除索引:

drop index 索引的名字 on 表名;

二.庫的操作

(1)進入數據庫:

mysql -u用戶名 -p密碼 -h主機地址 -P端口號

(2)創數據庫:

create database 庫名;

(3)使用數據庫:

use 庫名;

(4)查看所有數據庫:

show databases;

(5)刪除數據庫:

drop database 庫名;

三.數據庫的表

(1)創建表:

create table 表名(
	字段名1 約束,
	字段名2 約束,
	)charset=utf8;

(2)查看所有表:

show tables;

(3)查看建表語句:

show create table 表名\G;

(4)刪表:

drop table 表名;

(5)表結構的操作:

①添加字段:

alter table 表名 add 字段名 約束;

②刪除字段:

alter table 表名 drop 字段名;

③修改字段:

alter table 表名 modify 字段名 約束;
alter table 表名 change 舊字段名 新字段名 約束;(不改名則寫兩次舊字段名)

④修改表名

alter table 舊錶名 rename as 新表名;

⑤修改編碼類型:

alter table 表名 charset=utf8;

⑥修改自增值:

alter table students auto_increment=新值;(修改的自增值只能比原數據最大的自增值大)	

四.數據的操作

(1)添加數據

insert into 表名 values(按字段順序依次寫數據1),(按字段順序依次寫數據2);
insert into 表名(指定字段) values(按指定字段順序依次寫數據1),(按指定字段順序依次寫數據2);

(2)更新數據

update 表名 set 字段名=新數據 where 條件;

(3)刪除數據

delete from 表名 where 條件;

(4)基本查詢數據

------------------------------------where條件查詢
select * from 表名 where 條件;

--------------------------------------分組 group by having
例如:select id from 表名 group by id;
select id from 表名 group by id having id>5;(分組和再篩選最後返回數據)
select id from 表名 where id>5 group by id having id>10;(先where篩選再分組再having篩選最後返回數據)

------------------------------------排序 desc(降序) asc(默認,升序)
select * from 表名 order by 排序條件 desc;

-------------------------------------------limit 分頁
select * from 表名 limit 3;(只顯示三個數據)
select * from 表名 limit 3,4;(跳過三個查看四個數據)

--------------------------------------------聚合函數
max最大值:select max(age) from 表名;
min最小值:select min(age) from 表名;
avg平均值:select avg(age) from 表名;
count計數:select age,count(age) from 表名 group by age;

(5) 運算符:

①and:select * from 表名 where 條件一 and 條件二;
②or :select * from 表名 where 條件一 and 條件二;
③in :select * from 表名 where 字段 in (選項1,選項2,選項3..);
④not:select * from 表名 where 字段 not in (選項1,選項2,選項3..);
⑤=  :select * from 表名 where 字段=某值;	

五.關係查詢

(1)嵌套查詢

select * from 表1 where id in(select id from 表2);

(2)where關聯

select * from 表1,表2 where 表1.id=表2.id;

(3)連接查詢

內連接
select * from 表1 inner join 表2 on 表1.id=表2.id;(以共同條件爲準)

左連接
select * from 表1 left join 表2 on 表1.id=表2.id;(已左表爲準)

右鏈接
select * from 表1 right join 表2 on 表1.id=表2.id;(已左表爲準)

六.表的關係

(1)一對一

​ 一張表的一條數據對應另一張表的一條數據

(2)一對多

​ 一張表的一條數據對應另一個表的多條數據(例如班級學生)

(3)多對多

​ 一張表的多條數據對應另一個表的多條數據

七.數據的備份

(1)備份庫:

mysqldump -u root -p 庫名 > 備份的庫名.sql

(2)備份表:

mysqldump -u root -p 庫名 表名 > 備份的表名.sql

(3)導入表/庫:

mysql -uroot -p 庫名 < 備份的文件.sql

(導入庫需要先創建輸入庫,因爲實際是導入表,必須重新創入個新的數據庫,然後再導入)

八.創建mysql用戶,添加權限

(1)創建用戶:

create user '用戶名'@'ip地址' identified by '密碼';

(2)授權:

grant all/select/insert/delete on 庫名.表名 to 用戶名@主機地址;

(3)刪除用戶:

drop user 用戶名@主機地址;

(4)修改密碼:

update user set authentication_string=password('新密碼') where user=‘用戶名’ and host=‘主機地址’;

九.pymysql連接數據庫

步驟:

  • 1.導入pymysql包
  • 2.連接數據庫
  • 3.創建遊標
  • 4.創建sql語句,並且執行
  • 5.若是增刪改需要提交
  • 6.關閉遊標和數據庫
import pymysql
#1.連接數據庫
db=pymysql.connect(host='localhost',port='3306',user='root',password='123456',database='news')
#2.創建遊標
cursor=db.cursor()

#3.寫sql語句
sql1='sql增刪改語句'

#4.執行sql1語句
cursor.execute(sql)

##5.若是增刪改都需要保存命令
db.commit()
sql2='sql查詢語句'
cursor.execute(sql2)#執行sql2語句
print(cursor.fetchone())  # 只獲取一個數據,並且還是個生成器
print(cursor.fetchall())  # 會獲取所有數據

#6.關閉遊標和數據庫
cursor.close()
db.close()

十.orm 瞭解概念

ORM,全稱Object Relational Mapping,意爲對象關係映射。

  • ①ORM是一個操作數據庫的框架

  • ②ORM會將python代碼翻譯成對應數據庫的sql語句

  • ③ORM會將數據庫中的表,映射成python中的類

  • ④一張表就是一個類,將表中的字段映射成對象的屬性。

優點:可以降低數據庫和程序之間的耦合,專注於業務邏輯即可

缺點:ORM生成的sql語句,不是最優的sql語句,執行效率會比較低。

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