1.创建表的完整语法

2.字段类型

3.字符类型

4.日期类型

5.枚举与集合类型

6.约束条件

补充:

存储引擎分类:
不同的数据应该有不同的处理机制mysql存储引擎:
1.Innodb:默认存储引擎,查询速度较myisam慢,但是更安全
2.myisam:老版本用的存储引擎
3.memory:内存引擎(数据全部存在内存中)
4.blackhole:无论存什么,都立马消失(也称之为黑洞引擎)研究一下每个存储引擎存取数据的特点
查看所有引擎:show engines;            

一.创建表的完整语法

1.

创建表的完整语法 表名(

  字段名1 类型[(宽度) 约束条件],

  字段名2 类型[(宽度) 约束条件],

  字段名3 类型[(宽度) 约束条件]

);

注意:1.创建表的时候字段名和字段类型是必须写的,中括号内的参数都是可选参数2.创建同一张表的时候字段名是不能写重复的3.最后一个字段后面是不能加逗号的列子:
create table t1(id int,name char
);

2.宽度

宽度说的就是对存储数据的限制,比如说 char(1)只能存一个字符,

如果存的字符数超了,mysql他会自动帮你截取,你写的参数是多少就有几个字符。

1.插入的时候,mysql自动截取

2.但是要是按照严格模式,会直接报错

注意:
  使用数据库的准则:尽量让它少干活就尽量少干活,因为你如果存取的少的话倒是没事,

  但是要是操作的数据是以千万为单位的话,那么mysql会有崩溃的风险

3.如何设置严格模式

show variables like "%mode%";  # 查看数据库配置中变量名包含mode的配置参数
# 修改安全模式
set session # 只在当前操作界面有效
set global  # 全局有效
set global sql_mode ='STRICT_TRANS_TABLES'
# 修改完之后退出当前客户端重新登陆即可

4.该如何避免不能插空

alter table 数据表名 modify name char not null;
not null该字段不能插空

总结:创建表的最终格式

最终的格式:create table 表名 (列1 列属性 [是否为null 默认值],列2 列属性 [是否为null 默认值],.....列n 列属性 [是否为null 默认值])engine = 存储引擎  charset = 字符集最终的例子:create table t4 (id  int auto_increment primary key, name char(32)  not null  default '',pwd  char(32)  not null  default '')engine=Innodb charset=utf8;

二.字段类型

数据类型分为:整型,浮点型

1.整型

smallint ,tinyint ,int ,bigint

                tinyint : 范围:  有符号: -128到127无符号: 0 到 255  unsignedsmallint范围:  有符号: -32768到32767无符号: 0 到 65535  unsignedmediumint范围:  有符号: -8388608到8388607无符号: 0 到 16777215  unsignedintbigint区别: a. 取值范围不一样, 根据自己公司的业务来去选择b. 无符号和有符号的意思5535 unsigned  

unsigned 无正负符号

总结:char后面的数字是用来限制存储数据的长度的特例:只有整型后面的数字不是用来限制存储数据的长度,而是用来控制展示的数据的位数   int(8)够8位 或者 超8位 有几位存几位,不够8位空格填充

我们可以通过修改约束条件 不够8位的情况下,用0来填充zerofill 0填充多余的位数案例:

 1 验证整型字段有无符号及范围:
 2 create table t1(x tinyint);
 3 insert into t1 values(128),(-129);
 4
 5 create table t2(x tinyint unsigned);
 6 insert into t2 values(-1),(256);
 7
 8 create table t3(x int unsigned);
 9 insert into t3 values(4294967296);
10
11 疑问:**类型后面的宽度能否改变字段存储的大小限制
12 create table t4(x int(8));
13 insert into t4 values(4294967296123);
14
15 # 显示时,不够8位用0填充,如果超出8位则正常显示
16 create table t5(x int(8) unsigned zerofill);
17 insert into t5 values(4294967296123);
18
19 # create table t6(id int(10) unsigned);
20 # create table t7(id int(11));

View Code

强调:  对于整型来说,数据类行后的宽度并不是存储限制,而是显示限制,所以在创建表的时候,

如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据。

只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据

 

严格模式补充:

%匹配任意多个字符
_匹配任意一个字符

 1 我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
 2
 3 like 是关键字
 4
 5 show variables like "%mode%";  # 查看数据库配置中变量名包含mode的配置参数
 6 # 修改安全模式
 7 set session # 只在当前操作界面有效
 8 set global  # 全局有效 终生有效
 9
10 set global sql_mode ='STRICT_TRANS_TABLES'
11 # 修改完之后退出当前客户端重新登陆即可

View Code

2.浮点型

float ,double ,decimal

 1     float(255,30)  总共255位 小数部分占30位
 2         double(255,30) 总共255位 小数部分占30位
 3         decimal(65,30) 总共65位 小数部分占30位
 4
 5         create table t12(id FLOAT(255,30));
 6         create table t13(id DOUBLE(255,30));
 7         create table t14(id DECIMAL(65,30));
 8
 9
10         insert into t12 values(1.111111111111111111111111111111);
11         insert into t13 values(1.111111111111111111111111111111);
12         insert into t14 values(1.111111111111111111111111111111);
13
14         精确度
15         float < double < decimal

View Code

三.字符类型

分别为:char (定长),varchar(变长)char(4)#最大只能存取四个字符,超出来会直接报错,如果少了,会自动用空格填充
varchar(4)#最大只能存四个字符,超出来回直接报错,如果少了,有几个就会存几个

查看存储了几个字符:char_lenght()
select char_length(字段) from 表名但是有一个问题:我存了2个字符,char自动用空格给我补充了,但是我一起出来就又会变为2个了,这是为什么。解:因为mysql在存储char类型字段的时候,硬盘上确确实实存的是固定长度的数据,但是取出的那一瞬间,mysql会自动将填充的空格去除了但是本着能让mysql少干事就少干事,我们可以通过严格模式来修改机制,让其不做自动去除处理。
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
# 退出客户端重新登陆

那么char 和 varchar有什么区别:

char(定长)
    1.浪费空间
因为他的长度是固定好的,比如说你写个32,但是你只存了2个,那么其他30个空间就都被空格填充浪费了2.存取速度快
因为不管你存了多少,直接通过给的参数是多少就是多少来查,内部不在需要通过计算,你存了多少字符    varchar(变长)1.节省空间
因为它不会填充空格,你存几个数据,就是几个。2.存取熟读慢(只是相比于插入比较慢)
存的时候 需要给数据讲一个记录长度的报头
取的时候 需要先读取报头才能读取真实数据总结:char:取的时候方便,直接按固定的长度取即可   varchar:取的时候比较繁琐了 无法知道数据到底多长

总结:详细请看

 1 create table t10(name char(4))  # 超出四个字符报错,不够四个字符空格补全
 2 create table t11(name varchar(4))  # 超出四个字符报错,不够四个有几个就存几个
 3
 4 # 验证存储限制
 5 insert into t12 values('hello');
 6 insert into t13 values('hello');
 7 # 验证存储长度
 8 insert into t12 values('a'); #'a    '
 9 insert into t13 values('a'); #'a'
10 select * from t12
11 select * from t13  # 无法查看真正的结果
12
13 select char_length(name) from t12
14 select char_length(name) from t13  # 仍然无法查看到真正的结果
15
16 """首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
17 # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
18 set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
19 # 退出客户端重新登陆
20 select char_length(x) from t12; #4
21 select char_length(y) from t13; #1
22
23 # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格
24
25
26 """
27 char与varchar的使用区别
28 """
29 name char(5)
30 # 缺点:浪费空间
31 # 优点:存取速度都快
32 egon alex lxx  jxx  txx
33
34 name varchar(5)
35 # 缺点:存取速度慢
36 # 优点:节省空间
37 1bytes+egon 1bytes+alex 1bytes+lxx  1bytes+jxx  1bytes+txx 

View Code

四.日期类型

日期类型分为:

date :2019-05-01

datetime :11:11:11

year :2019-01-02 11:11:11

time:2019

案例:

1 create table student(
2     id int,
3   name char(16),
4   born_year year,
5   birth date,
6   study_time time,
7   reg_time datetime
8 );
9 insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');

View Code

五.枚举与集合类型

枚举(enum,多个选一个):限制某个字段能够存储的数据内容

集合(set,多个可以选一个,也可以选多个):限制某个字段能够存储的数据内容

案例:

 1 create table user(
 2     id int,
 3   name char(16),
 4   gender enum('male','female','others')
 5 );
 6 insert into user values(1,'jason','xxx')  # 报错
 7 insert into user values(2,'egon','female')  # 正确!
 8
 9
10 create table teacher(
11     id int,
12   name char(16),
13   gender enum('male','female','others'),
14   hobby set('read','sleep','sanna','dbj')
15 );
16 insert into teacher values(1,'egon','male','read,sleep,dbj')  # 集合也可以只存一个

View Code

六.约束条件

1.唯一索引 和 联合唯一索引

not null 不能为空
default 给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)
create table t17(id int,name char(16) default 'jason');    往表中插入数据的时候  可以指定字段进行插入 不需要全部都插
insert into t17(name,id) values('egon',2);1.unique 唯一
单列唯一:限制某一个字段是惟一的
比如说可以把id设置为唯一,就是id不能重复
create table user1(id int unique, name char(16)
);
insert into user1 values(1,'jason'),(1,'egon')  # 报错
insert into user1 values(1,'jason'),(2,'egon')  # 成功2.unique(字段名,字段名)联合唯一索引
表示2个字段在一起的数据必须是惟一的
create table server(id int,ip char(16),port int,unique(ip,port)
)
insert into server values(1,'127.0.0.1',8080);
insert into server values(2,'127.0.0.1',8080);  # 报错
insert into server values(1,'127.0.0.1',8081);

2.primary key 主键

限制效果跟 not null  加 unique 组合的效果是一样的,不能为空而且是惟一的
create table t18(id int primary key);

那么为什么需要索引:primary key也是innodb引擎查询必备的索引索引你就把当成书的目录,可以加快查询的速度强调:一张表里必须需要一个主键
1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
那么主键到底设置给谁了:
你只要记住通常每张表里都会有一个id的字段,并且应该将id设置为表的主键字段什么是联合主键:
就是多个字段联合起来作为一个表的一个主键,但是本质还是一个主键
ps:innodb引擎中一张表只有一个主键,引擎不要写默认为innodb引擎每次还要标序号不觉得很麻烦么:主键字段应该具备自动递增的特点每次添加数据的时候,不需要用户手动输入:auto_increment 自动递增create table t21(id int primary key auto_increment,name varchar(16));

详细解释:

 1 # 单从约束角度来说primary key就等价于not null unique
 2 create table t11(id int primary key);
 3 desc t11;
 4 insert into t11 values(1),(1);  # 报错
 5 insert into t11 values(1),(2);
 6
 7 # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
 8 """
 9 强调:
10 1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
11 """
12 create table t12(
13     id int,
14   name char(16),
15   age int not null unique,
16   addr char(16) not null unique
17 )engine=innodb;
18 desc t12;
19 """
20 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
21 索引:类似于书的目录,没有主键就相当于一页一页翻着查
22 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
23 """
24 # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
25 create table t18(
26     ip char(16),
27   port int,
28   primary key(ip,port)
29 );
30 desc t18;
31
32 # 主键id作为数据的编号,每次最好能自动递增
33 create table t13(
34     id int primary key auto_increment,
35   name char(16)
36 );
37 insert into t13('jason'),('jason'),('jason');  # id字段自动从1开始递增
38 # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

View Code

补充:

delete from tb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
delete from tb1 where id > 10;如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录

转载于:https://www.cnblogs.com/zahngyu/p/11378215.html

mysql数据库 day02相关推荐

  1. 【Bootstrap4前端框架+MySQL数据库】前后端综合实训【10天课程 博客汇总表 详细笔记】【附:所有代码】

    目   录 日常要求.项目要求 用到的软件版本情况说明 上课时的所有代码.用到的软件安装包 实训第2周--前后端"新闻管理系统"工程所有文件(MySQL语句+eclipse项目) ...

  2. 《Mysql数据库》

    一.MySql(MariDB) 学习数据库主要学习的是如何对数据进行增删改查操作. Mysql菜鸟教程:[https://www.runoob.com/mysql/mysql-tutorial.htm ...

  3. MySQL数据库学习教程,从0到入门

    mysql day01课堂笔记 1.什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么? 数据库:英文单词DataBase,简称DB.按照一定格式存储数据的一些文件的组合.顾名思义 ...

  4. MySQL数据库学习笔记,知识点和案例整理,期末三天复习完【简单且详细】

    MySQL数据库近三万字学习笔记,超级详细! 文章目录 前言 一.day1 二.day2 三.day3 前言 MySQL数据库知识点和案例总结,非常详细,将近三万字!分成了三天去消化吸收! 一.day ...

  5. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  6. MySQL数据库+命令大全+常用操作

    格式:mysql -h主机地址 -u用户名 -p用户密码 1. 例:连接到本机上的MYSQL 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示 ...

  7. mysql数据库是一个软件呐_15款好用的mysql管理软件

    1. Induction Induction是一款用于理解数据关系的开源管理工具,它可用来探索行/列,运行查询和数据可视化等方面.该工具支持多种数据库,包括PostgreSQL,MySQL,SQLit ...

  8. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  9. C语言对mysql数据库的操作

    C语言对mysql数据库的操作 原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎 ...

最新文章

  1. 深入掌握JMS(一):JMS基础
  2. 实现不同域(Domain)之间的数据交换(转)
  3. linux的命令行操作和shell的区别
  4. 网站推广——网站推广专员如何提升新站权重?
  5. 076_浏览器对象模型
  6. 任务分配算法c语言,基于蚁群算法多Agent任务分配方法.pdf
  7. 所谓工作能力强,就看这5件事
  8. java两种不同单例模式_关于Java里的两种单例模式
  9. MySQL 操作 —— group by(按组)
  10. Nhibernate(1)续
  11. github代理地址
  12. 【SEO实验室】使用百度SEO排名点击软件快速提升排名
  13. 无法解析该名称 outlook必须处于联机,控制面板删除账户
  14. Oracle数据库系统结构一(存储结构)
  15. Spring boot的特性与四大核心
  16. dilated(dilated cardiomyopathy)
  17. 深入浅出Java Object Layout (JOL)
  18. Android系统USB读卡器
  19. Jetpack-Compose之三附带效应(副作用)
  20. 实战案例,手把手教你使用 Tableau 绘制超炫酷可视化图表

热门文章

  1. Linux(Ubuntu)内存查询top命令详解
  2. 大数据技术周报第 009 期
  3. Centos7安装MariaDB10.28稳定版
  4. 个人家用nas_期待已久终于来了!绿联推出NAS私有云,填补爆发式存储需求
  5. leetcode —— 面试题 04.03. 特定深度节点链表
  6. 【指数机制代码实现】差分隐私代码实现系列(十)
  7. Django--模板语言
  8. Linux学习笔记5
  9. STM32 - 定时器的设定 -高级- 08 - One-pulse mode - 触发波的实现 - 可变长度和相位
  10. python 聚类_聚类算法中的四种距离及其python实现