day44 详细建表语句,数据类型,约束,索引、主键、自增计数

数据库注意:输入法的中文和英文标点符号不一样!!

1.详细的建表语句 *****
create table 表名(字段名 数据类型[(长度) 约束条件]);
[]代表里面内容是可选的。


为什么需要给数据分类?
189 一八九
1.描述数据更加准确
2.节省内存空间

2.数据类型 *****
(1)整数类型
整型默认是有符号的,即有正负之分的符号。


如何设置为无符号?
方法1.create table t2(age tinyint unsigned);
方法2.建表后用alter修改

            默认有符号的范围                改为无符号的范围

!!!!! 对于整数类型而言长度不是数据所占的字节数 ,是显示数据时的宽度(字符数)。

*记忆:长度参数不控制数值范围,它控制数据的显示字符数。可存储的数值范围由整数的类型决定。

eg:desc+表名 看出:int默认长度是11,即int类型默认可以表示:算上正或负符号的11位数字。

默认情况下, 存储数值的十进制位数 小于所设置的显示宽度时 ,不会填充 没有任何效果。
加上zerofill 指定当存储的数值的十进制位数 小于所设置的显示宽度时 ,用0来填充。
当数据的十进制位长度 大于显示宽度时, 可以正常显示。
主要记住:  整型后面的长度的含义 与字符串是不同的。
tinyint
smallint
mediumint
int *****
bigint
总结:除了存储范围没啥区别
都是整型
默认有符号
对于显示宽度 原理是相同的

长度参数如果不指定 ,会有默认值。


严格模式
什么是严格模式?  对插入的数据严格要求, 不在数值范围直接报错 。eg:例如往tinyint中插入大于255的值将报错。
什么是非严格模式? 不对插入的数据严格要求 ,不在数值范围内也可以保存 保存的当前类型最大支持的值。
5.6版默认是非严格模式。
5.7版及以后默认严格模式。

查看SQL模式
select @@sql_mode;查看全局变量
show variables like "sql_mode";查看局部变量

修改SQL模式
set @@sql_mode = "值";
正常情况下不需要改

修改sql严格模式的特点,只是本次有效,下次重新恢复为默认模式。



浮点类型
float 4字节
double 8字节
decimal 不固定
create table t9(num float(m,d))
记忆:m 表示总长度 ,d 表示小数部分的长度必须<=d,当大于d时只四舍五入保留d位小数部分。

整数部分必须<=m-d位,当大于m-d位时会报错。
长度表示不是数据可存储范围(即数值范围) ,而是字符长度

eg:num float(5,2)  insert into number values(1.2444) 查看表中记录时是1.24。
       10.12 总长为4 小数部分为2

各个类型的最大长度
float (255,30) *****
double (255,30)
decimal (65,30)

区别:
float与double的精度不同 都是不准确的小数
decimal 准确的小数 不会丢失精度

具体使用哪种类型得根据使用场景判断
float满足大部分使用场景
decimal适合银行系统 科学研究等

注意:括号中m和d的值即长度参数 可以限制数据存储范围 ,与整型不同。
重点:记住m和d的含义

 


 

 

字符串类型
常用两种
char 定长字符串
char
varchar 可变长度字符串
注意:字符串中 ,长度指定的是数据的字符长度 ,与字节没关系。

create table t13(c1 char,c2 varchar(10));
在创建时 varchar必须指定长度 ,char有默认值。

不同点:
a char(3) b char(3)
A |B |
char类型在取数据时, 就根据长度来获取 ,不关心真实数据长度。
无论的数据有多长 占用的空间是固定的 造成了一定空间浪费

a varchar(30) b varchar(30)
(1)A(1)B
varchar类型在取数据时, 先获取数据长度 在根据长度获取真实数据 关心真实数据长度。
先存储长度需要一个字节 再存储真实数据 不会浪费空间
但是 由于需要计算数据的长度 所以存取速度会比定长慢

相同点:
括号中的数字 都是表示存储最大字符长度

char使用频率更高


mysql会在存储数据时自动将数据末尾的空格去掉
如果必须要存空格 需要修改sql_mode 增加 PAD_CHAR_TO_FULL_LENGTH 意思是把空格当作有效数据


由于自动去除空格这个机制, 在使用等于符号= 和like时有区别:
select *from t1 where name = "yh "; =会自动去除空格
select *from t1 where name like "yh "; like不会自动去除空格
like 用于模糊匹配 使用%表示0或任意个任意字符 ,使用_表示一个任意字符。

=用于精准匹配。

日期和时间
year
time
date
datetime *****
timestamp *****
timestamp特点是:可以给null 自动输入当前时间 此特别之处:当这条记录被修改了会自动更新当前时间

枚举
enum 可以指定一堆字符串的值 在插入数据时 数据必须这堆字符串中的其中一个 ("男的","女的") 多选一


集合
set 可以指定一堆字符串的值 在插入数据时 数据必须这堆字符串中的其中一个或多个 ("男的","女的") 多选多

共同点:枚举和集合内的数据都是字符串类型

 


 

 

3.约束****
是一种对数据限制
已经学习过的 数据类型 unsigned无符号 字符串长度 浮点的长度


约束的作用是?
为了保证数据的正确性,完整性
例如要存储密码 char(20) 只限制了类型和长度, 无法保证数据的正确性

额外的约束
语法:
创建字段时指定约束
create table 表名称(字段名 类型(长度) 约束名称1 约束名称n,....)
后期修改的方式添加 约束
alter table 表名称 modify 字段名 类型(长度) 约束名称1 约束名称n,....

NOT NULL 非空约束----  限制该字段的值不能为空。
UNIQUE 唯一性约束-----  限制该字段的值是唯一的不能出现重复。
DEFAULT 默认值约束----- 如果插入数据时,没有输入指定该字段的值则使用默认值。
PRIMARY KEY 主键约束 -----限制该字段 不能为空 并且是唯一的, 可以唯一标识一条数据 。*****
FOREIGN KEY 外键约束----- 用来指向另一个表的主键。用于关联其他表。


每一个表都应该有一个主键 需要唯一标识, 否则可以可能出现完全相同的两个数据 无法区分。
UNIQUE 不能重复 但是可以为空 这样也不能唯一标识
UNIQUE NOT NULL 不能为空且唯一 可以唯一标识一条数据 书写顺序无所谓


UNIQUE NOT NULL 与 主键的区别
UNIQUE NOT NULL 不能被其他表引用 (不能作为其它表的外键)
UNIQUE NOT NULL 约束一个表中可以有多个 但是主键只能有一个



索引:用于加速查询。
InnoDB 中 索引是树形结构
为了提高查询效率 InnoDB为找一个不为空 且唯一的字段作为主键。
如果表中不存在这样的字段 会自动帮你建一个隐藏主键字段 但是无法提升查询效率

只要是使用innoDB 就应该为每个表指定一个非空 且唯一的字段
InnoDB阻止数据时 首先使用主键 如果没有主键 找一个非空且唯一 如果也没有 建一个隐藏字段


多字段联合主键: 不常用
学生表 stu_id course_id 做为联合主键
1 1 已有数据
1 2 可以插入
2 1 可以插入
1 1 不能插入
只有当两个字段都重复才算重复

当一个表中 由于业务需求没有一个非空且唯一的字段时 我们可以建一个新的字段专门作为主键
管理主键的值挺麻烦的 你得记录上一次的主键值
mysql可以帮你自动管理主键 auto_increment 自动增长
auto_increment 只能用于整型字段 并且该字段必须具备索引
所以 通常 主键都会加上auto_increment。

手动修改自动增长计数:
alter table 表名 auto_increment 新的值;
注意:如果新的值小于当前的最大值 是无效的

总结常用:通常建一个表就要建一个主键, 主键的类型通常是整型。即主键形式常为:id int PRIMARY KEY auto_increment。

 

insert 语句:
insert into 表名 values(值1,值n,....)
要求值的顺序、个数 必须与表字段完全对应
另一种写法
insert into 表名(字段名1,字段名n,....) values(值1,值n,....)
可以选择性得插入某些字段 要求值得顺序 必须与表名后面声明得字段一致

 


 

昨天遗留知识点:
存储引擎
发动机
汽油机
柴油机 柴油价格便宜 动力还强 噪音大 不完全燃烧

电机 加速快 噪音小 续航问题


一个产品或服务的核心部分称之为引擎
mysql的核心功能存取数据
mysql存储引擎就是负责存取数据那一段代码


早上小结
建表完整语句
数据类型
整数(长度) 显示宽度 与存取没有关系
char定长 varchar可变长
sql_mode 严格模式
存储引擎

posted @ 2018-11-20 21:30  timm_book  阅读(121)  评论(0)    收藏  举报