數據庫 類型 特性 優點 缺點 關系型數據庫 SQLite、Oracle、mysql 1、關系型數據庫,是指采用了關系模型來組織 數據的數據庫; 2、關系型數據庫的最大特點就是事務的一致性; 3、簡單來說,關系模型指的就是二維表格模型, 而一個關系型數據庫就是由二維表及其之間的聯系所組成的一個數據組織。 1、容易理解:二維表結構是非常貼近邏輯世界一個概念,關系模型相對網狀、層次等其他模型來說更容易理解; 2、使用方便:通用的SQL語言使得操作關系型數據庫非常方便; 3、易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗余和數據不一致的概率; 4、支持SQL,可用於復雜的查詢。 1、為了維護一致性所付出的巨大代價就是其讀寫性能比較差; 2、固定的表結構; 3、高並發讀寫需求; 4、海量數據的高效率讀寫; 非關系型數據庫 MongoDb、redis、HBase 1、使用鍵值對存儲數據; 2、分布式; 3、一般不支持ACID特性; 4、非關系型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。 1、無需經過sql層的解析,讀寫性能很高; 2、基於鍵值對,數據沒有耦合性,容易擴展; 3、存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,而關系型數據庫則只支持基礎類型。 1、不提供sql支持,學習和使用成本較高; 2、無事務處理,附加功能bi和報表等支持也不好;
先上一個比較表述專業化的表格分析。
關系型數據庫優點:
-
用的都是表結構,比較容易理解
-
使用的是通用的SQL語言
-
減少了數據的冗余和數據不一致的情況發生
-
可以進行表或者多個表之間的復雜查詢
關系型數據庫缺點:
-
固定的表結構,靈活性欠缺
-
為了維持表結構而犧牲了讀寫性能
-
高並發讀寫能力較差
非關系型數據庫優點:
-
格式靈活,數據類型多種多樣,可以是鍵對值,甚至是文檔,圖片,應用場景廣泛,但是關系型數據庫只支持原有的數據類型
-
由於是非關系型,數據沒有耦合性,容易擴展
-
無須通過sql層的解析,讀寫能力較高
-
成本低,nosql數據庫部署簡單,基本都是開源軟件
非關系型數據庫缺點:
-
不提供sql支持,學習成本高
-
無事務支持
-
由於數據類型靈活,也導致了數據結構相對復雜,在復雜查詢方面比較麻煩
總結
數據庫操作
1.創建數據庫:create database ${new_Database_Name}
2.刪除數據庫:drop database${database_Name}
3.建表: create table ${table_Name} {
${'field_name1'} ${field_type} primary key,
//設立第一個字段的名字和字段類型且將第一個字段作為主鍵,設立主鍵也是為了保障數據之間的關聯性
${'field_name1'} ${field_type},
//設立第二個字段的名字和字段類型
}
4.刪除表 drop table ${table_name}
5.插入數據 insert into ${table_name} values(value1,value2,value3)
insert into ${table_name}(field1,field2) values(value1,value2) //指定字段插入
-
數據庫查詢 select ${field_name2,filed_name2} from ${database_name}
where 表達式
-
刪除數據 delete from ${table_name}
where 表達式
表達式中可以包含LIKE,REGEXP ,並且可以后接union select 進行聯合查詢
8.數據更新 update ${table_name} set ${field_name}=${value} where 表達式
數據類型
數值
類型 | 大小 | 范圍(有符號) | 范圍(無符號) | 用 途 |
---|---|---|---|---|
TINYINT | 1 字節 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 字節 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 字節 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 字節 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 字節 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 字節 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度 浮點數值 |
DOUBLE | 8 字節 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
日期時間
類型 | 大小 (字節) | 范圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
字符串類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字節 | 定長字符串 |
VARCHAR | 0-65535 字節 | 變長字符串 |
TINYBLOB | 0-255字節 | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255字節 | 短文本字符串 |
BLOB | 0-65 535字節 | 二進制形式的長文本數據 |
TEXT | 0-65 535字節 | 長文本數據 |
MEDIUMBLOB | 0-16 777 215字節 | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215字節 | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295字節 | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295字節 | 極大文本數據 |
實踐
先創建一個新的庫作為練手,最后使用use語句選擇則新創建的數據庫
在test庫中分別建立了digit,time,string三個表來分別存儲數值,日期時間,字符串三種不同的類型數據
這里可以通過desc語法查看表的結構
進行簡單的數據插入操作
然后進行查詢操作
這里進行查詢操作,由於表中只有一條數據就不后加whre和表達式了,可以看到數據被更改成10了
這里進行數據刪除的操作,先插入一條無用的數據
進行刪除
可以看到之前插入的數據消失了,刪除成功,至此mysql的基本操作學習完成。
----------分隔符---------
mysql指令
limit指令
limit [位置偏移量,]行數
若第一條記錄的偏移量為0,可以理解為跳過了多少條記錄,行數則代表從偏移量開始返回多少條數據
偏移量默認為0
limit 4 代表 返回4條數據
limit 0,3 代表從0開始返回3條數據
REGEXP正則表達式
匹配模式內容過多,這里不用於闡述
補充:關於LIKE和REGEXP的區別:LIKE匹配整個列。如果被匹配的文本僅在列值中出現,LIKE並不會找到它,相應的行也不會返回(當然,使用通配符除外)。而REGEXP在列值內進行匹配,如果被匹配的匹配的文本在列值中出
查看表結構
descript ${table_name} 可以省略為desc
增添新用戶
授權:grant select on 數據庫.* to 用戶名@登錄主機 identified by “密碼”
例子:grant select,insert,update,delete on test.digit to test1@localhost “%” Identified by “abc”;
例子中增加了一個用戶test1密碼為abc且只可以在本地登錄,且對test庫的digit表具有插入,查詢,插入三中操作權限的用戶
收回權限: 例子:revoke delete ON test.digit from test1@localhost;
將test1對test庫中digit表的刪除權限去除。
-
ALTER: 修改表和索引
-
CREATE: 創建數據庫和表
-
DROP: 拋棄(刪除)數據庫和表
-
INDEX: 創建或拋棄索引
-
INSERT: 向表中插入新行
-
SELECT: 檢索表中的記錄
-
UPDATE 修改現存表記錄
-
FILE: 讀或寫服務器上的文件
-
PROCESS: 查看服務器中執行的線程信息或殺死線程
-
RELOAD: 重載授權表或清空日志。主機緩存或表緩存
-
SHUTDOWN: 關閉服務器
-
ALL: 所有權限,ALL PRIVILEGES同義詞 USAGE: 特殊的“無權限”權限
除此之外還有十二種單獨授權,可以搭配起來進行使用
刪除用戶
例子:Delete FROM user Where User='test' and Host='localhost'; 刪除一個user為test且host為本地網絡的賬號
這里也可以使用update語句修改用戶user的password字段
加索引
mysql> alter table 表名 add index 索引名 (字段名1[,字段名2 …]); 例子: mysql> alter table employee add index emp_name (name);
加主關鍵字的索引
mysql> alter table 表名 add primary key (字段名); 例子: mysql> alter table employee add primary key(id);
加唯一限制條件的索引
mysql> alter table 表名 add unique 索引名 (字段名); 例子: mysql> alter table employee add unique emp_name2(cardnumber);
刪除某個索引
mysql> alter table 表名 drop index 索引名; 例子: mysql>alter table employee drop index emp_name;
增加字段
mysql> ALTER TABLE table_name ADD field_name field_type;
例如:在表MyClass中添加了一個字段passtest,類型為int(4),默認值為0 mysql> alter table MyClass add passtest int(4) default '0'
修改原字段名稱及類型: mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
刪除字段: MySQL ALTER TABLE table_name DROP field_name;
修改表名
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改為YouClass mysql> rename table MyClass to YouClass;
當你執行 RENAME 時,你不能有任何鎖定的表或活動的事務。你同樣也必須有對原初表的 ALTER 和 DROP 權限,以及對新表的 CREATE 和 INSERT 權限。
如果在多表更名中,MySQL 遭遇到任何錯誤,它將對所有被更名的表進行倒退更名,將每件事物退回到最初狀態。
附錄:sqli-lab 安裝
uname -a //保證linux內核是3.01以上
sudo apt-get install -y docker.io
docker version //檢查安裝情況
sudo groupadd docker //建立新的用戶組
sudo gpasswd -a ${USER} docker //然后把當前用戶加入docker組
sudo service docker restart //重啟服務
newgrp - docker //切換到docker用戶組
//默認情況下, docker 命令會使用 Unix socket 與 Docker 引擎通訊。
//而只有 root 用戶和docker 組的用戶才可以訪問 Docker 引擎的Unix socket。
//這就是換源的原因
sudo vim /etc/docker/daemon.json //這一步用於換docker源,鏡像源自尋
docker search sqli-lab
docker pull ${mirror-name}
docker run -dt --name sqli -p 5000:80 --rm acgpiano/sqli-labs //啟動sqli-lab-dt 讓其在后台運行
//-dt 讓其在后台運行 --name 給其命名 -p 本地端口:docker中的端口 是將docker的端口映射到本地端口
//--rm 當其關閉后將刪除開啟的資源
這時候打開本地的5000端口即可運行sqli-lab
