關注公衆號【測試開發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 有公共字段 a
select 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、在單個查詢中,從不同的表返回類似結構的數據
# 數據去重 union
select A.key1 from A union select B.key1 from B;
# 數據不去重 union all
select 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_name
4. 儘量避免 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個常見的測試面試題,你一定不想錯過。