mySQL 教程 第3章 数据类型和数据完整性
准备数据库
创建练习数据库,以下实验都是在这个数据库中完成。






练习1:比较各种数值型

create table tmp1
(
id INT,
name VARCHAR(25),
deptId decimal(5,1),
salary FLOAT
);
执行desc tmp1;
显示

插入两行记录查看结果
insert into tmp1 VALUES (199,'韩立刚',3223.32,544.5);
insert into tmp1 VALUES (19999,'韩旭',32223.23,5445.23323);
查看结果
select * from tmp1

练习2: 日期和时间类型
1. Year数据类型练习
create TABLE tmp2(y YEAR);
insert INTO tmp2 values(2010),('2012'),('2166');
select * from tmp2;
year的取值范围1901-2155

可以看到超过取值范围值为0
Year可以使用2位数构造年份
delete from tmp2;
insert INTO tmp2 values('0'),('12'),('66'),('00');
select * from tmp2;

根据输入的值自动使用取值范围1901-2155构造年份
2. Time 数据类型表示方式
create table tmp3(t TIME);
insert into tmp3 VALUES ('10:05:23'),('23:43'),('2 10:10'),('2 02'),('10');
select * from tmp3;

下面看time数值另外一种输入方法
delete from tmp3
insert into tmp3 VALUES ('101112'),(111212),('0'),('107010');
select * from tmp3;

插入系统时间
delete from tmp3
insert into tmp3 VALUES (CURRENT_TIME),(NOW());
select * from tmp3;

3. Data类型表示方式
取值范围1000-01-01---9999-12-3
表示方法YYYY-MM-DD或 YYYYMMDD
create table tmp4(d DATE);
insert into tmp4 VALUES (CURRENT_DATE),('2010-02-12'),('19920302'),('20121219');
select * from tmp4;

向表中插入YY-MM-DD和YYMMDD格式日期
delete from tmp4;
insert into tmp4 VALUES (111111),(221212),('661209'),('120923'),('99-11-21');
select * from tmp4;

4. Datetime数据类型练习
该数据类型包括日期和时间,需要8个字节存储,格式’YYYY-MM-DD HH:MM:SS
create table tmp5 (dt DATETIME);
insert into tmp5 values ('1999-08-08 08:08:08'),('19750605080808'),('20100201121212');
select * from tmp5

插入系统时间
insert into tmp5 values (now());
select * from tmp5

5. TimeStamp
Datatime在存储时间时,按着实际输入的格式存储,即输入什么就存储什么,与时区无关,timestamp值的存储以UTC(世界标准时间)格式保存,存储时对当前时区进行转换,检索时在转换回当前时区。即查询时,根据当前时区不同,显示的时间值不同。
北京时间比格林尼治时间(世界时)早8小时,即:北京时间=世界时+8小时。
create table tmp6
(
ts timestamp
)
select now();
INSERT into tmp6 values (NOW());
select * from tmp6;

更改mySQL时区
set time_zone='+10:00' 默认时间是+8:00
select * from tmp6;

可以看到时间戳类型会根据mySQl的时区调整输出结果。
练习3:字符串类型
1. 比较Char和varchar
Char(M) 存储占用M字节 1<=M<=255
Varchar(M) 存储L个字符,占用L+1字节,L<=M 并且 1<=M<=255
比如Vch varchar(5) vch=’abcde’ 占用了6个字节
Vch=’ab’ 占用3个字节
create table tmp7
(
ch CHAR(4),
vch VARCHAR(4)
);
insert into tmp7 VALUES ('ab ','ab ');
insert into tmp7 VALUES ('abcde','abcdefg');
select CONCAT('(',ch,')'),CONCAT('(',vch,')') from tmp7

MySQL中concat函数
使用方法:
CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串
2. Text数据类型不删除尾部空格
Text 占用的空间L+2 L<2^16 即L<65536个字节
比如 t text; t=’abcd’ 存储占用6个字节
Tinytext占用的空间L+1 L<2^8
Text占用的空间L+2 L<2^16
MediumText占用的空间L+3 L<2^24
LongText占用的空间L+4 L<2^32
create table tmp8
(
t TEXT
);
insert into tmp8 VALUES ('How are you! Fine,thank you! ');
select CONCAT('(',t,')') from tmp8

3. Enum类型
定义性别为枚举数据类型,只允许输入男女,只允许选取一个值。
create table tmp9
(
sname char(20),
sex ENUM('男','女')
);
drop table tmp9
insert into tmp9 values('韩立刚','男'),('韩立辉','男'),('韩旭','女')
select * from tmp9

insert into tmp9 values('张飞','南')
select * from tmp9

枚举类型数值 可以查看索引,从1开始,空值为索引值为0,使用以下方法可以看到枚举类型的索引值
select sname,sex,sex+0 from tmp9

向表中插入数据时,对于枚举类型的数据库可以使用索引值插入。
insert into tmp9 values('刘备',1),('貂蝉','2')
select * from tmp9 where sname in ('刘备','貂蝉')

4. Set数据类型
是字符串对象,可以零个或多个值,Set列最多可以有64个成员。指定多值时,使用‘,’隔开。
创建表存储用户的兴趣爱好。
create table tmp10
(
sname char(20),
hobby SET('音乐','旅游','游泳','读书','美术')
);
insert into tmp10 values ('韩立刚','音乐,美术')
insert into tmp10 values ('韩旭','音乐,美术,音乐')
insert into tmp10 values ('韩愈','音乐,跳舞,美术')
select * from tmp10

数据完整性
数据完整性类型

实体完整性
每一条记录必须唯一,每个实体必须拥有一个主键或者其他的唯一标识列,SQL实现实体完整性主要通过唯一索引、UNIQUE约束、Primary Key约束或Identity属性,强制表的标识符列或主键来实现。
域完整性
考虑该列应该输入哪些值,域完整性限制列输入的值的范围,包括正确的数据类型、格式和有效的数据范围。
比如性别 只允许输入男女,成绩 只允许输入 1-100
通过 数据类型 Check约束 规则 Foreign Key约束 Default定义 Not Null定义
在mySQL中是set或enum类型来实现
引用完整性
又称为参照完整性,在插入和删除数据时,引用完整性用于维持参照表和被参照表之间的数据一致性。
在mySQL中,应用完整性通过主键(Primary Key)和外键(Foreign Key)约束来实现。
数据完整性实例
创建数据库schoolDB2和三张表
--创建学生表
CREATE TABLE `TStudent` (
`StudentID` varchar(15) NOT NULL,
`Sname` varchar(10) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`cardID` varchar(20) DEFAULT NULL,
`Birthday` datetime DEFAULT NULL,
`Email` varchar(40) DEFAULT NULL,
`Class` varchar(20) DEFAULT NULL,
`enterTime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--创建课程表
create table TSubject
(
subJectID nvarchar(10),
subJectName nvarchar(30),
BookName nvarchar(30),
Publisher nvarchar(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
--创建分数表
create table TScore
(
StudentID nvarchar(15),
subJectID nvarchar(10),
mark decimal
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
练习4:实体完整性实例(主键)
为TStudent创建主键




同样给TSubject表subJectID列创建主键

使用命令给TScore表添加复合主键。图形界面只支持单列创建主键。
alter table TScore add primary key (StudentID,subJectID);
刷新后可以看到创建的复合主键

设置主键后向Tstudent表插入3条记录
insert into TStudent (StudentID,Sname,sex)values ('00003','韩立刚','男');
insert into TStudent (StudentID,Sname,sex)values ('00002','韩立军','男');
insert into TStudent (StudentID,Sname,sex)values ('00001','韩旭','女');
insert into TStudent (StudentID,Sname,sex)values ('00003','韩庆利','男');
select StudentID,Sname,sex from TStudent
你只能看到3条记录第四条没有插入成功

练习5:域完整性(默认值)
将Tstudent表的class列的默认值设置为’网络班’。

插入一条记录
insert into TStudent (StudentID,Sname,sex)values ('00004','韩庆利','男');
select StudentID,Sname,sex,class from TStudent
可以看到Class默认为网络班

练:6:参照完整性(外键参照)
设置外键参照,需要将表的存储引擎设置为InnoDB,事务型数据库的首选引擎,支持ACID事务,支持行级锁定。在上面创建表时已经指定了存储引擎,在这里确认一下,如果不是InnoDB,要更改为InnoDB。



5. 设置外键参照




查看表之间引用关系,将三个表拖拽过去,可以看到之间的关系,你也可以在这里建立外键。

6. 验证参照完整性
清除TStudent表所有记录
delete from TStudent
插入4条记录
insert into TStudent (StudentID,Sname,sex)values ('00004','韩庆利','男');
insert into TStudent (StudentID,Sname,sex)values ('00003','韩立刚','男');
insert into TStudent (StudentID,Sname,sex)values ('00002','韩立军','男');
insert into TStudent (StudentID,Sname,sex)values ('00001','韩旭','女');
插入两门课程
insert into TSubject values ('0001','计算机网络','计算机网络','清华出版社')
insert into TSubject values ('0002','数据结构','数据结构','人邮出版社')
select * from `TSubject`

插入成绩 4个学生两门课
insert into TScore values ('00001','0001',89);
insert into TScore values ('00002','0001',79);
insert into TScore values ('00003','0001',87);
insert into TScore values ('00004','0001',58);
insert into TScore values ('00001','0002',69);
insert into TScore values ('00002','0002',85);
insert into TScore values ('00003','0002',88);
insert into TScore values ('00004','0002',98);
查看插入的成绩
select * from TScore

插入一个不存在的课程编号为0003的试一下,看看是否能够插入成功。
insert into TScore values ('00004','0003',98);
可以看到插入失败

mySQL 教程 第3章 数据类型和数据完整性的更多相关文章
- mySQL 教程 第7章 存储过程和函数
存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储过程和函数的区别 函数只 ...
- mySQL 教程 第4章 数据查询
mySQL运算符 这些运算符在SQL查询中用得到. 算数运算符 + 加 - 减 * 乘 / DIV 除 % MOD 取余数 比较运算符 = 等于 <> != 不等于 < <= ...
- mySQL 教程 第2章 安装和介绍mySQL
设置mySQL字符集 支持中文的字符集是utf8,该设置可以更改mySQL配置文件进行全局设置,也可以针对数据库设置,也可以针对表设置,也可以针对列设置.字符集更改后新插入的数据生效,对以前不生效. ...
- mySQL教程 第1章 数据库设计
E-R设计 很多同学在学SQL语句时,觉得非常困难,那是因为你在学一个你根本不了解的数据库,数据库中的表不是你设计的,表与表之间的关系你不明白.因此在学SQL语句之前,先介绍一下数据库设计. 下面举例 ...
- mySQL 教程 第8章 视图
创建视图的目的 简单 隐藏数据复杂性 安全 可以对视图授权 数据独立 可以屏蔽表结构变化对用户的影响,比如增加列,更改列名 创建视图 1. 创建单表视图 以下视图显示JAVA班的学生姓名.身份证号和班 ...
- mySQL 教程 第5章 插入 更新与删除数据
使用SQL Manager管理工具连接到schoolDB.由于三张表都设置了主键,因此,以下练习中插入的记录,主键不能重. 插入数据 1. 练习:为表的所有字段插入数据 为表中所有字段插入数据,可以不 ...
- Mysql技术内幕-笔记-第二章 数据类型
第二章 数据类型 Mysql中尽量不要使用UNSIGNED,因为可能会带来一些意想不到的效果 SHOW CREATE TABLE tablename\G;查看表的创建语句 ZEROFILL会将宽度小于 ...
- MySQL命令,一篇文章替你全部搞定
MySQL命令,一篇文章替你全部搞定 MySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高级功能,如存储过程,触发器,事务处理等.而这两个方面又 ...
- 转-MySQL教程-写的很详细,赞一个
原帖地址:https://www.w3cschool.cn/mysql/,谢谢原帖大人 MySQL是什么? MySQL安装 MySQL示例数据库 MySQL导入示例数据库 MySQL基础教程 MySQ ...
随机推荐
- linux shard virtual memory
- ajax缓存和编码问题
ajax缓存问题,工作中几乎使用ajax都会碰到,虽然解决缓存问题很多,但我 一直使用常用的,方便理解的,没有多大记忆成本的,get方式的缓存问题很蛋疼,尤其是低版本IE啦,废话少说, <scr ...
- SQL Server 对比数据库差异
一.视图和存储过程比较 [原理]利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比.系统表"sysobjects"之 ...
- bzoj3946
题解: 树套树 treap+线段树 treap就把线段树上的节点弄一下 然后修改的时候 把中间的一段一起加 把两头重新计算(二分+hash) 代码: #include<bits/stdc++.h ...
- docker(一)安装和必要的配置。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- c语言基础:数据类型 分类: iOS学习 c语言基础 2015-06-10 21:43 9人阅读 评论(0) 收藏
C语言基本数据类型大体上分为: 整型 和 浮点型 字节: 计算机中最小的储存单位 1 Byte = 8 bit 整型: int 4 ...
- 构建你自己的论坛,基于windows服务器的xampp+discuz论坛
首先声明,论坛的构建需要基于企业,并且基于企业注册,然后进行域名备案. 此处作为研究,先示例: 1. 安装 xampp 软件,百度搜索 然后在服务器安装,基本都是默认安装,然后出来. 安装完成后,接下 ...
- FZU 1202
http://acm.fzu.edu.cn/problem.php?pid=1202 二分图最大匹配,问哪些边是必要的,O(n^3)的方法 删边的时候把连接关系也要删掉,如果在此基础上无法找到增广路, ...
- magento小常识
magento后台设置好产品分类及添加产品后前台没有显示出来:以下几个可能: 1.首先检查网店商城的Root Category 以 及跟目录下面的子目录设置是否有误,具体在目录->管理分类-&g ...
- 【linux基础】区块选择VisualBlock
前言 有时候使用linux需要选择某一块区域进行处理,比如对某些列的某些行,类似于Ultraedit的列模式,其实vim中就有相关的功能,此时可以使用vim的区块选择进行处理. 区块选择 1.在一般模 ...