一、MySQL數據類型
1.數字類型
(1)整數數據類型包括TINYINT/BIT/BOOL/SMALLINT/MEDIUMINT/INT/BIGINT
(2)浮點數據類型包括FLOAT/DOUBLE/DECIMAL
原則: 1.選擇最小的可用類型,如果值永遠不超過127,則使用TINYINT比INT強。
2.對於完全都是數字的,可以選擇整數類型。
3.浮點類型用於可能具有小數部分的數。如貨物單價、網上購物交付金額等。
2.字符串類型
(1)普通的文本字符串類型包括CHAR(取值為1~255)和VARCHAR(變長的字符串)
(2)TEXT和BLOB類型。它們的大小可以改變,TEXT類型適合存儲長文本,而BLOB類型適合存儲二進制數據,支持任何數據,例如文本、聲音和圖像等。
(3)特殊類型SET和ENUM。
原則: 1.從速度方面考慮,要選擇固定的列,可以使用CHAR類型。
2.要節省空間,使用動態地列,可以使用VARCHAR類型。
3.要將列中的內容仙之子一種選擇,可以使用ENUM類型。
4.允許在一個列中有多於一個的條目,可以使用SET類型。
5.如果要搜索的內容不區分大小寫,可以使用TEXT類型。
6.如果要搜索的內容區分大小寫,可以使用BLOB類型。
3.日期和時間數據類型
(1)DATE:YYYY-MM-DD
(2)TIME:HH:MM:SS
(3)DATETIME:YYYY-MM-DD HH:MM:SS
(4)TIMESTAMP:時間標簽,在處理報告時使用的顯示格式取決於M的值。
(5)YEAR:年份可指定兩位數字和四位數字的格式。
二、創建表
mysql> use db_library; Database changed mysql> CREATE TABLE tb_bookinfo( -> barcode varchar(30), -> bookname varchar(70), -> typeid int(10) unsigned, -> author varchar(30), -> ISBN varchar(20), -> price float(8,2), -> page int(10) unsigned, -> bookcase int(10) unsigned, -> inTime date, -> del tinyint(1) DEFAULT'0', -> id int(11) NOT NULL -> ); Query OK, 0 rows affected (0.03 sec)
1.設置默認的存儲引擎
mysql> CREATE TABLE tb_booktype( -> id int(10) unsigned NOT NULL, -> typename varchar(30), -> days int(10) unsigned -> )ENGINE=MyISAM; Query OK, 0 rows affected (0.01 sec)
2.設置自增類型字段的同時,最好將其設置為主鍵(注意反引號和單引號的區別,反引號是Esc下面那個)
mysql> CREATE TABLE tb_booktype1( -> id int(10) unsigned NOT NULL AUTO_INCREMENT, -> typename varchar(30), -> days int(10) unsigned, -> PRIMARY KEY (`id`) -> ); Query OK, 0 rows affected (0.03 sec)
3.設置字符集
mysql> CREATE TABLE tb_booktype2( -> id int(10) unsigned NOT NULL AUTO_INCREMENT, -> typename varchar(30), -> days int(10) unsigned, -> PRIMARY KEY (`id`) -> )DEFAULT CHARSET=GBK; Query OK, 0 rows affected (0.02 sec)
4.復制表結構,實現在數據庫db_library中創建一份數據表tb_bookinfo的副本tb_bookinfobak。
(1)向數據表tb_bookinfo中插入一條數據
mysql> INSERT INTO tb_bookinfo VALUES ('17120107','Java King','3','LianJiang','115',49.80,350,1,'2018-04-17',0,1); Query OK, 1 row affected (0.00 sec)
(2)創建一份數據表tb_bookinfo的副本tb_bookinfobak
mysql> CREATE TABLE tb_bookinfobak LIKE tb_bookinfo; Query OK, 0 rows affected (0.02 sec)
(3)查看兩個表的結構
mysql> DESC tb_bookinfo; +----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | barcode | varchar(30) | YES | | NULL | | | bookname | varchar(70) | YES | | NULL | | | typeid | int(10) unsigned | YES | | NULL | | | author | varchar(30) | YES | | NULL | | | ISBN | varchar(20) | YES | | NULL | | | price | float(8,2) | YES | | NULL | | | page | int(10) unsigned | YES | | NULL | | | bookcase | int(10) unsigned | YES | | NULL | | | inTime | date | YES | | NULL | | | del | tinyint(1) | YES | | 0 | | | id | int(11) | NO | | NULL | | +----------+------------------+------+-----+---------+-------+ 11 rows in set (0.00 sec) mysql> DESC tb_bookinfobak; +----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | barcode | varchar(30) | YES | | NULL | | | bookname | varchar(70) | YES | | NULL | | | typeid | int(10) unsigned | YES | | NULL | | | author | varchar(30) | YES | | NULL | | | ISBN | varchar(20) | YES | | NULL | | | price | float(8,2) | YES | | NULL | | | page | int(10) unsigned | YES | | NULL | | | bookcase | int(10) unsigned | YES | | NULL | | | inTime | date | YES | | NULL | | | del | tinyint(1) | YES | | 0 | | | id | int(11) | NO | | NULL | | +----------+------------------+------+-----+---------+-------+ 11 rows in set (0.00 sec)
(4)分別查看兩個表的內容,發現復制的表中沒有復制表中的數據
mysql> SELECT * FROM tb_bookinfobak; Empty set (0.00 sec) mysql> SELECT * FROM tb_bookinfo; +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id | +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 | +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ 1 row in set (0.00 sec)
(5)如果在復制數據表時,想要同時復制其中的數據的話,需要這樣實現。但是,新復制出來的數據表並不包括原表中設置的主鍵、自動編號等內容。
mysql> CREATE TABLE tb_bookinfobak1 AS SELECT * FROM tb_bookinfo; Query OK, 1 row affected (0.14 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM tb_bookinfobak1; +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id | +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 | +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ 1 row in set (0.00 sec)
(6)如果要復制一下表結構和數據都完全一樣的數據表,那么需要應用下面兩句語句實現。
mysql> CREATE TABLE tb_bookinfobak2 LIKE tb_bookinfo; Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO tb_bookinfobak2 SELECT * FROM tb_bookinfo; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM tb_bookinfobak2; +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id | +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 | +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+ 1 row in set (0.00 sec)
三、修改表結構
1.在數據表tb_bookinfobak中添加一個translator字段,並且將inTime的類型由date改為DATETIME(6)
mysql> desc tb_bookinfobak; +----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | barcode | varchar(30) | YES | | NULL | | | bookname | varchar(70) | YES | | NULL | | | typeid | int(10) unsigned | YES | | NULL | | | author | varchar(30) | YES | | NULL | | | ISBN | varchar(20) | YES | | NULL | | | price | float(8,2) | YES | | NULL | | | page | int(10) unsigned | YES | | NULL | | | bookcase | int(10) unsigned | YES | | NULL | | | inTime | date | YES | | NULL | | | del | tinyint(1) | YES | | 0 | | | id | int(11) | NO | | NULL | | +----------+------------------+------+-----+---------+-------+ 11 rows in set (0.00 sec) mysql> alter table tb_bookinfobak add translator varchar(30) not null, -> modify inTime DATETIME(6); Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc tb_bookinfobak; +------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+-------+ | barcode | varchar(30) | YES | | NULL | | | bookname | varchar(70) | YES | | NULL | | | typeid | int(10) unsigned | YES | | NULL | | | author | varchar(30) | YES | | NULL | | | ISBN | varchar(20) | YES | | NULL | | | price | float(8,2) | YES | | NULL | | | page | int(10) unsigned | YES | | NULL | | | bookcase | int(10) unsigned | YES | | NULL | | | inTime | datetime(6) | YES | | NULL | | | del | tinyint(1) | YES | | 0 | | | id | int(11) | NO | | NULL | | | translator | varchar(30) | NO | | NULL | | +------------+------------------+------+-----+---------+-------+ 12 rows in set (0.00 sec)
2.修改約束條件
(1)添加主鍵約束格式為Alter TABLE 數據表名 ADD CONSTRAINT 約束名 約束類型 (字段名)
其中約束類型包括:PRIMARY KEY(主鍵約束)、DEFAULT(默認值約束)、UNIQUE KEY(唯一約束)、NOT NULL(非空約束)、FOREIGN KEY(外鍵約束)。
mysql> Alter TABLE tb_bookinfo ADD CONSTRAINT mrprimary PRIMARY KEY(id); Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc tb_bookinfo; +----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | barcode | varchar(30) | YES | | NULL | | | bookname | varchar(70) | YES | | NULL | | | typeid | int(10) unsigned | YES | | NULL | | | author | varchar(30) | YES | | NULL | | | ISBN | varchar(20) | YES | | NULL | | | price | float(8,2) | YES | | NULL | | | page | int(10) unsigned | YES | | NULL | | | bookcase | int(10) unsigned | YES | | NULL | | | inTime | date | YES | | NULL | | | del | tinyint(1) | YES | | 0 | | | id | int(11) | NO | PRI | NULL | | +----------+------------------+------+-----+---------+-------+ 11 rows in set (0.00 sec)
(2)刪除約束條件
刪除主鍵約束:ALTER TABLE 表名 DROP PRIMARY KEY;
刪除外鍵約束:ALTER TABLE 表名 DROP FOREIGN 約束名;
刪除唯一性約束:ALTER TABLE 表名 DROP INDEX 唯一索引名;
(3)修改表的其他選項
修改表的存儲引擎:ALTER TABLE 表名 ENGINE=新的存儲引擎類型
修改表的字符集:ALTER TABLE 表名 DEFAULT CHARSET=新的字符集
修改表的自增類型字段的初始值:ALTER TABLE 表名 AUTO_INCREMENT=新的初始值
(4)修改表名
重命名:RENAME TABLE 數據表名1 To 數據表名2
四、刪除表
DROP TABLE 數據表名;
DROP TABLE IF EXISTS 數據表名;
五、設置索引
1.索引是一種將數據庫中單列或者多列的值進行排序的結構。在MySQL中,索引由數據表中的一列或多列組合而成,創建索引的目的是為了優化數據庫的查詢速度。
通過索引查詢數據,不但可以提高查詢速度,也可以降低服務器的負載。創建索引后,用戶查詢數據時,系統可以不必遍歷數據表中的所有記錄,而是查詢索引列。這樣就可以有效地提高數據庫系統的整體性能。這和我們通過圖書的目錄查找想要閱讀的章節內容一樣,十分方便。
但是,創建索引和維護需要耗費時間同時還需要占用物理空間,給數據的維護造成很多麻煩。向有索引的表中插入記錄時,數據庫系統會按照索引進行排序。所以,用戶可以將索引刪除后再插入數據,當數據插入操作完成后,用戶可以重新創建索引。
常見MySQL索引包括:普通、唯一性、全文、單列、多列、空間。
2.創建索引
(1)在建立數據表時創建索引,並且查看表結構。
mysql> CREATE TABLE tb_score( -> id int(11) auto_increment primary key not null, -> name varchar(50) not null, -> math int(5) not null, -> english int(5) not null, -> chinese int(5) not null, -> index(id) -> ); Query OK, 0 rows affected (0.02 sec) mysql> SHOW CREATE TABLE tb_score; +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_score | CREATE TABLE `tb_score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `math` int(5) NOT NULL, `english` int(5) NOT NULL, `chinese` int(5) NOT NULL, PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
(2)在已建立的數據表中創建索引
mysql> CREATE INDEX idx_name ON tb_bookinfo(bookname); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE tb_bookinfo; +-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_bookinfo | CREATE TABLE `tb_bookinfo` ( `barcode` varchar(30) DEFAULT NULL, `bookname` varchar(70) DEFAULT NULL, `typeid` int(10) unsigned DEFAULT NULL, `author` varchar(30) DEFAULT NULL, `ISBN` varchar(20) DEFAULT NULL, `price` float(8,2) DEFAULT NULL, `page` int(10) unsigned DEFAULT NULL, `bookcase` int(10) unsigned DEFAULT NULL, `inTime` date DEFAULT NULL, `del` tinyint(1) DEFAULT '0', `id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`bookname`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
3.刪除索引
mysql> DROP INDEX idx_name ON tb_bookinfo; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE tb_bookinfo; +-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_bookinfo | CREATE TABLE `tb_bookinfo` ( `barcode` varchar(30) DEFAULT NULL, `bookname` varchar(70) DEFAULT NULL, `typeid` int(10) unsigned DEFAULT NULL, `author` varchar(30) DEFAULT NULL, `ISBN` varchar(20) DEFAULT NULL, `price` float(8,2) DEFAULT NULL, `page` int(10) unsigned DEFAULT NULL, `bookcase` int(10) unsigned DEFAULT NULL, `inTime` date DEFAULT NULL, `del` tinyint(1) DEFAULT '0', `id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
六、定義約束
1.定義主鍵約束
主鍵可以使表中的某一列,也可以是表中多個列所構成的一個組合。其中,由多個列組合而成的主鍵也成為復合主鍵。
原則:每個表只能定義一個主鍵。
唯一性原則。主鍵的值必須能夠唯一標識表中每一行記錄,切不能為NULL。
最小化規則。復合主鍵不能包含不必要的多余列。
一個列名在復合主鍵的列表中只能出現一次。
(1)作為列的完成性約束:在表的某個列的屬性定義時,加上關鍵字PRIMARY KEY
mysql> CREATE TABLE tb_manager( -> id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, -> name varchar(30), -> PWD varchar(30) -> ); Query OK, 0 rows affected (0.02 sec)
(2)作為表的完整性約束:在表的所有列的屬性定以后,加上PRIMARY KRY(insex_col_name,...)
mysql> create table tb_student( -> id int(10) auto_increment, -> name varchar(30) not null, -> sex varchar(2), -> classid int not null, -> birthday date, -> PRIMARY KEY(id,classid) -> ); Query OK, 0 rows affected (0.02 sec)
2.定義候選鍵約束
如果一個屬性集能唯一標識元組,且又不含有多余的屬性,那么這個屬性集稱為關系的候選鍵。候選鍵的值必須是唯一的,且不能為空。其實現方法與主鍵約束類似,也是可作為列的完整性約束或者表的完整性約束。候選鍵和主鍵的區別有:一個表只能創建一個主鍵,但可以定義若干個候選鍵;定義主鍵約束時,系統會自動創建PRIMARY KEY索引,而定義候選鍵約束時,系統會自動創建UNIQUE索引。
mysql> CREATE TABLE tb_managerbak( -> id int(10) unsigned NOT NULL, -> bookname varchar(70) UNIQUE -> ); Query OK, 0 rows affected (0.02 sec)
3.定義非空約束
通過CREATE TABLE或ALTER TABLE語句中,某個列定義后面加上關鍵字NOT NULL來定義。
4.定義CHECK約束
(1)對列實施CHECK約束,限制其age字段的值只能是7~18(不包括18)
mysql> CREATE TABLE tb_managerbak1( -> id int(10) unsigned NOT NULL, -> age int not null CHECK(age>6 and age<18) -> ); Query OK, 0 rows affected (0.03 sec)
(2)對表實施CHECK約束,限制其typeid字段的值只能是tb_booktypr表中id字段的某一個id值
mysql> CREATE TABLE tb_managerbak2( -> id int(10) unsigned NOT NULL, -> typeid int(10) unsigned, -> CHECK(typeid IN (SELECT id FROM tb_booktype)) -> ); Query OK, 0 rows affected (0.03 sec)