MySQL 筆記

數據庫設計概論

數據表類型

MyISAM
成熟穩定易於管理

InnoDB
是MyISAM的一種更新換代產品
支持事務

HEAP
內存數據庫,數據庫服務停止運行,數據丟失

數據庫文件存放位置

默認:
Linux
/var/lib/mysql
Windows
c:\Programs\MySQL\MySQL Server n.n\data

每個數據表有一個.frm定義文件,位於數據庫名字文件夾中
保存數據表的結構定義:列名、數據類型等
data/dbname/tablename.frm
data/dbname/db.opt 整個數據庫的結構定義和設置

MyISAM
data/dbname/tablename.MYD 數據表的數據
data/dbname/tablename.MYI 數據表的全部索引

InnoDB
inno_file_per_table配置選項
默認:
data/dbname/tablename.idb 數據表的數據和索引
data/ibdata 表空間和撤銷日誌
data/ib_logfile InnoDB日誌
data/dbname/tablenamb.TRG 觸發器

數據類型

整數 xxxINT

如果存入的數據值超出了數據類型的取值範圍,則把它替換爲最大或最小可取值。

TINYINT(m) 8位整數 -128 ~ 127
m給出的是select查詢結果中的數據列寬度(maximum display width),對取值範圍沒有影響
SMALLINT(m) 16位整數 -32768 ~ 32767
MEDIUMINT(m) 24位整數
INT(m) INTEGER(m) 32位整數
BIGINT(m) 64位整數
SERIAL bigint auto_increment not null primary key 簡寫

AUTO_INCREMENT整數
當插入一條新紀錄時,自動將該列最大值加1賦值給新紀錄中的這個字段。
必須與NOT NULL、 PRIMARY KEY、UNIQUE同時使用
最多只能有一個AUTO_INCREMENT數據列
只有使用INSERT插入新紀錄並且沒有爲字段給出一個值時才起作用

獲得自動生成的AUTO_INCREMENT值:在本次連接或本次事務裏執行
SELECT LAST_INSERT_ID()

如果計數達到最大值,將無法遞增,插入操作無法繼續進行
對於INSERT DELETE非常頻繁的數據表來說最好使用BIGINT

BOOL 是TINYINT的同義詞
BIT在5.0.3版本之後爲一種可以存儲多達64位二進制數的新數據類型。

FLOAT(m,d) 4字節 m 十進制數字的總個數(不影響精度),d小數點後面的數字個數
DOUBLE(m,d) 8字節
REAL(m,d) 同DOUBLE

DECIMAL(p,s)
p數據值的數字總個數(最大值65),s小數點後面的數字個數(最大值30)
比如DECIMAL(6,3)的可表示範圍爲-999.999~999.999
以字符串的形式來保存數據
FLOAT DOUBLE會進行必要的舍入,如果誤差不可接受,比如財務數據,應該選用DECIMAL

日期與時間

DATE
2003-12-31 取值範圍:1000-01-01~9999-12-31 3個字節

TIME
23:59:59 3個字節

DATETIME
YEAR 100~2155 1個字節

對日期和時間數據進行合法性檢查
sql_mode系統變量
ALLOW_INVALID_DATES
NO_ZERO_DATE
NO_ZERO_IN_DATE

TIMESTAMP
這個類型的字段會在數據記錄的其他字段被修改時自動刷新

字符串類型

CHAR(20)
佔用20個字節,前導空格存儲前將被去掉,比較短的字符串在尾部加空格,讀出數據時會自動刪除這些空格,因此不能保存結尾確實有空格的字符串

CHAR(n) 固定長度字符串 最多255個字符
VARCHAR(n) 可變長度 最多255個 5.0.3版本後 n<65535 必須指定n
TINYTEXT 最多255個
TEXT 2^16-1
MEDIUMTEXT 2^24-1
LONGTEXT 2^32-1

UNICODE定義了每個字符的編碼,但沒有定義如何存儲這些編碼。
因此UNICODE有好幾種變體:
UCS-2 universal character set 通用字符集
UTF-8 unicode transfer format Unicode傳輸格式

UCS-2也叫UTF-16
弊端:字符串空間佔用量翻了一倍,字節0會出現在很多地方,而許多C語言程序、電子郵件服務器等都把0字節視爲字符串的結束標誌。

現在的版本可以爲每個數據列分別指定一種字符集和排序方式。

show collation 命令

BLOB

binary large object
存儲二進制數據的最佳選擇
BLOB和TEXT的區別是二進制數據根據它們的二進制編碼進行比較和排序

有不少人認爲應該把二進制數據如圖像保存爲外部文件,數據庫只用來保存這些文件的鏈接。

把短小的數據和長的數據混合存放在同一個數據表裏是一種非常不好的做法,會導致所有數據記錄的存取速度變慢

BLOB數據必須以一個整體來讀寫和傳輸。

BIT(n) n二進制位數,最大取值64 溢出時,所有位都爲1
TINYBLOB 255
BLOB
MEDIUMBLOB
LONGBLOB

ENUM和SET

缺點:ENUM和SET 其他數據庫可能不支持,不便於移植

ENUM
最多65535個,字段的取值只能是這個集合中的某個成員

SET
允許集合成員的任意組合但不能超過64個

數據列選項

NULL 可以包含NULL值,默認設置
NOT NULL
DEFAULT XXX 在輸入時沒有給出一個具體值,則使用xxx作爲默認值
PRIMARY KEY
AUTO_INCREMENT
UNSIGNED
CHARACTER SET name [COLLATE sort] 指定一種字符集和一種可選的排序方式

數據庫設計要求

  • 數據表裏沒有重複冗餘的數據
  • 數據表裏沒有order1 order2 order3等數據列(order訂單),就算定義了10個這樣的數據列,也遲早會發生某個用戶想要訂購11件商品的事情
  • 全體數據表的空間佔用總量越小越好
  • 使用頻率高的數據庫查詢都能以簡單高效的方式執行

MySQL對數據列名字不區分大小寫
對數據庫和數據表的名字區分大小寫

第一次嘗試時最好不要立刻去創建和使用真正的MySQL數據表,應該先在Exel等電子表格程序裏用一些工作表把MySQL數據表勾勒出來

第一範式
- 內容相似的數據列必須消除(辦法是在創建一個數據表來存放它們)
- 必須爲每一組相關數據分別創建一個數據表
- 每條數據記錄必須用一個主鍵來標識

第二範式
- 只要數據列裏的內容出現重複,就意味着應該把數據表拆分成多個字表
- 拆分形成的數據表必須用外鍵關聯起來

第三範式
與主鍵沒有直接關係的數據列必須消除(再創建一個數據表來存放它們)

如果等到數據庫裏已經充滿了數據,當配套的客戶端程序也已經開發完成的時候,才猛然發現數據庫設計方案還需要修改,那麼將要花費的時間和精力可就太大了。

把信息存入數據庫的目的是爲了讓更多人能夠使用SQL查詢命令把它們再迅速準確地查出來。

數據表的個數越多,從中提取有關數據生成查詢結果的複雜性也越大。爲了提高查詢的效率,適度的冗餘有時反而是必要的。

外鍵約束

只要數據庫裏發生了變化,所謂的外鍵約束條件就會去檢查是否有數據表之間的交叉引用關係受到影響。

索引

索引是一種特殊的文件,它們包含着對數據表裏所有記錄的引用指針。

視圖

視圖使得人們可以爲一個或多個數據表定義一個特殊的表現形式。視圖在行爲上與數據表沒有什麼區別,可以使用SELECT查詢命令去查詢數據,也可以使用INSERT、UPDATE、DELETE命令修改數據。

SQL語言入門

簡介

SQL命令可以分爲3大類:

DML Data Manipulation Language 數據處理語言
SELECT, INSERT, UPDATE, DELETE

DFL Data Definition Language 數據定義語言
CREATE TABLE, ALTER TABLE

DCL Data Control Language 數據控制語言
GRANT, REVOKE
用來幫助人們設置和調整MySQL訪問控制機制的SQL命令。

SELECT

確定數據表裏有多少條記錄
SELECT COUNT(publID) FROM publishers

確定數據表裏有多少條不重複的記錄
SELECT COUNT(DISTINCT publID) FROM titles

限制查詢結果中的數據記錄個數
SELECT title FROM titles LIMIT 2
查詢第3和第4條記錄LIMIT offset n
SELECT title FROM titles LIMIT 2, 2

ORDER BY

排序
SELECT authName FROM authors ORDER BY authName [DESC]

獲得可用的排序方式的清單,命令:
SHOW COLLATION

WHERE

篩選
字符’%’是代表任意字符串的通配符
SELECT authName FROM authors WHERE authName LIKE ‘%er%’

使用LIKE操作符進行的比較操作在比較大數據庫表上往往非常慢:
1. 需要讀取和分析數據表裏的全部數據記錄
2. 這類查詢無法用索引來優化

使用IN枚舉
SELECT authID, authName FROM authors WHERE authID IN (2, 7, 12)

MySQL不支持colname=NULL這樣的用法,如果打算對包含NULL值的數據記錄進行搜索,就必須使用ISNULL(colname)函數。

涉及多個數據表的關聯查詢(LEFT/RIGHT JOIN)

GROUP BY等的用法,也參見以下更加通俗易懂的教程
參考:http://www.w3school.com.cn/sql/

返回所有數據庫的清單

SHOW DATABASE

返回當前數據庫裏的所有數據表的清單

SHOW TABLES

返回當前數據表裏的所有數據列的清單

SHOW COLUMNS

INFORMATION_SCHEMA數據表家族

使用INFORMATION_SCHEMA數據表家族饞看數據庫、數據表、數據列等的元數據。

數據庫備份

使用mysqldump命令

較慢,但有着最好的兼容性,適合遷移的場合(從一個MySQL服務器複製到一個MySQL服務器)。

直接複製整個數據庫目錄

最簡單、最快。出於效率和信息安全的考慮,應該先讓MySQL服務器停止運行。
只適用於MYISAM數據表,不適用於InnoDB數據表。

把日誌文件和定期製作的增量備份文件相結合

利用鏡像機制進行備份

其他

飄號的使用

如果你的表名或者是列名和mysql的關鍵字有衝突,就得寫“`”這個符號,否則會報錯。

mysql中SELECT column+0 FROM table是什麼意思

mysql會根據上下文自動轉換類型
這一句的意思就是,將被本來是字符類型的字段值以數值型返回
如果字段存放的值爲數值字符,則會轉換爲數值型返回
如果字段存放的值爲字母或者漢字,則直接返回0

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