数据类型
数值类型
TINYINT: 1 字节,范围为 -128 到 127 或 0 到 255。
SMALLINT:2 字节,范围为 -32768 到 32767 或 0 到 65535。
MEDIUMINT:3 字节,范围为 -8388608 到 8388607 或 0 到 16777215。
INT:4 字节,范围为 -2147483648 到 2147483647 或 0 到 4294967295。
BIGINT:8 字节,范围为 -9223372036854775808 到 9223372036854775807 或 0 到 18446744073709551615。
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:定长字符串,最大长度为 255 个字符。
VARCHAR:变长字符串,最大长度为 65535 个字符。
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'。
测试
整数型
作用:用于存储用户的年龄、游戏的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);
mysql> create table test2(
-> tinyint_test tinyint unsigned,
-> int_test int unsigned
-> );
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又称为精度和标度。
create table test4(float_test float(5,2));
insert into test4 values (10.2), (70.243), (70.246), (70.245);
SELECT * from test4;
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,99999999.99);
SELECT * from t111;
mysql> create table t112(
-> FROM1 double,
-> FROM2 double(10,2)
-> );
insert into t112 values(123.12345678,99999999.99);
SELECT * from t112;
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;
时间日期测试
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;
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')
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;
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;
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;
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外键)之间的关联
create table t7 (id int not null default 8);
desc t7;
insert into t7 values();
SELECT * from t7;
insert into t7 values(NULL);
自增键,每张表只能一个字段为自增
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;
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");
第一种写法:
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,'wangsi','yyy');
每张表里只能有一个主键
不能为空,而且唯一
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","ks");
insert into t10 values ("ha","ks");
index(key)
索引 优化查询速度
create table t105(hostname char(20) primary key,ip char(150),index dizhi(ip));
create index dizhi on t105(ip);
drop index dizhi on t105;
alter table t101 drop index dizhi;
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 student7 WHERE name="jack";
delete from student7;
SELECT * from student7;
truncate 表名;
alter 尽量不要在高峰区使用否则服务器会变慢