Linux中MySQL的数据类型

数据类型
数值类型
#整型
TINYINT: 1 字节,范围为 -1281270255。
SMALLINT:2 字节,范围为 -3276832767065535。
MEDIUMINT:3 字节,范围为 -83886088388607016777215。
INT:4 字节,范围为 -2147483648214748364704294967295。
BIGINT:8 字节,范围为 -92233720368547758089223372036854775807018446744073709551615#浮点数型
FLOAT:4 字节,单精度浮点数,范围为 -3.402823466E+38 到 -1.175494351E-38,0,1.175494351E-38 到 3.402823466E+38。
DOUBLE:8 字节,双精度浮点数,范围为 -1.7976931348623157E+308 到 -2.2250738585072014E-308,0,2.2250738585072014E-308 到 1.7976931348623157E+308。
DECIMAL:变长的精确数值,支持 65 位整数位和 30 位小数位。
字符串类型
#CHAR系列
CHAR:定长字符串,最大长度为 255 个字符。
VARCHAR:变长字符串,最大长度为 65535 个字符。
#BINARY系列 
BINARY:定长二进制字符串,最大长度为 255 个字节。
VARBINARY:变长二进制字符串,最大长度为 65535 个字节。空间会变小。
TEXT:变长字符串,最大长度为 65535 个字符。
BLOB:变长二进制字符串,最大长度为 65535 个字节。
#枚举
ENUM:枚举类型,最多可以包含 65535 个值之一。
#集合
SET:集合类型,最多可以包含 64 个值之一。
时间日期类型
DATE:日期,格式为 'YYYY-MM-DD'。
TIME:时间,格式为 'HH:MM:SS'。
DATETIME:日期和时间,格式为 'YYYY-MM-DD HH:MM:SS'。
TIMESTAMP:自动存储记录插入或更新的日期和时间,格式为 'YYYY-MM-DD HH:MM:SS'

测试

整数型
#tinyint(有符号型最大值127),int(有符号型最大值2147483647)超过最大值无法写入数据库
作用:用于存储用户的年龄、游戏的Level、经验值等。
mysql> create database db1;
mysql> use db1;
mysql> create table test1( 
    -> tinyint_test tinyint,
    -> int_test int
    -> );
desc test1;
insert into test1 values (111,111);
insert into test1(int_test) values(2147483647);

#insert into test1(tinyint_test) values(  );
#insert into test1(int_test) values(2147483648);
#测试结果,默认有符号,超过存储范围出错。

#无符号整型测试
mysql> create table test2(
    -> tinyint_test tinyint unsigned, 	#约束条件unsigned限定只能存正值(无符号)
    -> int_test int unsigned
    -> );
#insert into test2 values(-20,-20);

#测试整数类型的显示宽度(int不限制宽度)
mysql> create table t1 (
    -> id1 int,
    -> id2 int(6)
    -> );
insert into t1 values(1,1);
SELECT * from t1;

mysql> create table t2 (
    -> id1 int zerofill,
    -> id2 int(6) zerofill
    -> );
insert into t2 values(2,2);
SELECT * from t2;
insert into t2 values(3,2222222);	#插入大于宽度限制的值,仍然可以存储
SELECT * from t2;
#整型的宽度仅为显示宽度,不是限制。因此建议整型无须指定宽度。

浮点数型
作用:用于存储用户的身高、体重、薪水等
浮点数和定点数都可以用类型名称后加(M,D)的方式来表示,(M,D)表示一共显示M位数字(整数位
+小数位),其中D位于小数点后面,M和D又称为精度和标度。
#float表示的精度大约是7位
create table test4(float_test float(5,2));		#一共5位,小数占2位
insert into test4 values (10.2), (70.243), (70.246), (70.245);
SELECT * from test4;
#insert into test4 values (1111.2);
#可以观察到,超出表示的范围,MySQL在保存值时会进行五舍六入,整数超出范围报错

create table t111(FROM1 float,FROM2 float(10,2));
insert into t111 values(123.123,12345678.90);
SELECT *  from t111;
#如果数据精度丢失,那么浮点型是按照五舍六入的方式进行计算
#insert into t111 values(123.12345678,123456789.90);
#超出范围报错
insert into t111 values(123.12345678,99999999.99);
SELECT *  from t111;
#double(精度较高,更精确)精度有15位左右
mysql> create table t112(
    -> FROM1 double,
    -> FROM2 double(10,2)
    -> );
insert into t112 values(123.12345678,99999999.99);
SELECT * from t112;
#定点数decimal测试(精度最高)支持最大位数m为65。支持小数大位数d是30
create table test17(id int,a float(10,8),b decimal(10,8));
insert into test17 values (100,23.12345612,23.12345612);
SELECT *  from te17;
时间日期测试
#作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
#year、date、time、datetime、timestamp
mysql> create table test_time(
    -> d date,
    -> t time,
    -> dt datetime
    -> );
desc test_time;
SELECT now();
insert into test_time values(now(),now(),now());
SELECT * from test_time;

#timestamp
 create table d(name char(20),time timestamp);
 insert into d values("laowang",null);
 SELECT *  from d;
 
 
#注意事项:
其它的时间,按要求插入
插入年份时,尽量使用4位值
插入两位年份时,<=69,以20开头,比如65,  结果2065 >=70,以19开头,比如82,结果1982
mysql> create table t3(born_year year);
desc t3;
insert into t3 values(12),(80);
SELECT * from t3;
字符型
作用:用于存储用户的姓名、爱好、发布的文章等
CHAR     列的长度固定为创建表时声明的长度: 0 ~ 255
VARCHAR  列中的值为可变长字符串,长度: 0 ~ 65535

注:在检索的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格

BINARY 和 VARBINARY类似于CHAR 和 VARCHAR,不同的是它们包含二进制字符而不包含
非二进制字符串

===ENUM类型即枚举类型、集合类型SET测试
字段的值只能在给定范围中选择
常见的是单选按钮和复选框
enum  单选	  只能在给定的范围内选一个值,如性别 sex 男male/女female
set   多选    在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
表school.student3											                
姓名	name	varchar(50)									            
性别	sex		enum('m','FROM')							                    
爱好	hobby	set('music','book','game','disc')	
#CHAR、VARCHAR
mysql> create table vc (
    -> v varchar(4),
    -> c char(4)
    -> );
desc vc;
insert into vc values('ab   ','ab   ');
SELECT * from vc;
SELECT length(v),length(c) from vc;
SELECT concat(v,'='), concat(c,'=') from vc;	#在后面加字符'=',看的更清楚

#BINARY、VARBINARY
create table binary_t (c binary(3));
insert into binary_t values ('10');

create table binary_d (c varbinary(3));
insert into binary_d values ('10');
SELECT length(c) from binary_t WHERE c=10;
SELECT length(c) from binary_d WHERE c=10;


#ENUM类型即枚举类型、集合类型SET测试
use school
mysql> create table student3(
    -> name varchar(50),
    -> sex enum('m','FROM'),
    -> hobby set('music','book','game','disc')
    -> );
desc student3;
insert into student3 values('tom','m','book,game');
SELECT * from student3;
#insert into student3 values ('jack','m','play');
show create table student3\G
约束
约束条件						      说明
NULL				标识是否允许为空,默认为NULL。
NOT NULL			标识该字段不能为空,可以修改。
UNIQUE KEY  (UK)	标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
DEFAULT				为该字段设置默认值
UNSIGNED			无符号,正数
PRIMARY KEY (PK)	标识该字段为该表的主键,可以唯一的标识记录,不可以为空
AUTO_INCREMENT		标识该字段的值自动增长(整数类型,而且为主键)
UNIQUE + NOT NULL
FOREIGN KEY (FK)	标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联
#not null default例子
create table t7 (id int not null default 8);
desc t7;
insert into t7 values();
SELECT *  from t7;
insert into t7 values(NULL);

#auto_increment例子 
自增键,每张表只能一个字段为自增
create table t8(id int unique auto_increment,name char(10));
desc t8;
insert into  t8 (name) values("newrain");
SELECT *  from t8;
insert into  t8 (name) values("ehome");
SELECT *  from t8;

#default例子:
create table student4 (
id int not null,
name varchar(50) not null,
sex enum('m','FROM') default 'm' not null,
age int unsigned default 18 not null,
hobby set('music','disc','dance','book') default 'book,dance'
);
desc student4;
insert into student4 values (1,'jack','m',20,'book');
SELECT *  from student4;
insert into student4 (id,name) values (12,"newrain");
#insert into student4 values (3,NULL,'m',22,'book');不能为空
#unique例子      unique(key)    唯一的
第一种写法:
create table department1(
dept_id INT,
dept_name varchar(30) unique,
comment varchar(50)
);
第二种写法:    
create table department1(
dept_id INT,
dept_name varchar(30) unique,
comment varchar(50),
UNIQUE(dept_name)
);
desc department1;
insert into department1 values (1,'zhangsan','yyy');
#insert into department1 values (1,'zhangsan','yyy');不能重复
insert into department1 values (1,'wangsi','yyy');

#primary key(key)
每张表里只能有一个主键   
不能为空,而且唯一   
use db1;
create table t7(hostname char(20) primary key,ip char(150));
create table t9(hostname char(20),ip char(150),primary key(hostname));
alter table t7  drop  primary key; #删除主键

#联合主键(有一个主键不一样即可)     
create table t10(hostname char(20),ip char(150),primary key(hostname,ip));
insert into t10 values ("hah","ksk");
#insert into t10 values ("hah","ksk");重复
insert into t10 values ("hah","ks");
insert into t10 values ("ha","ks");

#索引和外键(拓展)
index(key)
索引   优化查询速度
create table t105(hostname char(20) primary key,ip char(150),index dizhi(ip));	#添加索引到列名ip,索引名为dizhi
create index dizhi on t105(ip);	#单独创建索引
drop index dizhi on t105;		#删除index索引
alter table t101  drop index dizhi;   #删除index索引

#外键foreign key (key)
create table t1(id int,manager char(10) primary key) engine = innodb;
create table t2(id int,admin char(10),foreign key (admin) references  t1 (manager)) engine = innodb;

数据操作DML

在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据
的插入、DELETE实现数据的删除以及UPDATE实现数据的更新。
更新数据   insert
更新数据   update
删除数据   delete
插入数据INSERT
1. 插入完整数据(顺序插入)
	语法一:
	INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES (值1,值2,值3…值n);

	语法二:
	INSERT INTO 表名 VALUES (值1,值2,值3…值n);

2. 指定字段插入数据
	语法:
	INSERT INTO 表名(字段2,字段3…) VALUES (值2,值3…);

3. 插入多条记录
	语法:
	INSERT INTO 表名 VALUES
		(值1,值2,值3…值n),
		(值1,值2,值3…值n),
		(值1,值2,值3…值n);
		
4. 插入查询结果
	语法:
	INSERT INTO 表1(字段1,字段2,字段3…字段n) 
					SELECT (字段1,字段2,字段3…字段n) FROM 表2
					WHERE …;

#例子:
create table student7(id int,name varchar(20),sex enum('m','FROM'),age int(2));
desc student7;
insert into student7 values(1,'jack','m',20);	#顺序插入数据
insert into student7(name,age) values('bob',21);	#指定字段插入数据
insert into student7 values(6,'jex','m',21),(7,'bob1','FROM',22);	#插入多条记录

#插入查询结果:
create table student_his(id int,name varchar(20),sex enum('m','FROM'),age int(2));
insert into student_his SELECT * from student7 WHERE name = 'bob';	#插入查询结果
insert into student_his  SELECT * from student7 WHERE age > 17;	#插入符合条件的

更新数据update
语法:
	UPDATE 表名 SET 字段1=值1,字段2=值2  WHERE CONDITION;

#示例:
update student7 set id=8;	#修改全部
SELECT * from student7;
update student7 set id=9 WHERE name+"bob1";	#指定条件
SELECT * from student7;
update student7 set id=10,name="newrain" WHERE name="bob1";
SELECT * from student7;

删除数据delete
语法:
	DELETE FROM 表名 
		WHERE CONITION;
#示例:
DELETE FROM mysql.user WHERE authentication_string=’’;

#delete from 表名 WHERE 条件;
delete from student7 WHERE name="jack";

#delete from 表名; //删除表的全部数据
delete from student7;
SELECT * from student7;

#从磁盘抹除数据,大量数据时使用 有外键需要先删除外键再删除表
truncate 表名;

alter 尽量不要在高峰区使用否则服务器会变慢

你可能感兴趣的:(linux,mysql,adb,运维,服务器)