1、数据类型
数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型:
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。
下面的表显示了需要的每个数值类型的存储和范围:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 字节 | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
日期/时间类型:
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性。
类型 | 大小 (字节) |
范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59‘/‘838:59:59‘ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 8 | 1970-01-01 00:00:00/2037 年某时 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符类型:
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
2、数据表的操作
数据表(或称表)是数据库最重要的组成部分之一,是其它对象的基础。
使用某个数据库使用命令:USE 数据库名称;
创建数据表:
CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type, ... ) //column_name:列名
mysql> SHOW DATABASES; //查看有哪些数据库;
+--------------------+
|Database|
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| t1 |
| test |
+--------------------+
5 rows inset(0.03 sec)
mysql> USE test; //打开test数据库;
Database changed
mysql> SELECT DATABASE(); //查看当前打开了哪个数据库;
+------------+
| DATABASE()|
+------------+
| test |
+------------+
1 row inset(0.00 sec)
mysql> CREATE TABLE tb1(
-> username VARCHAR(20),
-> age TINYINT UNSIGNED, //年龄不存在负值,
UNSIGNED表示无符号类;-> salary FLOAT(8,2) UNSIGNED
->); //创建数据表;
Query OK,0 rows affected (0.20 sec)
查看数据表:
SHOW TABLES [FROM db_name] [LIKE ‘pattern‘ | WHERE expr]
mysql> SHOW TABLES; //查看当前数据库的数据表;
+----------------+
|Tables_in_test|
+----------------+
| tb1 |
+----------------+
1 row inset(0.03 sec)
mysql> SHOW TABLES FROM mysql; //查看数据库mysql下的数据表;
+---------------------------+
|Tables_in_mysql|
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
24 rows inset(0.06 sec)
mysql> SELECT DATABASE(); //查看当前使用的数据库是否发生变化?;
+------------+
| DATABASE()|
+------------+
| test | //当前打开的数据库依然还是test数据库;
+------------+
1 row inset(0.00 sec)
- mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| tb1 |
+----------------+
1 row in set (0.00 sec)
查看数据表结构:
SHOW COLUMNS FROM tbl_name
mysql> SHOW COLUMNS FROM tb1;
+----------+---------------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+----------+---------------------+------+-----+---------+-------+
| username | varchar(20)| YES || NULL ||
| age | tinyint(3) unsigned | YES || NULL ||
| salary | float(8,2) unsigned | YES || NULL ||
+----------+---------------------+------+-----+---------+-------+
3 rows inset(0.08 sec)
创建好的数据表只是规定了有多少列;二维表中还有行,这里的行称为记录;
向数据表插入记录:
INSERT [INTO] tbl_name[(col_name, ...)] VALUES(val , ...) //col_name:列名
记录查找:
SELECT expr,... FROM tbl_name
mysql> INSERT tb1 VALUES(‘Tom‘,25,7863.25); //插入记录;
Query OK,1 row affected (0.08 sec)
mysql> INSERT tb1 VALUES(‘Tom‘,25);
ERROR 1136(21S01):Column count doesn‘t match value count at row 1
mysql> INSERT tb1(username,salary) VALUES(‘John‘,4500.69); //插入部分记录
Query OK, 1 row affected (0.06 sec)
mysql> SELECT * FROM tb1; //查看数据表中的所有字段;
+----------+------+---------+
| username | age | salary |
+----------+------+---------+
| Tom | 25 | 7863.25 |
| John | NULL | 4500.69 |
+----------+------+---------+
2 rows in set (0.02 sec)
空值与非空:
NULL,字段值可以为空
NOT NULL,字段值禁止为空
mysql> CREATE TABLE tb2(
-> username VARCHAR(20) NOT NULL, //表示该字段今后需要写入值得时候必须要赋值,否则将会产生错误;
-> age TINYINT UNSIGNED NULL //可以不赋值,默认为NULL;
->);
Query OK,0 rows affected (0.14 sec)
mysql> SHOW COLUMNS FROM tb2;
+----------+---------------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+----------+---------------------+------+-----+---------+-------+
| username | varchar(20)| NO || NULL ||
| age | tinyint(3) unsigned | YES || NULL ||
+----------+---------------------+------+-----+---------+-------+
2 rows inset(0.02 sec)
mysql>
mysql> INSERT tb2 VALUES(‘TOM‘,NULL); //age可以为空;
Query OK,1 row affected (0.05 sec)
mysql> SELECT * FROM tb2;
+----------+------+
| username | age |
+----------+------+
| TOM | NULL |
+----------+------+
1 row inset(0.00 sec)
mysql> INSERT tb2 VALUES(NULL,26); //username不能为空;
ERROR 1048(23000):Column‘username‘ cannot be null
AUTO_INCREMENT
自动编号,且必须与主键组合使用
默认情况下,起始值为1,每次的增量为1
PRIMARY KEY
主键约束
每张数据表只能存在一个主键
主键保证记录的唯一性
主键自动为NOT NULL
mysql> CREATE TABLE tb3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT, //自动编号必须与主键组合使用;
-> username VARCHAR(30) NOT NULL
->);
ERROR 1075(42000):Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql> CREATE TABLE tb3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
//自动编号必须与主键组合使用;-> username VARCHAR(30) NOT NULL
->);
Query OK,0 rows affected (0.08 sec)
mysql> SHOW COLUMNS FROM tb3;
+----------+----------------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | //主键默认为NOT NULL
| username | varchar(30)| NO || NULL ||
+----------+----------------------+------+-----+---------+----------------+
2 rows inset(0.01 sec)
mysql> INSERT tb3(username) VALUES(‘Tom‘);
Query OK,1 row affected (0.05 sec)
mysql> INSERT tb3(username) VALUES(‘John‘);
Query OK,1 row affected (0.03 sec)
mysql> INSERT tb3(username) VALUES(‘Rose‘);
Query OK,1 row affected (0.04 sec)
mysql> INSERT tb3(username) VALUES(‘Dimitan‘);
Query OK,1 row affected (0.05 sec)
mysql> SELECT * FROM tb3;
+----+----------+
| id | username |
+----+----------+
|1|Tom| //自动编号,每次自增量为1;
|2|John|
|3|Rose|
|4|Dimitan|
+----+----------+
4 rows inset(0.00 sec)
mysql>
主键不一定需要与自动编号一同使用:
mysql> CREATE TABLE tb4(
-> id SMALLINT UNSIGNED PRIMARY KEY, //没有自动编号
-> username VARCHAR(20) NOT NULL
->);
Query OK,0 rows affected (0.14 sec)
mysql> SHOW COLUMNS FROM tb4;
+----------+----------------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+----------+----------------------+------+-----+---------+-------+
| id | smallint(5) unsigned | NO | PRI | NULL ||
| username | varchar(20)| NO || NULL ||
+----------+----------------------+------+-----+---------+-------+
2 rows inset(0.00 sec)
mysql> INSERT tb4 VALUES(4,‘Tom‘);
Query OK,1 row affected (0.05 sec)
mysql> INSERT tb4 VALUES(22,‘John‘);
Query OK,1 row affected (0.05 sec)
mysql> SELECT * FROM tb4;
+----+----------+
| id | username |
+----+----------+
|4|Tom|
|22|John|
+----+----------+
2 rows inset(0.00 sec)
mysql>
mysql> INSERT tb4 VALUES(22,‘Rose‘); //不能插入相同的主键;
ERROR 1062 (23000): Duplicate entry ‘22‘ for key ‘PRIMARY‘
UNIQUE KEY
唯一约束
唯一约束可以保证记录的唯一性
唯一约束的字段可以为空值(NULL)
每张数据表可以存在多个唯一约束
mysql> CREATE TABLE tb5(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, //无符号、自动编号、主键约束;
-> username VARCHAR(20) NOT NULL UNIQUE KEY, //唯一约束;
-> age tinyint UNSIGNED
->);
Query OK,0 rows affected (0.08 sec)
mysql> SHOW COLUMNS FROM tb5;
+----------+----------------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20)| NO | UNI | NULL ||
| age | tinyint(3) unsigned | YES || NULL ||
+----------+----------------------+------+-----+---------+----------------+
3 rows inset(0.01 sec)
mysql> INSERT tb5(username,age) VALUES(‘Tom‘,22);
Query OK,1 row affected (0.03 sec)
mysql> INSERT tb5(username,age) VALUES(‘Tom‘,22);
ERROR 1062(23000):Duplicate entry ‘Tom‘for key ‘username‘
mysql>
mysql> SELECT * FROM tb5;
+----+----------+------+
| id | username | age |
+----+----------+------+
|1|Tom|22|
+----+----------+------+
1 row inset(0.00 sec)
mysql>
DEFAULT
默认值
当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
mysql> CREATE TABLE tb6(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) NOT NULL UNIQUE KEY,
-> sex ENUM(‘1‘,‘2‘,‘3‘) DEFAULT ‘3‘
->);
Query OK,0 rows affected (0.08 sec)
mysql> SHOW COLUMNS FROM tb6; //查看数据表结构;
+----------+----------------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20)| NO | UNI | NULL ||
| sex | enum(‘1‘,‘2‘,‘3‘)| YES ||3|| //默认值3;
+----------+----------------------+------+-----+---------+----------------+
3 rows inset(0.03 sec)
mysql> INSERT tb6(username) VALUES(‘Tom‘);
Query OK,1 row affected (0.05 sec)
mysql> SELECT * FROM tb6;
+----+----------+------+
| id | username | sex |
+----+----------+------+
|1|Tom|3|
+----+----------+------+
1 row inset(0.00 sec)
mysql>