MYSQL入門基礎知識

一、數據庫安裝

關於數據庫安裝部分可以參考菜鳥教程,這個是個不錯的網站。

https://www.runoob.com/mysql/mysql-install.html

另外,關於數據庫操作,可以使用Navicat工具進行數據庫連接和操作。也可以使用IDEA自帶的插件工具。

在這裏插入圖片描述
鏈接:https://pan.baidu.com/s/14u_CnbfC185K2tR2krVmhQ
提取碼:gkw7
這個是該軟件的壓縮包,有需要的自提。

安裝完之後,連接測試。具體步驟就不詳細寫了。比較簡單。

創建一個新數據庫:

# 創建一個數據(單行註釋方法1)
create database test;
-- 使用一個數據庫 (單行註釋方法2)
use test;
-- 查看所有的數據庫
show databases;
-- 刪庫跑路
drop database test;

二、數據類型

1、數值類型

在這裏插入圖片描述

2、日期和時間類型

在這裏插入圖片描述

3、字符串類型

在這裏插入圖片描述
注意:char(n) 和 varchar(n) 中括號中 n 代表字符的個數,並不代表字節個數,比如 CHAR(30) 就可以存儲 30 個字符。

CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。

BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,並且排序和比較基於列值字節的數值值。

BLOB 是一個二進制大對象,可以容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不同。

有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據實際情況選擇。

三、常用命令

1、基本術語

  • 數據庫: 數據庫是一些關聯表的集合。
  • 數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
  • 列: 一列(數據元素) 包含了相同類型的數據, 例如郵政編碼的數據。
  • **行:**一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
  • 冗餘:存儲兩倍數據,冗餘降低了性能,但提高了數據的安全性。
  • 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
  • **外鍵:**外鍵用於關聯兩個表。
  • 複合鍵:複合鍵(組合鍵)將多個列作爲一個索引鍵,一般用於複合索引。
  • **索引:**使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
  • 參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證數據的一致性。

2、常用命令

增刪改查系列:

-- 創建數據表
CREATE TABLE table_name (column_name column_type);
-- 刪除數據表
DROP TABLE table_name ;
-- 插入數據
INSERT INTO table_name (field1,field2,....fieldN ) Values (value1,value2,...valueN);
-- 查詢語句
SELECT column_name,column_name FROM table_name [WHERE Clause] [LIMIT N] [ OFFSET M]
-- 分頁查詢
SELECT * FROM table_name LIMIT (start-1)*PageSize,PageSize;
-- 刪除語句
DELETE FROM table_name [WHERE Clause]
-- 更新語句
UPDATE table_name SET field1=new-value,field2=new-value [WHERE Clause] 

子句系列:

WHERE 數據庫中的if條件

-- where 相當於if判斷條件,後可以接AND,OR,BETWEEN...AND...;BINARY 用於區分大小寫,mysql默認不區分
SELECT * FROM table_name WHERE BINARY name="Tom";

LIKE 由於存在 % 導致索引失效

-- LIKE 配合WHERE使用
SELECT * FROM table_name WHERE name LIKE '%om'
-- 索引失效
SELECT * FROM table_name WHERE name LIKE '%om'
-- 索引失效
SELECT * FROM table_name WHERE name LIKE '%om%'
-- 索引不失效,但實際上無法滿足開發需求
SELECT * FROM table_name WHERE name LIKE 'om%'
/*
假設有一張表,其中id和name都是索引,id是主鍵索引,age不是索引
*/
-- 索引生效
SELECT id,name FROM table_name WHERE name LIKE '%om%'
-- 索引失效.由於存在非索引字段。
SELECT id,name,age FROM table_name WHERE name LIKE '%om%'

總結:

1、實際開發中,禁止使用SELECT * From table_name進行查詢。

2、LIKE以%開頭會導致索引失效;使用覆蓋索引解決之

DISTINCT 去重複值

SELECT DISTINCT fieldName FROM table_name;

UNION 集合操作

-- 用於合併兩個或多個select結果集,不允許有重複值
SELECT teacher_name FROM class_one
	UNION
SELECT techer_name From class_two
-- 用於合併兩個或多個select結果集,允許有重複值
SELECT teacher_name FROM class_one
	UNION ALL
SELECT techer_name From class_two

ORDER BY

-- 排序,DESC(降序);ASC(升序)
SELECT id,name,score FROM student ORDER BY score ASC(DESC);

GROUP BY 語句根據一個或多個列對結果集進行分組。在分組的列上我們可以使用 COUNT, SUM, AVG,等函數。

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
--舉例 
SELECT * FROM student;

在這裏插入圖片描述

-- 計算男生女生的平均分
SELECT sex, AVG(score)FROM student GROUP BY sex;
-- 計算男生女生的總分
SELECT sex, SUM(score)FROM student GROUP BY sex;

在這裏插入圖片描述
在這裏插入圖片描述

HAVING 常用在GROUP BY 後面,相當於WHERE作用

-- 計算出男女的平均分,並返回女生的平均分結果
SELECT sex, AVG(score)FROM student GROUP BY sex HAVING sex='女';

JOIN:

INNER JOIN

-- join 默認是內連接,可以省略inner.
SELECT s.sex,s.name,c.class FROM student s
INNER JOIN class c
ON s.name = c.name

在這裏插入圖片描述

JOIN:

LEFT JOIN

-- 左連接,返回左表匹配的所有行,右表沒有的數據用null值代替
SELECT s.sex,s.name,c.class FROM student s
LEFT JOIN class c
ON s.name = c.name

在這裏插入圖片描述

JOIN:

RIGHT JOIN

-- 右連接,返回右表匹配的所有行,左表沒有的數據用null值代替
SELECT s.sex,s.name,c.class FROM student s
RIGHT JOIN class c
ON s.name = c.name

在這裏插入圖片描述

ALTER

-- 刪除數據表中的字段
ALTER TABLE table_name DROP fieldName;
-- 增加數據表中的字段
ALTER TABLE table_name ADD fieldName int
-- 修改數據表中的字段:
-- 方法一:例如將fieldName varchar(10)修改爲varchar(50)
ALTER TABLE table_name MODIFY fieldName varchar(50);
-- 方法二:例如將fieldName varchar(10)修改爲newFieldName varchar(50)
ALTER TABLE table_name CHANGE fieldName newFieldName varchar(50);
-- 修改字段默認值
ALTER TABLE table_name ALTER fieldName SET DEFAULT values;
-- 修改表名字
ALTER TABLE table_name RENAME TO new_table_name;
-- 刪除外鍵約束
ALTER TABLE table_name FOREIGN KEY keyName;

四、mysql事務

1、事務的四個特性(acid)

  • 原子性: 一個事務中的所有操作,要麼全部成功,要麼都失敗。如若中途發生錯誤,將會回滾。
  • 一致性: 事務前和事務後,數據庫的完整性沒有被破壞,
  • 隔離性: 數據庫允許多個事務同時對數據庫進行數據修改和讀寫的能力,隔離性可以預防多個事務併發執行時造成的數據不一致。
  • 持久性: 事務處理結束後,對數據的修改就是永久的。

2、事務的隔離級別

事務隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted)
不可重複讀(read-committed)
可重複讀(repeatable-read)
串行化(serializable)

名詞解釋:

1、髒讀

當事務A進行了數據增加,尚未提交事務,此時,如果數據庫設置的隔離級別爲讀未提交(即可以讀到未提交的數據)的話,事務B進行SELECT操作,可以讀到新增數據。但是如果事務A進行了回滾,而不是提交該更新操作,則該數據就是一條髒數據,該操作即爲髒讀。

2、不可重複讀

事務A在對某個數據進行多次讀取時,事務B對該數據進行了更新修改操作(UPDATE),導致多次讀取同一數值時,結果不一致。可以看做是發生了質變。

3、幻讀

事務A在對數據表進行讀取操作時,事務B對該數據表進行了增刪操作(INSERT/DELETE),導致多次讀取同一數據時,前後內容數量上有差異。可以看做是發生了量變。

mysql默認的隔離級別是可重複讀,而oracle默認的隔離級別是不可重複讀。串行化雖然保證了數據的安全性,但是效率非常差,一般不會用。

3、MYSQL 事務處理主要有兩種方法:

1、用 BEGIN, ROLLBACK, COMMIT來實現

  • BEGIN 開始一個事務
  • ROLLBACK 事務回滾
  • COMMIT 事務確認

2、直接用 SET 來改變 MySQL 的自動提交模式:

  • SET AUTOCOMMIT=0 禁止自動提交
  • SET AUTOCOMMIT=1 開啓自動提交

五、索引

索引可以看做是數據字典的目錄,沒有索引的設計和使用的mysql就相當於一個人力三輪車。

img

而如果索引建立且設計較好,mysql就相當於一個蘭博基尼。

img
在這裏插入圖片描述

1、索引的優缺點:

優點:

  • 索引大大減小了服務器需要掃描的數據量
  • 索引可以幫助服務器避免排序和臨時表
  • 索引可以將隨機IO變成順序IO
  • 索引對於InnoDB(對索引支持行級鎖)非常重要,因爲它可以讓查詢鎖更少的元組。在MySQL5.1和更新的版本中,InnoDB可以在服務器端過濾掉行後就釋放鎖,但在早期的MySQL版本中,InnoDB直到事務提交時纔會解鎖。對不需要的元組的加鎖,會增加鎖的開銷,降低併發性。 InnoDB僅對需要訪問的元組加鎖,而索引能夠減少InnoDB訪問的元組數。但是隻有在存儲引擎層過濾掉那些不需要的數據才能達到這種目的。一旦索引不允許InnoDB那樣做(即索引達不到過濾的目的),MySQL服務器只能對InnoDB返回的數據進行WHERE操作,此時,已經無法避免對那些元組加鎖了。如果查詢不能使用索引,MySQL會進行全表掃描,並鎖住每一個元組,不管是否真正需要。
  • 關於InnoDB、索引和鎖:InnoDB在二級索引上使用共享鎖(讀鎖),但訪問主鍵索引需要排他鎖(寫鎖)

缺點:

  • 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因爲更新表時,MySQL不僅要保存數據,還要保存索引文件。
  • 建立索引會佔用磁盤空間的索引文件。一般情況這個問題不太嚴重,但如果你在一個大表上創建了多種組合索引,索引文件的會膨脹很快。
  • 如果某個數據列包含許多重複的內容,爲它建立索引就沒有太大的實際效果。
  • 對於非常小的表,大部分情況下簡單的全表掃描更高效;

2、索引的分類

主鍵索引: 根據主鍵建立的索引,加速查詢,列值唯一(不能爲null),表中只能有一個

-- 其實就是主鍵。如果主鍵存在則默認爲主鍵索引
ALTER TABLE table_name ADD PRIMARY KEY pk_index('col');

唯一索引: 加速查詢,列值唯一,允許爲null。不允許行中有重複值

ALTER TABLE 'table_name' ADD UNIQUE index_name('col');

普通索引: 僅僅是用於構建索引,無限制。

ALTER TABLE 'table_name' ADD INDEX index_name('col');

組合索引: 多列值組成一個索引,專門用於組合搜索,列中不允許有null值。效率大於索引合併。

ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3');
-- 在對多列組合建立索引時,會遵循「最左前綴」原則。
-- 只要條件中都用到了三個索引,索引就生效,與col1、col2、col3的順序位置無關
SELECT * FROM table_name WHERE col1=1 AND col3=3 AND col2=2;
-- col2出現了斷點,col1索引會生效,col3索引不會生效
SELECT * FROM table_name WHERE col1=1 AND col3=3;
-- col1出現了斷點,col2和col3索引不會生效
SELECT * FROM table_name WHERE col3=3 AND col2=2;
-- 範圍值也算斷點,col1出現了斷點,col2和col3索引不會生效。例如:
SELECT * FROM table_name WHERE col1>1 AND col3=3 AND col2=2;

六、如何防止SQL注入

在實際開發過程中,由於一些參數是不確定的,因此我們經常會將sql語句進行拼接,那麼,在拼接sql語句過程中,無法預知用戶會輸入什麼樣的內容,因此,會出現意想不到的結果。

防止SQL注入,我們需要注意以下幾個要點:

  • 1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。
  • 2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
  • 3.永遠不要使用管理員權限的數據庫連接,爲每個應用使用單獨的權限有限的數據庫連接。
  • 4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
  • 5.應用的異常信息應該給出儘可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
  • 6.sql注入的檢測方法一般採取輔助軟件或網站平臺來檢測,軟件一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。

我們常用的mybatis框架是如果做SQL防止注入的呢?

#{}:相當於JDBC中的PreparedStatement

${}:是輸出變量的值

簡單說,#{}是經過預編譯的,是安全的;${}是未經過預編譯的,僅僅是取變量的值,是非安全的,存在SQL注入。

所以我們儘可能的使用#{}進行佔位。如果真要${}這個,就需要對輸入內容進行嚴格的過濾。在銀行系統中,要求較高,多爲數據庫的存儲過程。

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