數(shù)據(jù)表概念
數(shù)據(jù)表是數(shù)據(jù)庫中的基本對象元素,以記錄(行)和字段(列)組成的二維結(jié)構(gòu)用于存儲數(shù)據(jù)。數(shù)據(jù)表由表結(jié)構(gòu)和表內(nèi)容兩部分組成,先建立表結(jié)構(gòu),然后才能輸入數(shù)據(jù)。數(shù)據(jù)表結(jié)構(gòu)設(shè)計主要包括字段名稱、字段類型和字段屬性的設(shè)置。
通常情況下,同一個數(shù)據(jù)庫中可以有多個數(shù)據(jù)表,但表名必須是唯一的,表中每一條記錄描述了一個相關(guān)信息的集合,每一個字段必須為唯一的,每個字段都需要指定數(shù)據(jù)類型。
數(shù)據(jù)列四大數(shù)據(jù)類型
數(shù)值類數(shù)據(jù)列類型
| 數(shù)據(jù)類型 | 存儲空間 | 說明 | 取值范圍 |
|---|---|---|---|
| TINYINT | 1字節(jié) | 非常小的整數(shù) | 帶符號值:-128127、無符號值:0255 |
| SMALLINT | 2字節(jié) | 較小的整數(shù) | 帶符號值:-3276832767、無符號值:065535 |
| MEDIUMINT | 3字節(jié) | 中等大小的整數(shù) | 帶符號值:-83886088388607、無符號值:016777215 |
| INT | 4字節(jié) | 標(biāo)準(zhǔn)整數(shù) | 帶符號值:-21474836482147483647、無符號值:04294967295 |
| BIGINT | 8字節(jié) | 大整數(shù) | 帶符號值:-263263-1、無符號值:0264-1 |
| FLOAT | 4或8字節(jié) | 單精度浮點數(shù) | 最小非零值:+- 1.175494351E-38、最大非零值:+- 3.402823466E+38 |
| DOUBLE | 8字節(jié) | 雙精度浮點數(shù) | 最小非零值:+- 2.225073E-308、最大非零值:+- 1.797693E+308 |
| DECIMAL | 自定義 | 以字符串形式表示的浮點數(shù) | 取決于存儲單元字節(jié)數(shù) |
整型注意事項:
INT(3)、SMALLINT(3)等整型后面的數(shù)字不會影響數(shù)值的存儲范圍,只會影響顯示
整型后面的數(shù)字只有配合零填充的時候才有實際意義。
整型后面的數(shù)字可以省略
浮點型注意事項:
浮點型后面的數(shù)字會將存入的數(shù)字四舍五入,例如:把一個1.234存入FLOAT(6,1)數(shù)據(jù)列中,結(jié)果是1.2,6代表顯示長度,1代表小數(shù)位長度,會四舍五入。
字符串類數(shù)據(jù)列類型
| 數(shù)據(jù)類型 | 存儲空間 | 說明 | 取值范圍 |
|---|---|---|---|
| CHAR[(M)] | M字節(jié) | 定長字符串 | M字節(jié) |
| VARCHAR[(M)] | L+1字節(jié) | 可變字符串 | M字節(jié) |
| TINYBLOB,TINYTEXT | L+1字節(jié) | 非常小的BLOB(二進制大對象)和文本串 | 28-1字節(jié) |
| BLOB,TEXT | L+2字節(jié) | 小BLOB和文本串 | 216-1字節(jié) |
| MEDIUMBLOB,MEDIUMTEXT | L+3字節(jié) | 中等的BLOB和文本串 | 224-1字節(jié) |
| LONGBLOB,LONGTEXT | L+4字節(jié) | 大BLOB和文本串 | 232-1字節(jié) |
| ENUM(‘value1’,’value2’…) | 1或2字節(jié) | 枚舉:可賦予某個枚舉成員 | 65535個成員 |
| SET(‘value1’,‘value2’…) | 1,2,3,4或8字節(jié) | 集合:可賦予多個集合成員 | 64個成員 |
字符串類型注意事項:
CHAR和VARCHAR類型的長度范圍都在0~255之間
在使用CHAR和VARCHAR類型時,當(dāng)我們傳入的實際的值的長度大于指定的長度,字符串會被截取至指定長度
在使用CHAR類型時,如果我們傳入的值的長度小于指定長度,實際長度會使用空格補至指定長度在使用VARCHAR類型時,如果我們傳入的值的長度小于指定長度,實際長度即為傳入字符串的長度,不會使用空格填補
CHAR要比VARCHAR效率更高,當(dāng)占用空間較大
BLOB和TEXT類型是可以存放任意大數(shù)據(jù)的數(shù)據(jù)類型
BLOB區(qū)分大小寫,TEXT不區(qū)分大小寫ENUM和SET類型是特殊的的串類型,其列值必須從固定的串集中選擇
ENUM只能選擇其中一個值,SET可以選擇多個值
日期和時間類數(shù)據(jù)列類型
| 數(shù)據(jù)類型 | 存儲空間 | 說明 | 取值范圍 |
|---|---|---|---|
| DATE | 3 字節(jié) | “YYYY-MM-DD”格式表示的日期值 | 1000-01-01~9999-12-31 |
| TIME | 3 字節(jié) | “hh:mm:ss”格式表示的時間值 | -838:59:59-838:59:59 |
| DATETIME | 8 字節(jié) | “YYYY-MM-DD hh:mm:ss”格式 | 1000-01-01 00:00:00~9999-12-31 |
| TIMESTAMP | 4 字節(jié) | “YYYYMMDDhhmmss”格式表示的時間戳 | 19700101000000-2037年的某個時刻 |
| YEAR | 1 字節(jié) | “YYYY”格式的年份值 | 1901~2155 |
日期類型注意事項:
- 存儲日期時,我們可以使用整型來進行存儲時間戳,這樣做便于我們進行日期的計算
NULL值
NULL值注意事項:
NULL意味著“沒有值”或“未知值”
可以測試某個值是否為NULL
不能對NULL值進行算術(shù)計算
對NULL值進行算術(shù)運算,其結(jié)果還是NULL
0或NULL都意味著假,其余值都意味著真
數(shù)據(jù)字段屬性
UNSIGNED
只能用于設(shè)置數(shù)值類型,不允許出現(xiàn)負(fù)數(shù)
最大存儲長度會增加一倍
ZEROFILL
只能用于設(shè)置數(shù)值類型,在數(shù)值之前會自動用0補齊不足的位數(shù)
AUTO_INCREMENT
用于設(shè)置字段的自動增長屬性,每增加一條記錄,該字段的值會自動加1
NULL和NOT NULL
默認(rèn)為NULL,即插入值時沒有在此字段插入值,默認(rèn)為NULL值,如果指定了NOT NULL,則必須在插入值時在此字段填入值
DEFAULT
可以通過此屬性來指定一個默認(rèn)值,如果沒有在此列添加值,那么默認(rèn)添加此值
創(chuàng)建索引
在MySQL中,主要有四類索引:
- 主鍵索引(PRIMARY KEY)
主鍵索引是關(guān)系數(shù)據(jù)庫中最常見的索引類型,主要作用是確定數(shù)據(jù)表里一條特定的數(shù)據(jù)記錄的位置。我們可以在字段后添加PRIMARY KEY來對字段設(shè)置為主鍵索引。
注意:
1.最好為每張表指定一個主鍵,但不是必須指定。
2.一個表只能指定一個主鍵,而且主鍵的值不能為空
3.主鍵可以有多個候選索引(例如NOT NULL,AUTO_INCREMENT)
- 唯一索引(UNIQUE)
唯一索引與主鍵索引一樣,都可以防止創(chuàng)建重復(fù)的值。但是,不同之處在于,每個數(shù)據(jù)表中只能有一個主鍵索引,但可以有多個唯一索引。我們使用關(guān)鍵字UNIQUE對字段定義為唯一索引。
- 常規(guī)索引(INDEX)
常規(guī)索引技術(shù)是關(guān)系數(shù)據(jù)查詢中最重要的技術(shù),如果要提升數(shù)據(jù)庫的性能,索引優(yōu)化是首先應(yīng)該考慮的,因為它能使我們的數(shù)據(jù)庫得到最大性能方面的提升。常規(guī)索引也存在缺點:
1.多占用磁盤空間
2.會減慢插入,刪除和修改操作
3.需要按照索引列上排序格式執(zhí)行
創(chuàng)建索引我們可以使用INDEX和KEY關(guān)鍵字隨表一同創(chuàng)建。
- 全文索引(FULLTEXT)
全文索引在MySQL中是一個FULLTEXT類型索引,但FULLTEXT索引只能用于MyISAM表,并且只可以在CHAR、VARCHAR或TEXT類型的列上創(chuàng)建,也允許創(chuàng)建在一個或多個數(shù)據(jù)列上。
但是FULLTEXT是不支持中文全文索引的,所以我們將來會使用效率更高的全文索引引擎Sphinx。
數(shù)據(jù)表的存儲類型及存儲位置
MySQL支持MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV等多種數(shù)據(jù)表類型,在創(chuàng)建一個新MySQL數(shù)據(jù)表時,可以為它設(shè)置一個類型。
MyISAM和InnoDB兩種表類型最為重要:
1.MyISAM數(shù)據(jù)表類型的特點是成熟、穩(wěn)定和易于管理。
2.MyISAM表類型會產(chǎn)生碎片空間,要經(jīng)常使用OPTIMIZE TABLE命令去清理表空間
3.MyISAM不支持事務(wù)處理,InnoDB支持
4.MyISAM不支持外鍵,InnoDB支持
5.MyISAM表類型的數(shù)據(jù)表效率更高
6.MyISAM表類型的數(shù)據(jù)表會產(chǎn)生三個文件,InnoDB表類型表默認(rèn)只會產(chǎn)生一個文件。
字符集
創(chuàng)建表的時候,如果沒有明確地指定任何字符集,則新創(chuàng)建數(shù)據(jù)表的字符集將由MySQL配置文件里charcter-set-server選項的設(shè)置決定。
在創(chuàng)建數(shù)據(jù)表時如果需要指定默認(rèn)的字符集與之相同,但MySQL客戶程序在與服務(wù)器通信時使用的字符集,我們需要使用default-character-set選項或通過SQL命令SET NAMES utf8來指定一個字符集為utf8.
創(chuàng)建表
創(chuàng)建數(shù)據(jù)表之前,我們應(yīng)該注意:
1.創(chuàng)建數(shù)據(jù)庫(如已存在則不需要創(chuàng)建)
2.選擇數(shù)據(jù)庫
3.在該數(shù)據(jù)庫當(dāng)中創(chuàng)建數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表需要注意:
1.指定數(shù)據(jù)表的名稱(數(shù)據(jù)表不能重名)
2.指定該表的字段名稱、字段數(shù)據(jù)類型、字段索引
3.指定表類型和表默認(rèn)字符集(可省略)
建表實例
| 中文名 | 字段名 | 數(shù)據(jù)類型 | 屬性 | 索引 |
|---|---|---|---|---|
| 用戶編號 | id | INT | UNSIGNED NOT NULL AUTO_INCREMENT | 主鍵 |
| 用戶名稱 | username | VARCHAR(50) | NOT NULL | 普通 |
| 口令 | userpass | VARCHAR(50) | NOT NULL | 普通 |
| 聯(lián)系電話 | telno | VARCHAR(20) | NOT NULL | 唯一 |
| 性別 | sex | ENUM(‘男’,’女’) | NOT NULL DEFAULT ‘男’ | |
| 出生日期 | birthday | DATE | NOT NULL DEFAULT ‘0000-00-00’ |
CREATE TABLE IF NOT EXISTS `users`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`userpass` VARCHAR(50) NOT NULL,
`telno` VARCHAR(20) NOT NULL UNIQUE,
`sex` ENUM('nan','nv') NOT NULL DEFAULT 'nan',
`birthday` DATE NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY(`id`),
INDEX username_index(`username`),
INDEX userpass_index(`userpass`)
)ENGINE=MyISAM DEFAULT CHARSET=utf8 collate utf8_general_ci ;
注意事項:
1.表的字段之間要使用逗號隔開。
2.建表的最后一句一定不能有逗號。
3.表名稱和字段名稱盡量不要使用MySQL系統(tǒng)的關(guān)鍵字
4.如果一定要使用關(guān)鍵字,我們可以使用反引號將表名稱和字段名稱包含起來來進行過濾屏蔽。
5.使用反引號會使建表效率增高。
6.數(shù)據(jù)表名稱和字段名稱不能重名
7.AUTO_INCREMENT屬性必須依附于主鍵索引或唯一索引
修改數(shù)據(jù)表
修改表的語法:
ALTER TABLE 表名 ACTION;
我們可以對表進行修改字段,添加字段,刪除字段,添加索引,刪除索引,更改表名稱,更改字段名稱,更改auto_increment屬性的初始值等。
修改字段:
我們使用change或者是modify關(guān)鍵字
ALTER TABLE `uses` CHANGE `username` `uname` VARCHAR(32) NOT NULL;
ALTER TABLE `users` MODIFY `username` VARCHAR(32) NOT NULL;
由上例可以發(fā)現(xiàn):
change可以改變字段名稱,而modify不可以
添加字段:
我們使用add關(guān)鍵字
ALTER TABLE `uses` ADD `tname` VARCHAR(32) NOT NULL;
這樣我們就會新增一個tname字段。
刪除字段:
我們使用drop關(guān)鍵字
ALTER TABLE `users` DROP `tname`;
這樣我們會刪除tname字段
添加索引:
我們使用add關(guān)鍵字
ALTER TABLE `uses` ADD INDEX/UNIQUE/PRIMARY KEY 索引名稱(字段名稱)
這樣會在該字段上建立索引(普通索引,唯一索引,主鍵索引)。
刪除索引:
ALTER TABLE `users` DROP INDEX/UNIQUE/PRIMARY KEY 索引名稱;
這樣我們會刪除這個索引,我們可以使用show indexes from 表名查看當(dāng)前表索引。
更改表名稱:
我們使用rename關(guān)鍵字
ALTER TABLE 舊表名 RENAME AS 新表名
將舊表名更改為新表名
更改AUTO_INCREMENT初始值:
ALTER TABLE 表名稱 AUTO_INCREMENT=1
將AUTO_INCREMENT的初始值設(shè)置為1
刪除表:
DROP TABLE [IF EXISTS] 表名稱;
- 如何啟動和停止MySQL數(shù)據(jù)庫服務(wù)(至少兩種)?
- 在命令行模式下如何連接MySQL數(shù)據(jù)庫服務(wù)。
- 在mysql命令提示符下:如何查看當(dāng)前服務(wù)器下的數(shù)據(jù)庫(瀏覽數(shù)據(jù)庫);
- 在mysql命令提示符下:如何選擇進入一個數(shù)據(jù)庫;
- 在mysql命令提示符下:如何查看當(dāng)前庫下的所有表。
- 在mysql命令提示符下:如何如何查看一個表格的結(jié)構(gòu);
- 在mysql命令提示符下:如何取消當(dāng)前sql命令;
- 在mysql命令提示符下:如何退出數(shù)據(jù)庫;
- 在mysql命令提示符下:如何創(chuàng)建一個數(shù)據(jù)庫;
- 在mysql命令提示符下:如何刪除一個數(shù)據(jù)庫;
- 在mysql命令提示符下:如何刪除一個數(shù)據(jù)表;
-
參考下面圖片,按照要求創(chuàng)建表格,(字段類型和約束只做參考)
Paste_Image.png - 為上面的每個表都添加10條測試數(shù)據(jù)。
- 修改其中的3條數(shù)據(jù)。
- 刪除每個表的2條數(shù)據(jù)庫。
