再熟悉一下Mysql库、表、记录的基本操作。
库 增 create database userinfo1 charset utf8; 查 show databases; show create database userinfo1; 改 alter database userinfo1 charset gbk; 删 drop userinfo1; 表 use useronfo1 (切换到userinfo数据库下) 增 create table msg1 (id int,name char); 查 show tables; show create table msg1; desc msg1; 改 alter table msg1 modify name char(6); 删 drop table msg1; 记录 增 insert into msg1 values (1,'jason'); insert into msg1 values(2,'egon'),(3,'kevin'),(4,'tank'); 查 select * from msg1; select name from msg1; select * from msg1 where id > 1 and id < 3; 改 update msg1 set name = 'DSB' where name = 'egon'; 删 delete from msg1 where name = 'DSB';
存储引擎
不同的应用软件处理不同类型的数据 Mysql 5.5版本及以上默认的存储引擎是innodb innodb:支持行锁表锁,外键,事物,安全性更高,较myisam数据更安全 memory:内存引擎,将所有的数据直接放在内存,一旦断电数据全部消失 blackhole:一切存入其中的数据都会消失 create table msg1(id int ,name char (16))engine = innodb;
一 、 创建表的完整语法:
#语法:
create table 表名(
字段名1 类型[ (宽度) 约束条件 ],
字段名2 类型[ (宽度) 约束条件 ],
字段名3 类型[ (宽度) 约束条件 ]
);
#在创建的时候有三点需要注意的地方
1、在一张表内字段名不能重复
2、字段和类型是必须要有的,而宽度和约束条件是可选的
3、最后一个字段后面不能加逗号
#宽度:对存储数据的限制
create database day38;
use day38;
create table t1(name char);
insert into t1 values('jason');
#1.能够成功但是显示的时候只显示一位(mysql默认是一位)
#2.第二种情况,直接报错
select * from t1;
#约束条件
create table t2(name char(16) not null);
#字段类型与约束条件之间的关系
字段类型限制的是存储数据的类型
约束条件是基于字段类型之上的附加的额外限制
二 、 整形(表)
分类:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:年龄,等级等信息
TINTINT默认有正负号
create table t3(id tinyint);
create table t4(id tinyint unsigned); # unsigned 为“无符号”的意思
int类型
create table t5(id int);
alter table t5 modify id int unsigned;
#给整形设置宽度
特例:唯独整形字段在设置宽度的时候,限制不是存储宽度而是显示宽度
creat table t6(id int(8)); #如果存入的数字够8位则正常显示,如果不够8位默认用空格填充
用0填充:create table t7(id int(8) zerofill);
在创建整形字段的时候,不需要指定字段宽度(整形的显示宽度)
like模糊查询
%:匹配任意数量的任意字符
_:匹配单个数量的任意字符
show variables like '%mode%';
#设置严格模式
set session:当前窗口下有效
set global:全局有效,终生受用!
set global sql_mode = ‘STRICT_TRANS_TABLES’;
#设置完成后需要退出客户端,重新登录客户端即可,不需要重启服务端
三 、 浮点型
分类:
float
double
decimal
作用:薪资,体重,身高
浮点类型(5,3) #总长度为5,其中小数占3位,整数占2位
float (255,30)
double (255,30)
decimal (65,30)
三者区别:
精度由低到高
float
double
decimal
create table t10(id float(255,30));
create table t11(id double(255,30));
create table t12(id decimal(65,30));
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);
insert into t12 values(1.111111111111111111111111111111);
四、 字符类型
char :定长
varchar :变长
create table t13(name char(4)); #name 字段固定存储四个长度,如果超了直接报错,如果不够默认用空格填充
create table t14(name varchar(4)); #name字段如果超了直接报错,如果不够按实际长度存储
insert into t13 values('a'); 'a '
insert into t14 valuse('a'); 'a'
char_length(name) #统计字段值所对应的长度
select char_length(name) from t13;
select char_length(name) from t14;
#这个是修改操作
set global sql_mode =' strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';
char VS varchar
char(4)定长
优点:存取速度都快,简单粗暴
缺点:浪费空间
varchar(4)变
给varchar类型的数据自动加上报头用来标识数据的长度
报头通常占1~2bytes
缺点:存取速度都慢
优点:节省空间
1bytes + egon 1bytes + jxx1bytes + lxx1bytes + oow
五 、日期类型
data年月日
time 时分秒
detetime 年月日时分秒
year 年
create table t15(
id int,
birth data,
class_time time,
reg_time detetime,
yy year
);
insert into t15 values(1,"2000-01-21","11:11:11","2019-01-21 11:11:11","2019");
六 、枚举与集合
枚举(enum):多选一
create table t16(
id int,
name char(6),
gender enum('male',;female','others')
);
insert into t16 values(1,'egon','xxx')
集合(set) :多选多(虽然是多选多,但是你仍然可以只选一个)
create table t17(
id int,
name char(6),
gender enum('male','female','others'),
hobby set('red','DJ','DBJ','run')
);
insert into t17 values(1,'tank','male','read,DBJ,DJ');
insert into t17 values(1,'tank','name','DBJ');
七 、约束条件
"""
primary key(pk) 标识该字段为该表的主键,可以唯一的标识记录
foreign key(fk) 标识该字段为该表的外键
not null 标识该字段不能为空
unique key(uk) 标识该字段的值是唯一的
auto_increment 标识该字段的值自动增长(整数类型,而且为主键)
default 为该字段设置默认值
unsigned 无符号
zerofill 使用0填充
"""
not null:限制字段不能为空
create table t20(id int,name char(4) not null);
default:设置字段默认值
create table t21(
id int,
name char(4),
gender enum('male','female','others')default 'male'
);
insert into t21 values(1,'egon'); #报错
insert into t21(id,name) values(1,'egon');
通常情况下not null 和default 是配合使用的
unique
某个字段对应的值在当前表中是唯一的
#单列唯一
create table t22(
id int unique, #单个地段
name char(16)
);
insert into t22 values(1,'egon'),(1,'tank');
服务器ip和port
#联合唯一
create table t23(
host char(16),
port int,
unique(host,port) #多个字段
);
insert into t23 values('127.0.0.1',8080),('127.0.0.1',8081);
insert into t23 values('127.0.0.1',8080),('127.1.1.1',8080);
insert into t23 values('127.0.0.1',8080),('127.0.0.1',8080);
primary key
九 、主键
单从限制条件上来说,它就相当于not null + unique 非空且唯一
crearte table t26(
id int primary key,
name char(16)
)engine = innodb;
innodb 引擎中,所有的表都必须有且只有一个主键,它是innodb 引擎用来组织数据的依据
强调(******)
1、一张表中必须有且只有一个主键,如果你没有设置主键,
那么会从上到先搜索知直到遇到一个非空且唯一的字段自动将其设置为主键
create table t25(
id int,
name char(16),
arg int not null unique
)engine = innodb;
desc t25;
2、如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,
隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
索引:类似于书的目录,没有主键相当于一页一页翻着查
3、一张表中通常都应该有一个id字段,并且通常将改id字段改成主键
auto_increment:自增
create table t27(
id int primary key auto_increment,
name char(16)
);
# 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
create table t28(
ip char(16),
port int,
primary key(ip,port)
);
desc t28;
这里补充一点:
delete from tb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
delete from tb1 where id > 10;
如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录