注:本文出现的代码片段源于文章末尾的总代码
CREATE TABLE IF NOT EXISTS STUDENT() DEFAULT CHARSET=utf8mb4 COMMENT '学生表';
列类型分为:
STUDENTNO INT(4) UNSIGNED NOT NULL COMMENT '学号',
?类型 | 说明 | 取值范围 | 存储需求 |
TINYINT[(M)] | 非常小的数据 | 有符值: -27 ~ 27-1? 无符号值:0 ~ 28-1??????????????????????????????? | 1字节 |
SMALLINT[(M)] | 较小的数据 | 有符值:? -215 ~ 215-1? 无符号值:? 0 ~ 216-1?????? | 2字节 |
MEDIUMINT[(M)] | 中等大小的数据 | 有符值:? -223 ~ 223-1? 无符号值:? 0 ~ 224-1?????? | 3字节 |
INT[(M)] | 标准整数 | 有符值: -231 ~ 231-1? 无符号值:0 ~ 232-1?????? | 4字节 |
BIGINT[(M)] | 较大的整数 | 有符值: -263 ~263-1 无符号值:0 ~264-1?????? | 8字节 |
FLOAT[(M)] | 单精度浮点数 | ±1.1754351e -38 | 4字节 |
DOUBLE[(M)] | 双精度浮点数 | ±2.2250738585072014e -308 | 8字节 |
DECIMAL | 字符串形式的浮点数 | decimal(m, d) | m个字节 |
?类型 | 说明 | 最大长度 |
CHAR[(M)] | 固定长字符串,检索快但费空间, 0 <=? M? <=?? 255 | M个字符 |
VARCHAR[(M)] | 可变字符串?? 0 <=? M <= 65535 | 可变长度 |
TINYTEXT | 微型文本串 | 0-255个字符 |
TEXT | 文本串 | 0-65535个字符 |
?类型 | 说明 | 取值范围 |
DATE | YYYY-MM-DD,日期格式 | 1000-01-01~ 9999-12-31 |
TIME | Hh:mm:ss ,时间格式 | -838:59:59~838:59:59 |
DATETIME | YY-MM-DD hh:mm:ss | 1000-01-01 00:00:00? 至 9999-12-31 23:59:59 |
TIMESTAMP | YYYYMMDDhhmmss格式表示的时间戳 | 197010101000000 ~2038年的某个时刻 |
YEAR | YYYY格式的年份值 | 1901~2155 |
MySQL允许“不严格”语法:任何标点符号都可以用作日期部分之间的间隔符,如”16-06-16” ”16.06.16” ”16/06/16”都可以写入数据表
STUDENTNO INT(4) UNSIGNED NOT NULL COMMENT '学号',
?字段属性 | 说明 |
UNSIGNED | 无符号的,声明该数据列不允许负数。 |
ZEROFILL |
1.
0
填充的,不足位数的用
0
来填充,如
int(3),5
则为
005
;
2.
使用
zerofill
会默认加
unsigned
。
|
AUTO_INCREMENT |
1.
自动增长的,每添加一条数据,自动在上一个记录数上加
1
;
2.
通常用于设置主键,且为整数类型;
3.
可定义起始值和步长
|
NULL 和 NOT NULL |
1.
默认为
NULL,
即没有插入该列的数值;
2.
如果设置为
NOT NULL
,则该列必须有值;
|
DEFAULT |
1.
默认的,用于设置默认值;
2.
例如,性别字段,默认为“男”,否则为“女”;若无指定该列的值,则默认为“男”的值
|
STUDENTNO INT(4) UNSIGNED NOT NULL COMMENT '学号',
创建表之后,如果需要查看一下该表是否存在,可以使用查看表的SQL命令
SHOW TABLES;
创建表之后,如果需要查看一下该表的定义,可以使用如下的SQL命令
DESCRIBE? 表名或DESC 表名
1.常用的存储引擎:MyISAM 和 InnoDB
MySQL5.5以上版本默认的存储引擎是InnoDB
MyISAM 和 InnoDB的区别:
名称 | MyISAM | InnoDB |
事务处理 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约2倍 |
适用场合:
? ? 使用 MyISAM :?? 节约空间及相应速度,适合以访问为主的应用。? ? 使用 InnoDB :???? 安全性,事务处理及多用户操作数据表。
?ALTER TABLE 旧表名? RENAME AS? 新表名
#把result表改名为studentresult
ALTER TABLE RESULT RENAME AS STUDENTRESULT;
ALTER TABLE STUDENTRESULT RENAME AS RESULT;
?ALTER TABLE 表名?? ADD 字段名?? 列类型 [ 属性 ]
#给result表添加一个id字段
ALTER TABLE RESULT ADD ID INT(4) UNSIGNED NOT NULL COMMENT'成绩编号';
?ALTER TABLE 表名?? MODIFY 字段名?? 列类型 [ 属性 ]? #修改列的数据类型
#修改result表中的id字段,改为字符串类型,允许有符号,允许为空,注释改为成绩编码
ALTER TABLE RESULT MODIFY ID VARCHAR(16) COMMENT '成绩编码';?ALTER TABLE 表名? CHANGE 旧字段名 新字段名? 列类型 [ 属性 ]#修改列的数据类型及名称
#修改result表中的ID字段,ID名称改为rid,类型为int(4),零填充,默认值1
ALTER TABLE RESULT CHANGE ID RID INT(4) ZEROFILL DEFAULT 1;
?ALTER TABLE 表名?? DROP? 字段名
#删除result表中的id字段
ALTER TABLE RESULT DROP RID;
数据库采用约束、规则、触发器等来保证数据完整性
?约束类型 | 关键字 | 说明 |
非空约束 | NOT NULL | 如果字段不允许为空,则需要设置NOT NULL约束。 |
默认约束 | DEFAULT | 赋予某字段默认值,如果该字段没有赋值,则其值为默认值。 |
唯一约束 | UNIQUE KEY | 设置该字段的值唯一的,允许为空。 |
主键约束 | PRIMARY KEY | 设置该字段为表的主键,可以作为该表记录的唯一标识,不能为空。 |
外键约束 | FOREIGN KEY | 用于在两表之间建立关系,需要引用主表的哪一字段。 |
ALTER TABLE 表名? ADD CONSTRAINT 约束名? 约束关键字? 具体的约束说明
#给学生表的联系电话字段设置为唯一约束
ALTER TABLE STUDENT ADD CONSTRAINT UQ_PHONE UNIQUE(PHONE);
该字段的值是唯一的
ALTER TABLE 表名? ADD CONSTRAINT 约束名? UNIQUE(列名)
#给学生表的联系电话字段设置为唯一约束
ALTER TABLE STUDENT ADD CONSTRAINT UQ_PHONE UNIQUE(PHONE);
注:如果两列或多列组合起来唯一地标识表中的每个行,则该主键叫做“复合主键”
如果一个字段即要求唯一又不能为null,可使用主键约束
ALTER TABLE 表名? ADD CONSTRAINT 约束名? PRIMARY KEY(列名1,列名2,…列名n)
ALTER TABLE student? ADD CONSTRAINT pk_studentno? PRIMARY KEY (studentno)
#15.删除主键索引,不需要指定名称,因为一个表中只能有一个主键
ALTER TABLE `SUBJECT` DROP PRIMARY KEY;
#16.删除唯一索引,必须指定唯一索引的名称,因为一个表中可以有多个字段的唯一索引
ALTER TABLE `STUDENT` DROP KEY UQ_STUDENTNAME;
CREATE DATABASE IF NOT EXISTS MYSCHOOL;
USE MYSCHOOL;
SHOW TABLES;
#1.创建学生表
CREATE TABLE IF NOT EXISTS STUDENT(
STUDENTNO INT(4) UNSIGNED NOT NULL COMMENT '学号',
LOGINPWD VARCHAR(20) NOT NULL COMMENT '密码',
STUDENTNAME VARCHAR(50) NOT NULL COMMENT '学生姓名',
SEX CHAR(1) NOT NULL DEFAULT '男' COMMENT '性别',
GRADEID INT(4) UNSIGNED COMMENT '年级编号',
PHONE VARCHAR(50) COMMENT '联系电话',
ADDRESS VARCHAR(255) DEFAULT '地址不详' COMMENT '家庭住址',
BORNDATE DATETIME COMMENT '出生年月',
EMAIL VARCHAR(50) COMMENT '邮箱账号',
IDENTITYCARD VARCHAR(18) COMMENT '身份证号'
)DEFAULT CHARSET=utf8mb4 COMMENT '学生表';
#2.创建年级表
CREATE TABLE IF NOT EXISTS GRADE(
GRADEID INT(4) UNSIGNED NOT NULL COMMENT '年级编号',
GRADENAME VARCHAR(50) NOT NULL COMMENT '年级名称'
) DEFAULT CHARSET=UTF8MB4 COMMENT '年级表';
#3.创建课程表
CREATE TABLE IF NOT EXISTS `SUBJECT`(
SUBJECTNO INT(4) UNSIGNED NOT NULL COMMENT '课程编号',
SUBJECTNAME VARCHAR(50) NOT NULL COMMENT '课程名称',
CLASSHOUR INT(4) UNSIGNED COMMENT '学时',
GRADEID INT(4) UNSIGNED COMMENT '年级编号'
) DEFAULT CHARSET=UTF8MB4 COMMENT '课程表';
#4.创建成绩表
CREATE TABLE IF NOT EXISTS `RESULT`(
STUDENTNO INT(4) UNSIGNED NOT NULL COMMENT '学号',
SUBJECTNO INT(4) UNSIGNED NOT NULL COMMENT '课程编号',
EXAMDATE DATETIME NOT NULL DEFAULT NOW() COMMENT '考试日期',
STUDENTRESULT INT(4) UNSIGNED NOT NULL COMMENT '考试成绩'
) DEFAULT CHARSET=UTF8MB4 COMMENT '成绩表';
#5.创建课程表,设置表类型为MyIsam
CREATE TABLE IF NOT EXISTS `SUBJECT`(
SUBJECTNO INT(4) UNSIGNED NOT NULL COMMENT '课程编号',
SUBJECTNAME VARCHAR(50) NOT NULL COMMENT '课程名称',
CLASSHOUR INT(4) UNSIGNED COMMENT '学时',
GRADEID INT(4) UNSIGNED COMMENT '年级编号'
)ENGINE=myisam DEFAULT CHARSET=UTF8MB4 COMMENT '课程表';
#6.删除课程表
DROP TABLE IF EXISTS `SUBJECT`;
#7.把result表改名为studentresult
ALTER TABLE RESULT RENAME AS STUDENTRESULT;
ALTER TABLE STUDENTRESULT RENAME AS RESULT;
#8.给result表添加一个id字段
ALTER TABLE RESULT ADD ID INT(4) UNSIGNED NOT NULL COMMENT'成绩编号';
#9.修改result表中的id字段,改为字符串类型,允许有符号,允许为空,注释改为成绩编码
ALTER TABLE RESULT MODIFY ID VARCHAR(16) COMMENT '成绩编码';
#10.修改result表中的ID字段,ID名称改为rid,类型为int(4),零填充,默认值1
ALTER TABLE RESULT CHANGE ID RID INT(4) ZEROFILL DEFAULT 1;
#11.删除result表中的id字段
ALTER TABLE RESULT DROP RID;
# 12.给学生表的联系电话字段设置为唯一约束
ALTER TABLE STUDENT ADD CONSTRAINT UQ_PHONE UNIQUE(PHONE);
ALTER TABLE STUDENT ADD CONSTRAINT UQ_STUDENTNAME UNIQUE(STUDENTNAME);
#13.给学生表设置主键,主键列为studentno
ALTER TABLE STUDENT ADD CONSTRAINT PK_STUDENTNO PRIMARY KEY(STUDENTNO);
#14.设置组合主键案例:设置课程表中的课程编号和年级编号为组合主键
ALTER TABLE `SUBJECT` ADD CONSTRAINT PK_SUBJECTNO_GRADEID PRIMARY KEY(SUBJECTNO,GRADEID);
#15.删除主键索引,不需要指定名称,因为一个表中只能有一个主键
ALTER TABLE `SUBJECT` DROP PRIMARY KEY;
#16.删除唯一索引,必须指定唯一索引的名称,因为一个表中可以有多个字段的唯一索引
ALTER TABLE `STUDENT` DROP KEY UQ_STUDENTNAME;