MySQL----操作,数据类型,表约束
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL----操作,数据类型,表约束相关的知识,希望对你有一定的参考价值。
操作,数据类型,表约束
1)操作
注意: mysql 建议我们关键字使用大写,但是不是必须的
①库操作
数据库创建,字符集及校验规则
创建数据库:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:
- [DEFAULT] CHARACTER SET charset_name #指定数据库采用的字符集
- [DEFAULT] COLLATE collation_name #指定数据库字符集的校验规则
例如:
create database db1 charset=utf8 collate utf8_general_ci;
创建一个使用utf字符集,并带校对规则的 db1 数据库
显示创建语句:
show create database [数据库名];
其中:
- 数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字
- /*!40100 default… */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话
查看系统默认字符集以及校验规则:
show variables like 'character_set_database';
show variables like 'collation_database';
查看数据库支持的字符集:
show charset;
注意:
- 校验规则使用utf8_ general_ ci[不区分大小写]
- 校验规则使用utf8_ bin[区分大小写]
例子
:向两个数据库分别建表插入a A b B
使用:utf8_ general_ ci
- 查询语句:
select * from person where name='a'
; 打印 a A- 排序语句:
select * from person order by name;
打印 a A b B使用:utf8_ bin
- 查询语句:
select * from person where name='a';
打印 a- 排序语句:
select * from person order by name;
打印 A B a b
数据库操作
修改数据库:
ALTER DATABASE db_name[alter_spacification [,alter_spacification]...]
alter_spacification:
- [DEFAULT] CHARACTER SET charset_name
- [DEFAULT] COLLATE collation_name
数据库删除:
- 注意可以加上[if exists]选项:
DROP DATABASE [IF EXISTS] [数据库名];
数据库备份和恢复:(注意备份操作是system,恢复是mysql>)
mysqldump [-P3306] -u root -p [密码] [-B] 数据库名 > [数据库备份存储的文件路径及文件名]
- 备份某个表:
mysqldump -u root -p 数据库名 表名1 表名2 > [数据库备份存储的文件路径及文件名]
- 备份多个数据库:
mysqldump -u root -p -B 数据库名1 数据库名2 ... > [数据库备份存储的文件路径及文件名]
注意
:-P默认3306,密码不写之后会要求键入, -B选项如果未带,在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原
- 恢复:
source [数据库备份存储的文件路径及文件名];
查看连接情况:
show processlist;
②表操作
创建表
创建表:
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set [字符集] collate [校验规则] engine [存储引擎];
注意:
- field 表示列名
- datatype 表示列的类型
- character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准
- collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准
- engine 使用引擎
查看表结构:
注意:不同的存储引擎,创建表的文件不一样
- table3.frm:表结构
- table3.MYD:表数据
- table3.MYI:表索引
- table2.ibd: 表数据和索引的文件
表操作
注意:非常不建议修改表,一定提前定好
修改表:
插入数据:insert into [表名] values([字段],...),(...);
ALTER TABLE [表名] ADD (column datatype [DEFAULT expr][,column datatype]...);
添加字段
ALTER TABLE [表名] MODIfy (column datatype [DEFAULT expr][,column datatype]...);
修改字段
ALTER TABLE [表名] DROP (column);
删除字段
- 修改表名:
alter table [原表名] rename to [新表名];
to可省
- 修改列名:
alter table [表名] change [原列名] [新列名] varchar(60);
注意新字段需完整定义
- 删除表:
DROP [TEMPORARY] TABLE [IF EXISTS] 表名 [, tbl_name] ...
- 清除表中内容:
delete from [表名];
2)数据类型
在C语言中,超过数据范围会进行截断,而在MySQL中超过数据范围会直接报错,做到非常严谨,保证MySQL内的数据具有非常强的确定性和一致性,倒逼使用者正确输入数据,方便上层使用
MySQL的数据类型本质是一种约束
数据类型表
类型 | 数据类型 | 说明 |
---|---|---|
数值类型 | BIT (M) | 位类型。M指定位数,默认值1,范围1-64 |
数值类型 | TINYINT [UNSIGNED] | 带符号的范围-128~127,无符号范围0~255.默认有符号 |
数值类型 | BOOL | 使用0和1表示真和假 |
数值类型 | SMALLINT [UNSICNED] | 带符号是-2^15次方到2^15-1.无符号是2^16-1 |
数值类型 | INT _ [UNSIGNED] | 带符号是-2^31次方到2^31-1.无符号是2^32-1 |
数值类型 | BIGINT _ CUNSIGNED] | 带符号是-2^63次方到2^ 63-1.无符号是2^64-1 |
数值类型 | FLOAT [(M, D)] [UNSIGNED] | M指定显示长度,d指定小数位数,占用4字节 |
数值类型 | DOUBLE [(M, D)] [UNSIGNED] | 表示比float精度更大的小数,占用空间8字节 |
文本,二进制类型 | CHAR(size) | 固定长度字符串,最大255 |
文本,二进制类型 | VARCHAR (SIZE) | 可变长度字符串,最大长度65535 |
文本,二进制类型 | BLOB | 二进制数据 |
文本,二进制类型 | TEXT | 大文本,不支持全文索引,不支持默认值 |
时间日期类型 | DATE/DATETIME/TIMESTAMP | 日期类型(yyyy- mm-dd) (yyyy -mm-dd hh:m :ss) ,timestamp时间戳 |
string类型 | ENUM类型 | ENUM是一个字符串对象,其值来自表创建时在列规定中显示枚举的一列值 |
string类型 | SET类型 | SET是一个字符串对象,可以有零或多个值,其值来自表创建时 规定的允许的一列值。指定 包括多个set成员的set列值时各成员之间用逗号间隔开。这样set成员值本身不能包含逗号。 |
数值类型
类型 | 字节 | 最小(有符号/无符号) | 最大有符号/无符号 |
---|---|---|---|
TINYINT | 1 | -128 | 127 |
0 | 255 | ||
SMALLINT | 2 | -32768 (-2^15) | 32767 (2^15-1) |
0 | 65535 (2^16-1) | ||
MEDIUMINT | 3 | -8388608 | 8388607 |
0 | 16777215 | ||
INT | 4 | -2147483648 (-2^31) | 2147483647 (2^31-1) |
0 | 4294967295 (2^32-1) | ||
BIGINT | 8 | -9223372036854775808 (-2^63) | 9223372036854775807 (2^63-1) |
0 | 1 8446744073709551615 (2^64-1) |
BIT(M)
BIT(M)
:位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为1,bit按ASCII码显示
10并未显示,因为10的ASCII码值是不可显字符,66对应ASCII码值是B
例如bit(2)最多支持两位,即0-3,4会报错
TINYINT [UNSIGNED]
注意:
- 尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型
- 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的
FLOAT [(M, D)] [UNSIGNED]
float[(m, d)] [unsigned]
: M指定显示长度,d指定小数位数,占用空间4个字节
注意
:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在进行范围判断时会进行"四舍五入",在保存值时会进行“五舍六入”
其他取整方案
:0向取整(C语言) , 向上取整,向下取整
例如:
注意:需严格按照格式来写入数据,例如float(4,2)不能写为999.9但是可以写为9.999
对与float(4,2) unsigned
DECIMAL [(M, D)] [UNSIGNED]
decimal(m, d) [unsigned]
: 定点数m指定长度,d表示小数点的位数
float和decimal表示的精度不一样
float精度最多7位 ,decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10
CHAR(size)
char(size)
: 固定长度字符串,size是可以存储的长度,单位为字符,最大长度值可以为255
char(2) 表示可以存放两个字符,可以是字母或数字或中文字,但是不能超过2个, 最多只能是255 (gbk是两个字节一个字符(中文是字符),utf-8是3个字节一个字符)
VARCHAR (SIZE)
varchar(size)
: 可变长度字符串,size表示字符长度,最大长度65535个字节
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532(
参考string类的设计中的自动增容逻辑,同时必须有个size变量记录大小
)- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字
节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)
关于如何选择char和varchar
:
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
日期和时间类型
DATE/DATETIME/TIMESTAMP
date
:日期 ‘yyyy-mm-dd’ ,占用三字节
datetime
时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
timestamp
:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
注意
:插入时时间戳会自动带上,更新其他数据时也会自动更新时间戳
string类型
ENUM
enum
:枚举,“单选”类型;
enum('选项1','选项2','选项3',...)
;
插入字段的时候可以直接写选项也可以使用数字,1表示选项1,2表示选项2, …
SET
set
:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
插入字段的时候可以直接’选项1,选项2’多选也可以3(0011表示选择第一个和第二个选项)
集合查询:
find_in_set(sub,str_list)
:如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串
例如:select * from [tablename] where find_in_set('选项n', [set集合]);
3)表约束
NULL
空属性
:限制某一列是否可以为空(null / not null)
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算
null的值为null,且null不可以参与任何计算:
not null
关键字,在插入时没有为这列值插入数据会报错
DEFUALT
在设置非空后入未插入数据报错:ERROR 1364 (HY000): Field ‘name’ doesn’t have a default value没有默认值
默认值:
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值
注意
:只有设置了default的列,才可以在插入值的时候,对列进行省略
注意:在语义的角度:
- NOT NULL ->非空->不可能插入空值->不可能使用默认
- DEFUALT->默认->允许不给给列插入->如果没有,就默认
但是DEFUALT强于NOT NULL,在两者同时设置的时候not null无作用
COMMENT
列描述
:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解,一般写在最后面
通过desc [tablename]查看不到注释信息:
通过show create table [tablename] 可以看到:
zerofill
!!!数字类型后的()内是显示给用户的宽度(并不是该类型占用字节数)!!!
例如:直接写int默认位宽是11(符号多一位),int unsigned默认位宽为10
加上zerofill关键字:
hex函数验证:
primary key
主键
:primary key用来唯一
的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键
;主键所在的列通常是整数类型
如果设置了主键,约束体现在:
- 任何主键都不能重复,不能为空
- 一旦插入相同主键的值,MySQL就会出现主键冲突报错,终止运行,意味着只要插入到表中的数据,主键一定是不冲突的
主键一般是:
- 与业务无关的id
- 从众多具有唯-一性的属性中选择一个,作为主键(比如:学号)
创建的时候:
create table tt13 (id int unsigned primary key);
设置主键
追加主键:alter table [表名] add primary key(字段列表);
删除主键:alter table 表名 drop primary key;
通过主键筛选:select * from [表名] where id=[值];
复合主键
:只有复合主键内所有的列值都出现冲突,才算主键冲突
在创建的时候最后加上primary key(主键1,主键2)
auto_increment
auto_increment(自增长)
:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
自增长的特点
:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
索引:(后面博客详细说明)
(可以想象成书目录)在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中
一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,
可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以
找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的
特定信息- 自增长字段必须是整数
- 一张表最多只能有一个自增长
创建表时:
id int unsigned primary key auto_increment
unique
一张表中只能有一个主键,所以可以用唯一键解决表中有多个字段需要唯一性约束的问题,唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较
关于唯一键和主键的区别:
- 主键更多的是标识唯一性的,而唯一键更多的是保证在业务上,不要和别的信息出现重复
foreign key
外键用于定义主表和从表之间的关系
:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null
语义上的外键例子:
- 主表Class和从表Student
当我们不存在某个班级的时候,在学生表中插入一个不存在班级的学生,我们不想让他插入成功时,就需要用到外键约束
外键约束
:foreign key(字段名) references 主表(字段名);
以上是关于MySQL----操作,数据类型,表约束的主要内容,如果未能解决你的问题,请参考以下文章