Mysql知识

Mysql知识

存储引擎

存储引擎就是如何存储数据,如何为存储数据建立索引和如何更新、查询数据等技术的实现方法,因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎可以称之为表类型(即存储与操作表的类型)

常见存储引擎:详情参考: https://www.cnblogs.com/linhaifeng/articles/7213670.html

1.innoDB存储引擎:支持事物,其设计目标主要面向联机事物处理的应用。

特点:行锁设计,支持外键,并支持类似oracle的非锁定读,即默认读取操作不会产生锁。

2.MyISAM存储引擎:不支持事物、表锁设计,支持全文索引。主要面向一些olap数。

3.NDB存储引擎:一个集群类型存储引擎。面向oltp数据库应用类型。

特点:高可用,高性能,高扩展性的数据库集群系统。

4.Memory存储引擎:数据都存放在内存中,数据库重启或崩溃,表中的数据会丢失。

5.Infobright存储引擎:是一个按列存储的第三方存储引擎。

6.NTSE存储引擎:网易内部开发使用的引擎。

7.BLACKHOLE:黑洞引擎,表中插入数据不会被记录。

windows使用存储引擎的方式:

使用存储引擎即在创建表时指定:

- create table t1(id int)engine=innodb;
- create table t2(id int)engine=myisam;
- create table t3(id int)engine=blackhole;
- create table t4(id int)engine=memory;

数据类型

建表的时候字段都有对应的数据类类型

整形

分类:tinyint , smallint, mediumint, int, bigint

应用场景:存储年龄、等级、id、各种号码等。。。

tinyint:默认由正负符号限制
   create table t2(id TINYINT);#创建表t2时更改其类型默认有正负符号限制。
   insert into t2 values(-129),(256);#插入数据默认最小-128,最大127多出的话以最大或最小值传入,最新版的则会报错不允许插入。
   create table t3(number tinyint unsigned);#创建表t3时更改其类型默认无正负符号限制
   insert into t3 values(-10); 插入数据为负值时新版会报错,旧版则为0
INT:默认最大展示的位数11位
   create table t4(id int);#创建表t4更改id数据类型位int
   insert into t4 values(-21474836483333),(2147483647333333);# 向太
   表传入数据不管正负最多为11位切最大值2147483647最小值-2147483648,超过按最大值或最小值传入,新版会报错。
   create table t5(id int(8));#int后跟数字并非限制显示数据的位数,而是8位以内由空格补全。超出则正常显示
   create table t6(id int unsigned zerofill);#创建t6表数据类型位无正负号,插入数据不满以0填充

 

img

浮点型

分类:float,double,decimal

应用场景:身高,体重,薪资

三者区别:

注意:字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数。
存储限制:
float(255,30)
  double(255,30)
       decimal(65,30)
create table t7(id float(255,30));
create table t8(id double(255,30));
create table t9(id decimal(65,30));

字符类型char与varchar

char:定长

create table t10(name char(4)); #超过四个字符会报错,不够四个字符空格补全。

varchar:不定长

ceate table t11(name varchar(4)); #超过四个报错,不足四个有几个存几个

char 与 varchar的比较

char:
   1.浪费空间
   2.存取速度快
   比如:char(6):tank,jason,sean都是6个字符
varvhar:
1.节省空间
   2.存取速度慢
   比如:varchar(6):1bytes+ tank ,1bytes + jason  #1+ 表示的1是用来存长度的

日期类型

分类:

date:2019-12-11
time:18:08:08
datetime:2019-12-11 18:08:08
year:2019

createtableteacher(id int,name varchar(16),bor_years year,work_time time,register_time datetime);
insert into teacher values(1,'tank','2019','2019-12-11','18:08:08','2019-12-11 18:08:08');

枚举与集合

分类:

枚举enum多选一

集合set多选一或多选多

枚举:
create table user(id int,name varchar(16),grent enum('male','female','others'));
insert into user1 vsalues(1,'sean','male'); #参数必须在表中
集合:
create table user2(id int,name varchar(16),grent enum('male','female','others'),hobbies set('read','sleep','play ball','run'));
#多选一
insert into user2 values(1,'tank','male','read');
#多选多
insert into useR2 values(2,'jason','female','read,sleep');#read,sleep必须连着写
select * from user2;
+------+-------+--------+------------+
| id   | name  | grent  | hobbies    |
+------+-------+--------+------------+
|    2 | jason | female | read,sleep |
+------+-------+--------+------------+

约束条件

约束条件就是对于数据库表插入数据时加以约束

primary key(PK)

create table user7(id int primary key);
insert into user7 values(1);
#primary key 除了约束之外,还是innodb引擎组织数据的语句,提升查询效率
#一张表必须要有一个主键,如果没有设置主键,会从上向下搜索,知道遇见第一个不为空的且唯一的字段自动设置为主键
create table user8(id int,name varchar(16),age int not null unique)engine = innodb;
#如果包里没有指定任何可以设置主键的字段,那innodb会采用自己默认的一个隐藏关键字作为主键,隐藏意味着查询你的时候通过这个加速查询。
#一张表中通常都应该有一个id字段,并且通常将id字段作为主键
#联合主键:多个字段联合起来作为一个主键,本质上还是一个主键。
create user9(id int, name varchar(16),primary key(id,name));
 desc user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | 0       |       |
| name  | varchar(16) | NO   | PRI |         |       |
+-------+-------------+------+-----+---------+-------+

 

标识该字段为该表的主键,主键可以是唯一的表示记录

foreign key(fk)

标识该字段为该表的外键

unique key(UK)

标识字段的值唯一

not null

标识字段不能为空

default

为该字段设置默认值

auto_increment

标识该字段的值自动增长(整理类型,并为主键)

create table user10(id int primary key auto_increment, name varchar(16));
insert into user10(name) values('tank');
select * from user10;
+----+------+
| id | name |
+----+------+
|  1 | tank |
+----+------+ 
#如果想自增从指定值开始,可插入第一条数据时先之低昂id值
insert into user10(id,name)values(10,'tank');
insert into user10(name)values('jak');
insert into user10(name)values('tom');
 select * from user10;
+----+------+
| id | name |
+----+------+
|  1 | tank |
| 10 | tank |
| 11 | jak  |
| 12 | tom  |
+----+------+
#注意:auto_increment通常加载在主键上,并且只能设置给primary key字段
delete from user10;
#delete删除表记录或者指定记录,但id不会重置为0
delete from user10 where id ='12';
insert into user10(name)values('jaks');
 select * from user10;
+----+------+
| id | name |
+----+------+
|  1 | tank |
| 10 | tank |
| 11 | jak  |
| 13 | jaks |
+----+------+
#要想清空id可使用trunca user10;
truncate user10;
    

zerofill

使0填充空格

设置严格模式:

# 查看数据库配置中变量名包含mode的配置参数:
show variables like "%mode%";
# 修改安全模式:
set session;  # 局部有效,只在你当前操作的窗口有效
set global session;  # 全局有效,永久有效
# 修改完之后退出当前客户端重新登录即可
set global sql_mode = 'STRICT_TRANS_TABLES';
原文地址:https://www.cnblogs.com/cyfdtz/p/12107972.html