軟件測試面試最常考的mysql知識點,最好看完這個再去面試!

關注公衆號【測試開發Guide】

回覆「java」:即可獲得java經典學習資料,帶你輕鬆入門java編程。
回覆「python」:免費獲取「python入門」高分好書,業餘時間偷偷變牛逼。
回覆「面試」:24個常見的測試面試題,你一定不想錯過。
回覆「書單」:獲取2020年軟件測試工程師必看的書單
回覆「測試用例」:獲取本人常用的 Excel 和 Xmind 測試用例模版
回覆「測試工具」:獲取 mac 和 windows 常用的測試工具
 

秋招之後,部門又來了好多小鮮肉,其中有部分同學是沒有用過MySQL的,我把自己以前做過的筆記又重新整理了一番,希望能夠對新同學有幫助!

 

什麼是DML、DDL、DCL?

DML(data manipulation language):

它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對數據庫裏的數據進行操作的語言

 

DDL(data definition language):主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,數據類型,表之間的鏈接和約束等初始化工作上,他們大多在建立表時使用

 

DCL(Data Control Language):是數據庫控制功能。是用來設置或更改數據庫用戶或角色權限的語句,包括(grant,deny,revoke等)語句。在默認狀態下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人員纔有權力執行DCL

 

TCL(Transaction Control Language):事務控制語言,包括:set transaction\rollback\savepoin

 

 

MySQL常用命令

DDL

創建數據庫

create database 數據庫名;

 

查看數據庫列表

show databases;

 

使用數據庫

use 數據庫名;

 

刪除數據庫

drop database 數據庫名;

 

創建數據表

CREATE TABLE IF NOT EXISTS `codes_user`(->    `user_id` INT UNSIGNED AUTO_INCREMENT,->    `user_title` VARCHAR(100) NOT NULL,->    `user_author` VARCHAR(40) NOT NULL,->    `submission_date` DATE,->    PRIMARY KEY ( `user_id` )-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

查看數據表設計

方法一

desc 表名

方法二

show create table 表名

 

刪除數據表

drop table 表名;

 

清空表

truncate table 表名;

或者

delete from 表名;

 

刪除字段

ALTER TABLE 表名 DROP 字段名;

 

新增字段

ALTER TABLE 表名 ADD 字段名 INT; # INT 是字段類型

 

修改字段類型

ALTER TABLE 表名 MODIFY 字段名 CHAR(10); # 修改字段類型

 

修改字段

ALTER TABLE 表名 CHANGE 舊字段名 新字段名 BIGINT; # BIGINRT 是新字段的數據類型

 

創建索引

# 方法一alter table 表名 add index 索引名(字段1,字段2...);   # 創建普通索引alter table 表名 add unique 索引名(字段1,字段2...);   # 創建unique索引alter table 表名 add primary 索引名(字段1,字段2...);   # 創建主鍵索引
# 方法二create index 索引名 on 表名 (字段1,字段2...);   # 創建普通索引

 

查看索引信息

SHOW INDEX FROM 表名\G;

 

刪除索引

ALTER TABLE 表名 DROP INDEX 索引名DROP INDEX 索引名 ON 表名

 

DQL and DML

查詢

查詢結果去重

select distinct 字段名 from 表名;

 

限制 limit與offset

select * from 表名 limit 5; # 只檢索5條數據select * from 表名 limit 5 offset 10; # 從第5條數據開始,取10條數據

 

 

排序 order by

select * from 表名 order by id; # ASC 默認是升序排列select * from 表名 order by id desc; # DESC 默認是升序排列

 

 

數據過濾

or與and

select * from TB_User where ( score=100 or score=200) and age>18; # or 的優先級小於 and,需要加括號

in 與 not in

select * from TB_User where age in (20, 21)

between..and

select * from TB_User where age between 18 and 20

 

模糊匹配 關鍵字 like

# “%” 表示任意多個字符# 完全匹配張三select * from TB_User where name like '張三';# 以張三結尾select * from TB_User where name like '%張三';# 以張三開頭select * from TB_User where name like '張三%';# 結果包含張三select * from TB_User where name like '%張三%';# “_” 表示任意單個字符select * from TB_User where name like '_張三';select * from TB_User where name like '張三_';

 

正則匹配 關鍵字 regexp

# 以張三開頭select * from TB_User where name regexp '^張三';# 以張三結尾select * from TB_User where name regexp '張三$';# “.” 匹配任意一個字符select * from TB_User where name regexp '.三';# 匹配以姓是張、趙的學生SELECT * FROM tb_student WHERE `name` REGEXP '^[張趙]';# 匹配“張張張三”SELECT * FROM tb_student WHERE `name` REGEXP '張{3}';

 

拼接字段

select Concat(name, '(', age, ')') from user order by age;

 

內置函數

select AVG(price) AS avg_price from TB_Order where orderID='100'; # 返回某列的平均值select Count(*) from TB_User # 返回user錶行數 count(*) 不省略null值select Max(score) from TB_Student # 返回最大值select Min(score) from TB_Student # 返回最小值select SUM(score) from TB_Student where name='老王'; # 返回求和

 

 

分組

group by 以某個字段進行分組

select name, AVG(score) as avg_score from TB_Student group_by name; # 統計每個學生的平均分

having 過濾分組,having後面一般跟聚合函數使用,且需要和group by配合使用

select name, AVG(score) as avg_score from TB_Student group_by name having avg_score>90; # 統計每個學生的平均分,並且過濾出平均分大於90的記錄

 

 

SELECT 子句順序

select > from > where > group by > having > order by > limit

 

聯結查詢 JOIN

內聯查詢

# 假設 TB_A 與 TB_B 有公共字段 a# 寫法一select a, b from TB_A, TB_B where TB_A.a = TB_B.a# 寫法二select a, b from TB_A inner join TB_B on TB_A.a = TB_B.a

 

自聯結

select student, score from TB_Student where tag = (select tag from TB_StudentTag where tag = '優秀' );

 

外部連結(左連結和右連結)

# 假設 TB_A 與 TB_B 有公共字段 aselect TB_A.a, TB_b.b from TB_A left outer JOIN TB_B ON TB_A.a = TB_B.a;

全連結

select TB_A.a, TB_B.b from TB_A full join TB_B on TB_A.a=TB_B.a;

 

附上 sql 各種聯結查詢圖解

 

組合查詢 UNION

# 使用場景:# 1、單表執行多個查詢,按單個查詢返回數據# 2、在單個查詢中,從不同的表返回類似結構的數據
# 數據去重 unionselect A.key1 from A union select B.key1 from B;# 數據不去重 union allselect A.key1 from A union all select B.key1 from B;

 

增加

INSERT INTO 表名 VALUES(值1,值2...);INSERT INTO 表名(字段1,字段2...) VALUES(值1,值2...);INSERT INTO 表名(字段1,字段2...) select 字段1,字段2... from 表名(可以是其他表);

 

修改​​​​​​​

update 表名 set 字段名 = 新值 where id = '100';

 

刪除​​​​​​​

# 刪除 id 爲 '100' 的數據delete from 表名 where id = '100';

 

DCL

數據庫授權

grant all privileges  on *.* to root@'%' identified by "root_pwd";

 

mysql複製表

語法:mysqldump -u用戶名 -p密碼 -d 數據庫名 表名 > 腳本名;​​​​​​​

# 導出整個數據庫結構和數據mysqldump -h localhost -uroot -p123456 database > dump.sql# 導出單個數據表結構和數據mysqldump -h localhost -uroot -p123456  database table > dump.sql# 導出整個數據庫結構(不包含數據)mysqldump -h localhost -uroot -p123456  -d database > dump.sql# 導出單個數據表結構(不包含數據)mysqldump -h localhost -uroot -p123456  -d database table > dump.sql

 

如何進行慢查詢分析

explain select sql語句

結果分析

type(從最優到最差):const > eq_reg > ref > range > index > all

key :若爲null,則沒有使用索引

key_len :索引長度,越短越好

 

 

SQL優化方法​​​​​​​

1. 索引優化,添加複合索引2. 分表,大表拆小表3. 儘量避免 select *,杜絕 select * from tb_name4. 儘量避免 select * from tb_name where name like 'xxx'5. 避免在大表上的 group by,order by,offset 操作6. WHERE查詢條件,儘量按照添加的索引順序來寫

 

非關係型數據庫和關係型數據庫的比較

關係型數據庫:MySQL、SQL Server、Oracle、PostgreSQL、SQLite

優點:​​​​​​​

1. 查詢能力高,可以操作很複雜的查詢2. 一致性高。在數據同步時,一般採用鎖來保證數據的可靠性,在處理數據時,對錶進行封鎖來保證操作的時候其他操作不能改變查詢範圍的數據3. 表具有邏輯性,易於理解

缺點:​​​​​​​

1. 不適用高併發讀寫2. 不適用海量數據高效讀寫3. 層次多,擴展性低4. 維護一致性開銷大5. 涉及聯表查詢,複雜,慢

 

非關係型數據庫:Hbase、Redis、MongoDB、Memcached

優點:​​​​​​​

1. 由於數據之間沒有關係,所以易擴展,也易於查詢2. 數據結構靈活,每個數據都可以有不同的結構3. 由於降低了一致性的要求,所以查詢速度更快

缺點:

1. 數據準確度沒有那麼高

 

事務的四大特徵是什麼?

特點:原子性、一致性、隔離性和持久性(ACID)

 

 

什麼是髒讀、不可重複讀、幻讀?

髒讀

髒讀就是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。(未提交 讀)

不可重複讀

是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那麼,在第一個事務中的兩 次讀數據之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,(不可重複讀)

幻讀

是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有 沒有修改的 數據行,就好象 發生了幻覺一樣。

 

 

如何避免髒讀、不可重複讀、幻讀?

隔離級別設置爲:可串行化(Serializable)【鎖表】

 

 

事務隔離級別有哪些?

從上到下,級別提高​​​​​​​

​​​​​​​​​​​​​​1. 讀未提交(read uncommited)【隔離級別最低,併發性能高】(髒讀、不可重複讀、幻讀)

2. 讀已提交(read commited)【鎖定正在讀取的行】(不可重複讀、幻讀)

3. 可重複讀(repeatable read)【鎖定所讀區的所有行】(幻讀)4. 可串行化(serializable)【鎖表】

 

▼▼▼

細心的同學可能會看到,示例的sql語句關鍵字有大寫的,也有小寫的。當然不管大寫還是小寫,都能執行成功,但是本文最後,還是有兩點補充要送給大家。​​​​​​​

1. SQL語句關鍵字儘量用大寫書寫2. 千萬不要在同一條SQL語句中出現關鍵字既有大寫也有小寫的情況

 

長按識別下方二維碼關注公衆號

關注我的微信公衆號【測試開發Guide】,

 

回覆「java」:即可獲得java經典學習資料(我花200元買的),帶你輕鬆入門java編程。

回覆「python」:免費獲取「python入門」高分好書,業餘時間偷偷變牛逼。

回覆「面試」:24個常見的測試面試題,你一定不想錯過。

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