MySQL學習筆記
1、關系型數據庫管理系統 RDBMS(Relational Database Management System)
1.1、關系型數據庫的三大范式 范式簡單的說就是,一張數據表的表結構所符合的某種設計標准的級別。 第一范式(1NF):符合1NF的關系中的每個屬性都不可再分。
第二范式(2NF):2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函數依賴。
第三范式(3NF):3NF在2NF的基礎之上,消除了非主屬性對於碼的傳遞函數依賴。
簡單理解: 第一范式:屬性不可分割。(屬性就是表中的字段)
第二范式:要有主鍵,要求其他字段都依賴於主鍵。(附:主鍵的判斷辦法,如果主鍵確定了,其他所有的鍵就確定了)
第三范式:要消除傳遞依賴,方便理解,可以看做是“消除冗余”。
1.2、術語 數據庫:表的集合 數據表:數據矩陣 行: 列: 主鍵:主鍵是唯一的。一張表中只能包含一個主鍵。主要用來查詢。 外鍵:用於關聯兩個表。 索引:對表中一列或多列數據進行排序的結構。
2、安裝MySQL Linux/UNIX 平台 MySQL - MySQL服務器。你需要該選項,除非你只想連接運行在另一台機器上的MySQL服務器。 MySQL-client - MySQL 客戶端程序,用於連接並操作Mysql服務器。 MySQL-devel - 庫和包含文件,如果你想要編譯其它MySQL客戶端,例如Perl模塊,則需要安裝該RPM包。 MySQL-shared - 該軟件包包含某些語言和應用程序需要動態裝載的共享庫(libmysqlclient.so*),使用MySQL。 MySQL-bench - MySQL數據庫服務器的基准和性能測試工具。
Windows 平台 下載安裝包
3、數據類型
類型
大小
范圍(有符號)
范圍(無符號)
用途
備注
TINYINT
1 字節
(-128, 127)
(0, 255)
小整數值
SMALLINT
2 字節
(-32768, 32767)
(0, 65535)
大整數值
MEDIUMINT
3 字節
(-8388608, 8388607)
(0, 16777215)
大整數值
INT 或 INTEGER
4 字節
(-2147483648, 2147483647)
(0, 4294967295)
大整數值
BIGINT
8 字節
(-9233372036854775808 , 9223372036854775807)
(0, 18446744073709551615)
極大整數值
FLOAT
4 字節
(-3.402823466E+38, 1.175494351E-38) , 0 , (1.175494351E-38, 3.402823466351E+38)
0 , (1.175494351E-38, 3.402823466E+38)
單精度 浮點數值
DOUBLE
8 字節
(1.7976931348623157E+308, 2.2250738585072014E-308) , 0 , (2.2250738585072014E-308, 1.7976931348623157E+308)
0 , (2.2250738585072014E-308, 1.7976931348623157E+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
8 字節
1970-01-01 00:00:00/2037 年某時
混合日期和時間值,時間戳
YYYYMMDD HHMMSS
CHAR
0-255 字節
定長字符串
VARCHAR
0-255 字節
變長字符串
TINYBLOB
0-255 字節
不超過 255 個字符的二進制字符串
TINYTEXT
0-255 字節
短文本字符串
BLOB
0-65535 字節
二進制形式的長文本數據
TEXT
0-65535 字節
長文本數據
MEDIUMBLOB
0-16777215 字節
二進制形式的中等長度文本數據
MEDUIMTEXT
0-16777215 字節
中等長度文本數據
LONGBLOB
0-4294967295 字節
二進制形式的極大文本數據
LONGTEXT
0-4294967295 字節
極大文本數據
4、常用命令
分類
說明
命令
備注
連接
登錄服務器
mysql -h1.2.3.4 -u root -p
顯示
庫列表
SHOW DATABASES
表列表
SHOW TABLES
表的結構
SHOW CREATE TABLE table_name DESCRIBE table_name
表的屬性信息
SHOW COLUMNS FROM table_name
表的索引信息
SHOW INDEX FROM table_name
表的狀態信息
SHOW STATUS LIKE 'table_name'
服務器 的狀態信息
SHOW STATUS
服務器配置信息
SHOW VARIABLES
服務器的版本信息
SELECT VERSION()
當前庫名
SELECT DATABASE()
當前用戶名
SELECT USER()
選擇
庫
USE database_name
新建
庫
CREATE DATABASE database_name
表
CREATE TABLE table_name (column_name column_type)
臨時表
CREATE TEMPORARY TABLE table_name (column_name column_type)
臨時表只在當前連接有效,連接斷開後,臨時表自動銷毀。
插入
行
INSERT INTO table_name (field1, field2, ...fieldN)
VALUES
(value1, value2, ...valueN)
刪除
庫
DROP DATABASE database_name
行
DELETE FROM table_name [WHERE clause_etc]
表
DROP TABLE table_name
查詢
行
SELECT field1, field2, ...fieldN FROM table_name1, table_name2, ... [WHERE clause_etc] [OFFSET M] [LIMIT N]
查詢( 聯表)
行(內聯結)
隱式: SELECT table1.column table2.column FROM table1, table2 WHERE table1.column2 = table2.column2 顯式: SELECT table1.column FROM table1 INNER JOIN table2 ON table1.column2 = table2.column2
僅支持 SELECT UPDATE DELETE
行(外左聯結)
SELECT table1.column FROM table1 LEFT JOIN table2 ON table1.column2 = table2.column2
table1 中的記錄全部保留,如果 table2 中無對應的,則默認留空
行(外右聯結)
SELECT table1.column FROM table1 RIGHT JOIN table2 ON table1.column2 = table2.column2
table2 中的記錄全部保留,如果 table1 中無對應的,則默認留空
更新
行
UPDATE table_name SET field1=value1, field2=value2 [WHERE clause_etc]
修改
添加列
ALTER TABLE table_name ADD column_name type
ALTER TABLE table_name ADD column_name type FIRST
ALTER TABLE table_name ADD column_name type AFTER column2
添加到最後一列 (默認) 添加到第一列 添加到指定列 column2 之後
刪除列
ALTER TABLE table_name DROP column_name
修改列(類型)
ALTER TABLE table_name MODIFY column_name type
只修改列字段的類型
修改列(名稱)
ALTER TABLE table_name CHANGE old_column column_name type
同時修改列字段的名稱和類型
表
ALTER TABLE table_name RENAME TO table_name2
修改表名
限定條件
偏移量
OFFSET offset_number
行數
LIMIT limit_number
任意條件
WHERE clause_etc
正則表達式
WHERE column REGEXP 'exp'
排序
升序
ASC
降序
DESC
索引
列
CREATE [UNIQUE] INDEX index_name ON table_name(column(length)) ALTER table_name ADD [UNIQUE] INDEX [index_name] ON ( column(length)) DROP INDEX [index_name] ON table_name
column 如果是 CHAR, VCHAR 類型,length 可以小於字段長度; 如果是 BLOB, TEXT 類型,必須指定 length。
列(組合)
5、操作符 下表中,假設 A=10 B=20
操作符
描述
實例
=
等號,檢測兩個值是否相等,如果是返回true
(A = B) 返回false
<>, !=
不等於,檢測兩個值是否不相等,如果是返回true
(A != B) 返回true
>
大於,檢測左邊的值是否大於右邊的值,如果是返回true
(A > B) 返回false
<
小於,檢測左邊的值是否小於右邊的值,如果是返回true
(A < B) 返回true
>=
大於等於,檢測左邊的值是否大於等於右邊的值,如果是返回true
(A >= B) 返回false
<=
小於等於,檢測左邊的值是否小於等於右邊的值,如果是返回true
(A <= B) 返回true
IS NULL
檢測值是否為NULL
IS NOT NULL
檢測值是否不為NULL
6、連接符
操作符
描述
備注
AND
連接兩個條件,表示左邊與右邊的條件必須同時成立,結果才成立
OR
連接兩個條件,表示左邊與右邊的條件任意一個成立,結果就成立
LIKE
條件匹配,通常與 % 一起使用達到模糊查詢的效果
WHERE feild LIKE '%abc'
7、正則表達式
模式
描述
備注
^
匹配輸入字符的 開始位置。如果設置了 RegExp 對象的 Multiline 屬性, ^ 也匹配 '\n' 或 '\r' 之後的位置。
$
匹配輸入字符的結束位置。如果設置了 RegExp 對象的 Multiline 屬性, ^ 也匹配 '\n' 或 '\r' 之前的位置。
[...]
字符集合。匹配所包含的任意一個字符。
例如,'[abc]' 可以匹配 'plain' 中的 'a'。
.
匹配除 '\n' 之外的任何單個字符。
要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。
[^...]
負值字符集合。匹配未包含的任意字符。
例如,'[^abc]' 可以匹配 'plain' 中的 'p' 'l' 'i' 'n'
{n}
n 是一個非負整數。 匹配前面表達式確定的 n 次。
例如,'o{2}' 能匹配 'food'
{n, m}
m n 均為非負整數,其中 n <= m。 匹配前面表達式最少 n 次,最多 m 次。
p1|p2
匹配 p1 或 p2。
例如,'z|food' 能匹配 'z' 或 'food'
*
匹配前面的子表達式零次或多次 。 等價於 {0,}
例如,'zo*' 能匹配 'z' 'ozz'。
+
匹配前面的子表達式一次或多次。
等價於 {1,}
8、事務 用來保證一組 sql 命令,全部執行,如果失敗回滾到執行前的狀態。 事務必須滿足4個條件(ACID):Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、durability(可靠性) 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
9、序列 使用關鍵詞 AUTO_INCREMENT 來定義一個整數列自增。
10、SQL 注入 防止 SQL 注入,需要注意以下幾點:
永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則,或限制長度;對單引號和雙"-"進行轉換等。
永遠不要使用動態拼裝 sql,可以使用參數化的 sql 或者直接使用存儲過程進行數據查詢存取。
永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。
不要把機密信息直接存放,加密或者 hash 掉密碼和第三的信息。
應用的異常信息應該給出盡可以少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。
sql 注入的檢測方法一般采取輔助軟件或網站平台來檢測,軟件一般采用 sql 注入檢測工具。