加油,給自己。
MySql 現在應該是使用到比較流行的關係型數據庫,除去那些非關係型數據庫。所以掌握好MySql的知識是很有必要的。 這裏的安裝什麼的可以參考之前的博客,好像之前有特意寫到過MySql在Linux上的安裝。如果是win10上的話,那就是一步一步的next,做一個utf8的設置就可以了,可視化界面的安裝還是比較簡單的。
1 : 基本操作
win 上 :
net start mysql 啓動MySql服務
mysql -h 地址 -P 端口 -u 用戶名 -p 密碼 (如果是win10上的話,就需要mysql/bin做一個環境變量的配置,有點類似於Java那樣)SHOW VARIABLES 顯示系統變量信息
2 : 數據庫的操作
/* 數據庫操作 */ ------------------
-- 查看當前數據庫
SELECT DATABASE();
-- 顯示當前時間、用戶名、數據庫版本
SELECT now(), user(), version();
-- 創建庫
CREATE DATABASE[ IF NOT EXISTS] 數據庫名 數據庫選項
數據庫選項:
CHARACTER SET charset_name
COLLATE collation_name
-- 查看已有庫
SHOW DATABASES[ LIKE 'PATTERN']
-- 查看當前庫信息
SHOW CREATE DATABASE 數據庫名
-- 修改庫的選項信息
ALTER DATABASE 庫名 選項信息
-- 刪除庫
DROP DATABASE[ IF EXISTS] 數據庫名
同時刪除該數據庫相關的目錄及其目錄內容
3 : 表的操作
-- 創建表
CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [庫名.]表名 ( 表的結構定義 )[ 表選項]
每個字段必須有數據類型
最後一個字段後不能有逗號
TEMPORARY 臨時表,會話結束時表自動消失
對於字段的定義:
字段名 數據類型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']
-- 表選項
-- 字符集
CHARSET = charset_name
如果表沒有設定,則使用數據庫字符集
-- 存儲引擎
ENGINE = engine_name
表在管理數據時採用的不同的數據結構,結構不同會導致處理方式、提供的特性操作等不同
常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive
不同的引擎在保存表的結構和數據時採用不同的方式
MyISAM表文件含義:.frm表定義,.MYD表數據,.MYI表索引
InnoDB表文件含義:.frm表定義,表空間數據和日誌文件
SHOW ENGINES -- 顯示存儲引擎的狀態信息
SHOW ENGINE 引擎名 {LOGS|STATUS} -- 顯示存儲引擎的日誌或狀態信息
-- 自增起始數
AUTO_INCREMENT = 行數
-- 數據文件目錄
DATA DIRECTORY = '目錄'
-- 索引文件目錄
INDEX DIRECTORY = '目錄'
-- 表註釋
COMMENT = 'string'
-- 分區選項
PARTITION BY ... (詳細見手冊)
-- 查看所有表
SHOW TABLES[ LIKE 'pattern']
SHOW TABLES FROM 庫名
-- 查看錶機構
SHOW CREATE TABLE 表名 (信息更詳細)
DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
-- 修改表
-- 修改表本身的選項
ALTER TABLE 表名 表的選項
eg: ALTER TABLE 表名 ENGINE=MYISAM;
-- 對錶進行重命名
RENAME TABLE 原表名 TO 新表名
RENAME TABLE 原表名 TO 庫名.表名 (可將表移動到另一個數據庫)
-- RENAME可以交換兩個表名
-- 修改表的字段機構(13.1.2. ALTER TABLE語法)
ALTER TABLE 表名 操作名
-- 操作名
ADD[ COLUMN] 字段定義 -- 增加字段
AFTER 字段名 -- 表示增加在該字段名後面
FIRST -- 表示增加在第一個
ADD PRIMARY KEY(字段名) -- 創建主鍵
ADD UNIQUE [索引名] (字段名)-- 創建唯一索引
ADD INDEX [索引名] (字段名) -- 創建普通索引
DROP[ COLUMN] 字段名 -- 刪除字段
MODIFY[ COLUMN] 字段名 字段屬性 -- 支持對字段屬性進行修改,不能修改字段名(所有原有屬性也需寫上)
CHANGE[ COLUMN] 原字段名 新字段名 字段屬性 -- 支持對字段名修改
DROP PRIMARY KEY -- 刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性)
DROP INDEX 索引名 -- 刪除索引
DROP FOREIGN KEY 外鍵 -- 刪除外鍵
-- 刪除表
DROP TABLE[ IF EXISTS] 表名 ...
-- 清空表數據
TRUNCATE [TABLE] 表名
-- 複製表結構
CREATE TABLE 表名 LIKE 要複製的表名
-- 複製表結構和數據
CREATE TABLE 表名 [AS] SELECT * FROM 要複製的表名
-- 檢查表是否有錯誤
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
-- 優化表
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
-- 修復表
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
-- 分析表
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
4 : 傳說中的增刪改查哈哈哈
/* 數據操作 */ ------------------
-- 增
INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), ...]
-- 如果要插入的值列表包含所有字段並且順序一致,則可以省略字段列表。
-- 可同時插入多條數據記錄!
REPLACE 與 INSERT 完全一樣,可互換。
INSERT [INTO] 表名 SET 字段名=值[, 字段名=值, ...]
-- 查
SELECT 字段列表 FROM 表名[ 其他子句]
-- 可來自多個表的多個字段
-- 其他子句可以不使用
-- 字段列表可以用*代替,表示所有字段
-- 刪
DELETE FROM 表名[ 刪除條件子句]
沒有條件子句,則會刪除全部
-- 改
UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新條件]
5 :類型
/* 數據類型(列類型) */ ------------------
1. 數值類型
-- a. 整型 ----------
類型 字節 範圍(有符號位)
tinyint 1字節 -128 ~ 127 無符號位:0 ~ 255
smallint 2字節 -32768 ~ 32767
mediumint 3字節 -8388608 ~ 8388607
int 4字節
bigint 8字節
int(M) M表示總位數
- 默認存在符號位,unsigned 屬性修改
- 顯示寬度,如果某個數不夠定義字段時設置的位數,則前面以0補填,zerofill 屬性修改
例:int(5) 插入一個數'123',補填後爲'00123'
- 在滿足要求的情況下,越小越好。
- 1表示bool值真,0表示bool值假。MySQL沒有布爾類型,通過整型0和1表示。常用tinyint(1)表示布爾型。
-- b. 浮點型 ----------
類型 字節 範圍
float(單精度) 4字節
double(雙精度) 8字節
浮點型既支持符號位 unsigned 屬性,也支持顯示寬度 zerofill 屬性。
不同於整型,前後均會補填0.
定義浮點型時,需指定總位數和小數位數。
float(M, D) double(M, D)
M表示總位數,D表示小數位數。
M和D的大小會決定浮點數的範圍。不同於整型的固定範圍。
M既表示總位數(不包括小數點和正負號),也表示顯示寬度(所有顯示符號均包括)。
支持科學計數法表示。
浮點數表示近似值。
-- c. 定點數 ----------
decimal -- 可變長度
decimal(M, D) M也表示總位數,D表示小數位數。
保存一個精確的數值,不會發生數據的改變,不同於浮點數的四捨五入。
將浮點數轉換爲字符串來保存,每9位數字保存爲4個字節。
2. 字符串類型
-- a. char, varchar ----------
char 定長字符串,速度快,但浪費空間
varchar 變長字符串,速度慢,但節省空間
M表示能存儲的最大長度,此長度是字符數,非字節數。
不同的編碼,所佔用的空間不同。
char,最多255個字符,與編碼無關。
varchar,最多65535字符,與編碼有關。
一條有效記錄最大不能超過65535個字節。
utf8 最大爲21844個字符,gbk 最大爲32766個字符,latin1 最大爲65532個字符
varchar 是變長的,需要利用存儲空間保存 varchar 的長度,如果數據小於255個字節,則採用一個字節來保存長度,反之需要兩個字節來保存。
varchar 的最大有效長度由最大行大小和使用的字符集確定。
最大有效長度是65532字節,因爲在varchar存字符串時,第一個字節是空的,不存在任何數據,然後還需兩個字節來存放字符串的長度,所以有效長度是64432-1-2=65532字節。
例:若一個表定義爲 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 問N的最大值是多少? 答:(65535-1-2-4-30*3)/3
-- b. blob, text ----------
blob 二進制字符串(字節字符串)
tinyblob, blob, mediumblob, longblob
text 非二進制字符串(字符字符串)
tinytext, text, mediumtext, longtext
text 在定義時,不需要定義長度,也不會計算總長度。
text 類型在定義時,不可給default值
-- c. binary, varbinary ----------
類似於char和varchar,用於保存二進制字符串,也就是保存字節字符串而非字符字符串。
char, varchar, text 對應 binary, varbinary, blob.
3. 日期時間類型
一般用整型保存時間戳,因爲PHP可以很方便的將時間戳進行格式化。
datetime 8字節 日期及時間 1000-01-01 00:00:00 到 9999-12-31 23:59:59
date 3字節 日期 1000-01-01 到 9999-12-31
timestamp 4字節 時間戳 19700101000000 到 2038-01-19 03:14:07
time 3字節 時間 -838:59:59 到 838:59:59
year 1字節 年份 1901 - 2155
datetime YYYY-MM-DD hh:mm:ss
timestamp YY-MM-DD hh:mm:ss
YYYYMMDDhhmmss
YYMMDDhhmmss
YYYYMMDDhhmmss
YYMMDDhhmmss
date YYYY-MM-DD
YY-MM-DD
YYYYMMDD
YYMMDD
YYYYMMDD
YYMMDD
time hh:mm:ss
hhmmss
hhmmss
year YYYY
YY
YYYY
YY
4. 枚舉和集合
-- 枚舉(enum) ----------
enum(val1, val2, val3...)
在已知的值中進行單選。最大數量爲65535.
枚舉值在保存時,以2個字節的整型(smallint)保存。每個枚舉值,按保存的位置順序,從1開始逐一遞增。
表現爲字符串類型,存儲卻是整型。
NULL值的索引是NULL。
空字符串錯誤值的索引值是0。
-- 集合(set) ----------
set(val1, val2, val3...)
create table tab ( gender set('男', '女', '無') );
insert into tab values ('男, 女');
最多可以有64個不同的成員。以bigint存儲,共8個字節。採取位運算的形式。
當創建表時,SET成員值的尾部空格將自動被刪除。
6 : 字符編碼類型
/* 字符集編碼 */ ------------------
-- MySQL、數據庫、表、字段均可設置編碼
-- 數據編碼與客戶端編碼不需一致
SHOW VARIABLES LIKE 'character_set_%' -- 查看所有字符集編碼項
character_set_client 客戶端向服務器發送數據時使用的編碼
character_set_results 服務器端將結果返回給客戶端所使用的編碼
character_set_connection 連接層編碼
SET 變量名 = 變量值
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;
SET NAMES GBK; -- 相當於完成以上三個設置
-- 校對集
校對集用以排序
SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern'] 查看所有字符集
SHOW COLLATION [LIKE 'pattern'] 查看所有校對集
CHARSET 字符集編碼 設置字符集編碼
COLLATE 校對集編碼 設置校對集編碼
7 : 列約束
/* 列屬性(列約束) */ ------------------
1. PRIMARY 主鍵
- 能唯一標識記錄的字段,可以作爲主鍵。
- 一個表只能有一個主鍵。
- 主鍵具有唯一性。
- 聲明字段時,用 primary key 標識。
也可以在字段列表之後聲明
例:create table tab ( id int, stu varchar(10), primary key (id));
- 主鍵字段的值不能爲null。
- 主鍵可以由多個字段共同組成。此時需要在字段列表後聲明的方法。
例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));
2. UNIQUE 唯一索引(唯一約束)
使得某字段的值也不能重複。
3. NULL 約束
null不是數據類型,是列的一個屬性。
表示當前列是否可以爲null,表示什麼都沒有。
null, 允許爲空。默認。
not null, 不允許爲空。
insert into tab values (null, 'val');
-- 此時表示將第一個字段的值設爲null, 取決於該字段是否允許爲null
4. DEFAULT 默認值屬性
當前字段的默認值。
insert into tab values (default, 'val'); -- 此時表示強制使用默認值。
create table tab ( add_time timestamp default current_timestamp );
-- 表示將當前時間的時間戳設爲默認值。
current_date, current_time
5. AUTO_INCREMENT 自動增長約束
自動增長必須爲索引(主鍵或unique)
只能存在一個字段爲自動增長。
默認爲1開始自動增長。可以通過表屬性 auto_increment = x進行設置,或 alter table tbl auto_increment = x;
6. COMMENT 註釋
例:create table tab ( id int ) comment '註釋內容';
7. FOREIGN KEY 外鍵約束
用於限制主表與從表數據完整性。
alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);
-- 將表t1的t1_id外鍵關聯到表t2的id字段。
-- 每個外鍵都有一個名字,可以通過 constraint 指定
存在外鍵的表,稱之爲從表(子表),外鍵指向的表,稱之爲主表(父表)。
作用:保持數據一致性,完整性,主要目的是控制存儲在外鍵表(從表)中的數據。
MySQL中,可以對InnoDB引擎使用外鍵約束:
語法:
foreign key (外鍵字段) references 主表名 (關聯字段) [主表記錄刪除時的動作] [主表記錄更新時的動作]
此時需要檢測一個從表的外鍵需要約束爲主表的已存在的值。外鍵在沒有關聯的情況下,可以設置爲null.前提是該外鍵列,沒有not null。
可以不指定主表記錄更改或更新時的動作,那麼此時主表的操作被拒絕。
如果指定了 on update 或 on delete:在刪除或更新時,有如下幾個操作可以選擇:
1. cascade,級聯操作。主表數據被更新(主鍵值更新),從表也被更新(外鍵值更新)。主表記錄被刪除,從表相關記錄也被刪除。
2. set null,設置爲null。主表數據被更新(主鍵值更新),從表的外鍵被設置爲null。主表記錄被刪除,從表相關記錄外鍵被設置成null。但注意,要求該外鍵列,沒有not null屬性約束。
3. restrict,拒絕父表刪除和更新。
注意,外鍵只被InnoDB存儲引擎所支持。其他引擎是不支持的。
好的啦,今天的基礎部分就記錄到這裏啦。