一、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)