这一部分主要使用SQL中的DDL,数据库定义语言(data definition language),对数据库,表进行新建,修改,和删除。
SHOW DATABASES;
CREATE DATABASE db_name;
每创建一个数据库,就会在Data目录下新建一个以数据库名字命名(db_name)的文件夹。说明:Data默认在程序的解压目录下,比如:C:\ProgramData\MySQL\MySQL Server 5.7\Data
,可以通过my.ini配置文件来修改Data目录的路径,参考MySQL基础(一)
创建数据库时可以指定字符编码:
CREATE DATABASE db_name CHARACTER SET utf8; -- 注意是utf8,而不是utf-8,否则报错
CREATE DATABASE db_name CHARSET utf8; -- 也可以连写;
那么在该数据库下创建的表,默认都用这个编码。
SHOW CREATE DATABASE db_name;
ALTER DATABASE db_name CHARSET utf8;
DROP DATABASE db_name;
USE db_name;
使用数据库后(进入了Data下的对应数据库目录),就可以在该数据库下进行表操作。没有退出数据库一说,都是通过USE
在不同数据库间切换。
创建表的基本语法语法如下:
CREATE TABLE 表名
(
字段名 类型(宽度) [可选约束条件],
字段名 类型(宽度) [可选约束条件],
字段名 类型(宽度) [可选约束条件]
)[可选表选项];
比如创建一张顾客表
CREATE TABLE Customers
(
cust_id INT PRIMARY KEY AUTO_INCREMENT, -- 定义主键,并自增
cust_name CHAR(50) NOT NULL, -- 各字段之间以逗号分隔
cust_address CHAR(50) NULL,
cust_phone CHAR(11) NOT NULL -- 最后一个字段不加逗号
)ENGINE=InnoDB; -- 语句以分号结束
多个约束条件之间以空格分隔
PRIMARY KEY
主键字段,非空且唯一FOREIGN KEY
外键字段NOT NULL
非空NULL
允许为空(默认)DEFAULT
默认值,比如设置默认性别:DEFAULT ‘male’
UNIQUE
字段的值唯一AUTO_INCREMENT
自增,用于主键字段,要求字段类型必须为整数。定义自增后,插入数据可以不指定该字段的值。多个表选项之间以空格分隔
ENGINE=InnoDB
指定存储引擎 DEFAULT CHARSET=utf8
设置默认编码,默认继承数据库的编码,也可以在my.ini
配置中设置默认编码AUTO_INCREMENT=2
指定自增步长为2类型 | 存储空间 | 最小值 | 最大值 |
---|---|---|---|
(Bytes) | (Signed/Unsigned) | (Signed/Unsigned) | |
TINYINT 小整数 |
1 | -128 |
127 |
2的8次幂减一 | 0 |
255 |
|
SMALLINT |
2 | -32768 |
32767 |
0 |
65535 |
||
MEDIUMINT |
3 | -8388608 |
8388607 |
0 |
16777215 |
||
INT 大整数 |
4 | -2147483648 |
2147483647 |
2的32次幂减一 | 0 |
4294967295 |
|
BIGINT 极大整数 |
8 | -9223372036854775808 |
9223372036854775807 |
0 |
18446744073709551615 |
注意:默认类型是Signed有符号整数,但是也可以手动指定为Unsigned无有符号整数,比如:INT UNSIGNED
类型 | 存储空间 | 范围 | 说明 | 适用 |
---|---|---|---|---|
DECIMAL(M,D) 定点数 |
4 | DECIMAL(5,2) :-999.99 ~ 999.99 |
M表示最大位数,范围是1~65 ;D表示小数点后有几位,范围0~30 ,且必须小于M;精度始终准确 |
价格,工资,身高,体重等 |
FLOAT 单精度 |
4 | 随着小数的增多,精度变得不准确 | ||
DOUBLE 双精度 |
8 | 随着小数的增多,精度比float要高,但也会变得不准确 |
说明:
FLOAT
和DOUBLE
也支持(M, D)Data Type | “Zero” Value |
---|---|
DATE |
'0000-00-00' |
TIME |
'00:00:00' |
DATETIME |
'0000-00-00 00:00:00' |
TIMESTAMP |
'0000-00-00 00:00:00' |
YEAR |
0000 |
DATETIME与TIMESTAMP区别:在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣:
- DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
- DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。
- DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
- DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
类型 | 宽度范围 | 说明 | 特点 |
---|---|---|---|
CHAR | 0-255 | 定长字符串,存值时,如果字符串长度短于宽度,则在字符串后面补空格;查询时,结果会自动删除尾部的空格 | 速度快,浪费空间 |
VARCHAR | 0-65535 | 可变长字符串,最大65KB。储数据的真实内容,不会用空格填充;并且真实数据前有1-2Bytes的前缀,来表示真实数据的bytes字节数 | 节省空间,速度慢 |
TEXT | 0-65535 | 多数情况下同VARCHAR。有更多长度选择 TINYTEXT(255B) , TEXT ,MEDIUMTEXT(16MB) , and LONGTEXT(4GB) , |
不支持默认值;索引需要指定前缀长度 |
BINARY | 同CHAR,只是存储内容为二进制/字节字符串 | ||
VARBINARY | 同VARCHAR,只是存储内容为二进制/字节字符串 | ||
BLOB | 字节字符串(byte strings),多数情况下同VARBINARY。更多长度选择 TINYBLOB , BLOB , MEDIUMBLOB , and LONGBLOB . |
不支持默认值;索引需要指定前缀长度 |
比较常用的就是CHAR 和 VARCHAR。出于性能优化,可以考虑以下几点:
枚举(ENUM)是在给定的范围内选一个值,而集合(SET)是可以选多个值
-- 枚举类型
CREATE TABLE Shirts
(
name CHAR(30),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
-- 插入数据时,只能从上述几个尺寸中选择
INSERT INTO Shirts (name, size)
VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
-- 集合类型
CREATE TABLE Investigation
(
name CHAR(30),
hobby SET('reading', 'running', 'swimming', 'hiking')
);
INSERT INTO Investigation (name, hobby)
VALUES ('Lena', 'reading, swimming');
-- 如果插入数据不在集合内或拼写错误,会报错 Data truncated for column 'hobby'...
-- 插入结果如下:
+------+------------------+
| name | hobby |
+------+------------------+
| Lena | reading,swimming |
+------+------------------+
SHOW TABLES;
将打印出创建表时使用的语句
SHOW CREATE TABLE Customers;
DESC Customers;
SHOW COLUMNS FROM Customers; -- 同上,用哪个都行,结果如下
+--------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+----------------+
| cust_id | int(11) | NO | PRI | NULL | auto_increment |
| cust_name | char(50) | NO | | NULL | |
| cust_address | char(50) | YES | | NULL | |
| cust_phone | char(11) | NO | | NULL | |
+--------------+----------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
理想情况下,不要在表中包含数据时对表进行修改。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大的改动。使用ALTER TABLE
对表进行修改前,应做好表结构和数据的备份。
如果该字段有自增约束(AUTO_INCREMENT),需要先删除自增约束,才能删除主键。
删除自增:
-- 取消自增
ALTER TABLE Customers
MODIFY cust_id INT PRIMARY KEY NOT NULL;
-- ERROR 1068 (42000): Multiple primary key defined
-- cust_id 在键建表时已经是主键,修改时不能再次指定为主键,所以报错
ALTER TABLE Vips
MODIFY cust_id INT NOT NULL;
删除主键:
ALTER TABLE Customers
DROP PRIMARY KEY; -- 可以删除主键或联合主键
ALTER TABLE Customers
ADD PRIMARY KEY (cust_id);
主键通常定义在一列上,但也可以使用多个列作为主键,只要列值的组合能唯一标识表示表中的一行即可。
ALTER TABLE Customers
ADD PRIMARY KEY (cust_name, cust_phone); -- 新增联合主键的方式和新增主键的方式一样
mysql> DESC Customers; -- 查看
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| cust_id | int(11) | NO | | NULL | |
| cust_name | char(50) | NO | PRI | NULL | |
| cust_address | char(50) | YES | | NULL | |
| cust_phone | char(11) | NO | PRI | NULL | |
+--------------+----------+------+-----+---------+-------+
ALTER TABLE Customers
MODIFY cust_id INT NOT NULL AUTO_INCREMENT;
新增字段时,要注意所增加字段的数据类型,并考虑使用NULL
和DEFAULT
约束
格式:
ALTER TABLE 表名
ADD 新增字段名 类型 [可选约束]; -- 新增字段,默认新增至最后
ADD 新增字段名 类型 [可选约束] [FIRST]; -- 新增字段放到第一列
ADD 新增字段名 类型 [可选约束] [AFTER 字段名]; -- 新增字段放到某列之后
示例:
-- 为 Customers 表增加 cust_email 字段
ALTER TABLE Customers
ADD cust_email CHAR(255) NULL;
-- 修改 Customers 表 cust_email 字段类型为VARCHAR(255) 约束为NOT NULL
ALTER TABLE Customers
MODIFY cust_email VARCHAR(255) NOT NULL;
格式:
ALTER TABLE 表名
CHANGE 旧字段名 旧字段名 类型 [约束条件];
示例:
-- 修改字段名 cust_email 为 cust_memo,约束为 NULL
ALTER TABLE Customers
CHANGE cust_email cust_memo VARCHAR(255) NULL;
ALTER TABLE 表名
DROP 字段名;
格式:
ALTER TABLE 表名 CHARSET 字符编码;
示例:
-- 修改Customers表字符编码为 gbk
ALTER TABLE Customers CHARSET gbk;
修改完成后,可以通过SHOW CREATE TABLE Customers;
语句查看修改结果。
-- 修改 Customers 表名为 Vips
RENAME TABLE Customers to Vips;
修改完成后可以通过 SHOW TABLES;
语句查看修改结果
-- 修改 Customers 表存储引擎为 MyISAM
ALTER TABLE Customers
ENGINE=MyISAM;
DROP TABLE 表名;