码迷,mamicode.com
首页 > 数据库 > 详细

python全栈开发 * mysql数据类型 * 180829

时间:2018-08-29 21:53:38      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:create   har   授权   开发   精准   字符串存储   l数据库   标识   简单   

* 库的操作   (增删改查)
一.系统数据库
查看系统库命令 show databases
1.information_schema:
虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
2.performance_schema:
MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
3.myslq:
授权库,主要存储系统用户的权限信息
4.test:
MySQL数据库系统自动创建的测试数据库
二.创建数据库
1.求救语法: help create database;
2.创建数据库语法 CREATE DATABASE 数据库名 charset utf8;
3.数据库命名规则:
可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
最长128位
三.数据库相关操作
1.查看数据库 show databases;
2.查看当前库 show create database db1;
3.查看所在的库 select database()
4.选择数据库 use 数据库名
5.删除数据库 drop database 数据库名
6.修改数据库 alter database db1 charset utf8;
四 补充:
1.SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
(1)DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
(2)DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
(3)DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

* 表的操作
一.存储引擎
1.数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎
存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
2.在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的
3.MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎
二.mysql支持的存储引擎
查看所有支持的引擎 show engines\G;
查看正在使用的存储引擎 show variables like ‘storage_engine%‘;
1.InnoDB 存储引擎
2.MyISAM 存储引擎
3.Memory 存储引擎
4.BLACKHOLE 黑洞存储引擎
5.指定表类型/存储引擎的命令:
create table t1(id int)engine=innodb;# 默认不写就是innodb
小练习:
创建四张表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试
create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;
查看数据库中的文件:
(1).frm是存储数据表的框架结构
(2).ibd是mysql数据文件
(3).MYD是MyISAM表的数据文件的扩展名
(4).MYI是MyISAM表的索引的扩展名
(5)memory 在重启mysql或者重启机器后,表内数据清空
(6)blackhole 往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录.
三.表介绍:
表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段.
id,name,sex,age,birth称为字段,其余的,一行内容称为一条记录
四.创建表
语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
1.创建数据库
create database db2 (charset utf8; )可省略
2.使用数据库
use db2
3.创建表
create table a1(
id int,
name varchar(50)
age int(3)
);
4.插入表的记录
insert into a1 values
(1,"mj",18),
(2,"wu",28);
5.查询表的数据和结构
(1)查询表中的存储数据
select * from a1;
(2)查看a1表的结构
desc a1;
(3)查看表的详细结构
show create table a1\G;
6.复制表
(1)新创建一个数据db3 create database db3 charset utf8;
(2)使用db3 use db3
(3)既复制表结构,又复制记录create table b1 select * from db2.a1
(4)查看db3文件夹中的数据和表结构:select * from db3.b1;
7.如果只复制表结构,不要记录
#在db2数据库下新创建一个b2表,给一个where条件,条件要求不成立,条件为false,只拷贝表结构
create table b2 select * from db2.a1 where 1>5;
查看表结构 desc b2;
查看表结构中的数据,是空数据; select * from b2;
方法二:
create table b3 like db2.a1;
7.删除表:
drop table 表明;

*数据类型
引入:
存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的.
详细参考链接:http://www.runoob.com/mysql/mysql-data-types.html
一.mysql常用数据类型概括:
1.数字
整型:tinyint int bigint
小数:
float:在位数比较长的情况下不精准
double:在位数比较长的情况下不精准
decimal:精准 内部原理是以字符串形式去存;
2.字符串:
char(10) :简单粗暴,浪费空间,存取速度快
varchar:精准,节省空间,存取速度慢
sql优化:创建表时,定长(性别)的类型往前放,变长(地址 描述信息)的往后放
大于255个字符,超了就把文件路径存放到数据库中,(图片 视频数据库中只存路径或url).
3.时间类型 常用datetime
4.枚举类型和集合类型
二.数值类型
(一) 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT 默认有符号
作用:存储年龄,等级,id,各种号码等
1.tinyint[(m)] [unsigned] [zerofill]
小整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-128 ~ 127
无符号:
0 ~ 255
MySQL中无布尔值,使用tinyint(1)构造。
2. int[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-2147483648 ~ 2147483647
无符号:
0 ~ 4294967295
3.bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-9223372036854775808 ~ 9223372036854775807
无符号:
0 ~ 18446744073709551615
注意:
默认是有符号; [unsigned](可设置)
int类型后面的存储是显示宽度,而不是存储宽度
zerofill 用0填充 mysql> create table t4(id int(5) unsigned zerofill);
为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下
其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了
默认的显示宽度,都是在最大值的基础上加1
(二)浮点型 (存储薪资,身高,体重,体制参数)
1.定点数类型:dec等同于decimal
2.浮点类型:float double
语法:
单精度 float: FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
参数解释: M是全长,D是小数点后个数.M最大值为255,D最大值为30
有符号:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
无符号:
1.175494351E-38 to 3.402823466E+38
精确度:
**** 随着小数的增多,精度变得不准确 ****
双精度 double: DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
参数解释: 双精度浮点数(非准确小数值),M是全长,D是小数点后个数。M最大值为255,D最大值为30
有符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
无符号:
2.2250738585072014E-308 to 1.7976931348623157E+308
精确度:
****随着小数的增多,精度比float要高,但也会变得不准确 ****
精准decimal: decimal[(m[,d])] [unsigned] [zerofill]
参数解释:准确的小数值,M是整数部分总个数(负号不算),D是小数点后个数。 M最大值为65,D最大值为30。
精确度:
**** 随着小数的增多,精度始终准确 ****
对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
三.日期类型: (DATE TIME DATETIME TIMESTAMP YEAR)
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
语法:
复制代码
语法:
YEAR
YYYY(1901/2155)
create table t8(born_year year);#无论year指定何种宽度,最后都默认是year(4)

DATE
YYYY-MM-DD(1000-01-01/9999-12-31)

TIME
HH:MM:SS(‘-838:59:59‘/‘838:59:59‘)

DATETIME

YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
create table t9(d date,t time,dt datetime);
insert into t9 values(now(),now(),now())
调用mysql自带的now()函数,获取当前类型指定的时间

TIMESTAMP

YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
create table t10(time timestamp);
insert into t10 values(now());
补充:
在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。
下面就来总结一下两种日期类型的区别。

1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。

2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,
操作系统以及客户端连接都有时区的设置。

3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。

4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),
如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
注意:
#1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
#2. 插入年份时,尽量使用4位值
#3. 插入两位年份时,<=69,以20开头,比如50, 结果2050
>=70,以19开头,比如71,结果1971
create table t12(y year);
insert into t12 values (50),(71);
四.字符类型:
注意:char和varchar括号内的参数指的都是字符的长度
1. char类型:定长,简单粗暴,浪费空间,存取速度快
字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
存储:
存储char类型的值时,会往右填充空格来满足长度
例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
检索:
在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode = ‘PAD_CHAR_TO_FULL_LENGTH‘;
   查询sql的默认模式:select @@sql_mode;)
2.varchar类型:变长,精准,节省空间,存取速度慢
字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html
存储:
varchar类型存储数据的真实内容,不会用空格填充,如果‘ab ‘,尾部的空格也会被存起来
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
检索:
尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
3.相关函数:
length():查看字节数
char_length():查看字符数
查看字节数
#char类型:3个中文字符+2个空格=11Bytes
#varchar类型:3个中文字符+1个空格=10Bytes
总结:
#常用字符串系列:char与varchar
注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

#其他字符串系列(效率:char>varchar>text)
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 BINARY VARBINARY

text:text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 ? 1)个字符。
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters.

五.枚举类型和集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum :单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set :多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
示例:
mysql> create table consumer(
-> id int,
-> name varchar(50),
-> sex enum(‘male‘,‘female‘,‘other‘),
-> level enum(‘vip1‘,‘vip2‘,‘vip3‘,‘vip4‘),#在指定范围内,多选一
-> fav set(‘play‘,‘music‘,‘read‘,‘study‘) #在指定范围内,多选多
-> );
mysql> insert into consumer values
-> (1,‘赵云‘,‘male‘,‘vip2‘,‘read,study‘),
-> (2,‘赵云2‘,‘other‘,‘vip4‘,‘play‘);
六.完整性约束
(一)介绍
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
(二)
PRIMARY KEY (PK) #标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) #标识该字段为该表的外键
NOT NULL #标识该字段不能为空
UNIQUE KEY (UK) #标识该字段的值是唯一的
AUTO_INCREMENT #标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT #为该字段设置默认值
说明:
#1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
#2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum(‘male‘,‘female‘) not null default ‘male‘

#必须为正值(无符号) 不允许为空 默认是20
age int unsigned NOT NULL default 20
3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)
UNSIGNED #无符号
ZEROFILL #使用0填充
1.not null 与default
是否可空,null表示空,非字符串
not null - 不可空
null - 可空

默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

create table tb1(
nid int not null defalut 2,
num int not null
);
2.unique
在mysql中称为单列唯一
第一
create table department(
id int,
name char(10) unique
);
insert into department values(1,‘it‘),(2,‘sale‘);
第二:
create table department(
id int,
name char(10) ,
unique(id),
unique(name)
);
insert into department values(1,‘it‘),(2,‘sale‘);
联合唯一:
mysql> create table services(
-> id int,
-> ip char(15),
-> port int,
-> unique(id),
-> unique(ip,port)
-> );
insert into services values
-> (1,‘192,168,11,23‘,80),
-> (2,‘192,168,11,23‘,81),
-> (3,‘192,168,11,25‘,80);

3.primary key not null + unique的化学反应,相当于给id设置primary key
单列做主键
多列做主键(复合主键)
约束等价于 not null unique,字段的值不为空且唯一:
存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一个主键。
(1)单列主键
创建t14表,为id字段设置主键,唯一的不同的记录
create table t14(
id int primary key,
name char(16)
);
insert into t14 values
(1,‘xiaoma‘),
(2,‘xiaohong‘);
错误:insert into t14 values(2,‘wxxx‘);
(2)复合主键
create table t16(
ip char(15),
port int,
primary key(ip,port)
);

insert into t16 values
(‘1.1.1.2‘,80),
(‘1.1.1.2‘,81);

4.auto_increment
约束:约束的字段为自动增长,约束的字段必须同时被key约束
示例:
create table student(
id int primary key auto_increment,
name varchar(20),
sex enum(‘male‘,‘female‘) default ‘male‘
);
不指定id
insert into student(name) values (‘老白‘),(‘小白‘)
指定ID
insert into student values(4,‘asb‘,‘female‘);
再次插入一条不指定id的记录,会在之前的最后一条记录继续增长
mysql> insert into student(name) values (‘大白‘);
DELETE注意:
对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
示例:delete:
delete from student;
insert into student(name) values(‘ysb‘);
效果:
id | name | sex |
+----+------+------+
| 9 | ysb | male |
应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它
TRUNCATE清空表
truncate student
insert into student(name) values(‘xiaobai‘);
| id | name | sex |
+----+---------+------+
| 1 | xiaobai | male |
补充:
查看可用的 开头auto_inc的词
show variables like ‘auto_inc%‘;
步长auto_increment_increment,默认为1
# 起始的偏移量auto_increment_offset, 默认是1

设置步长 为会话设置,只在本次连接中有效
set session auto_increment_increment=5;
#全局设置步长 都有效。
set global auto_increment_increment=5;

# 设置起始偏移量
set global auto_increment_offset=3;
注意:
如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略
设置完起始偏移量和步长之后,再次执行show variables like‘auto_inc%‘;
发现跟之前一样,必须先exit,再登录才有效。

清空表区分delete和truncate的区别:
delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncate table t1;数据量大,删除速度比上一条快,且直接从零开始。
5.foreign key
情景:
公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费。
解决方法:
我们完全可以定义一个部门表
员工信息表关联该表,如何关联,即foreign key
一张是employee表,简称emp表(关联表,也就从表)
一张是department表,简称dep表(被关联表,也叫主表)
代码:
#1.创建表时先创建被关联表,再创建关联表
# 先创建被关联表(dep表)
create table dep(
id int primary key,
name varchar(20) not null,
descripe varchar(20) not null
);

#再创建关联表(emp表)
create table emp(
id int primary key,
name varchar(20) not null,
age int not null,
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
);

#2.插入记录时,先往被关联表中插入记录,再往关联表中插入记录

insert into dep values
(1,‘IT‘,‘IT技术有限部门‘),
(2,‘销售部‘,‘销售部门‘),
(3,‘财务部‘,‘花钱太多部门‘);

insert into emp values
(1,‘zhangsan‘,18,1),
(2,‘lisi‘,19,1),
(3,‘egon‘,20,2),
(4,‘yuanhao‘,40,3),
(5,‘alex‘,18,2);
3.删除表
#按道理来说,删除了部门表中的某个部门,员工表的有关联的记录相继删除。
但是先删除员工表的记录之后,再删除当前部门就没有任何问题
上面的删除表记录的操作比较繁琐,按道理讲,裁掉一个部门,该部门的员工也会被裁掉。其实呢,在建表的时候还有个很重要的内容,
叫同步删除,同步更新
注意:在关联表中加入
on delete cascade #同步删除
on update cascade #同步更新
代码:复制代码
create table emp(
id int primary key,
name varchar(20) not null,
age int not null,
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
on delete cascade #同步删除
on update cascade #同步更新
);
#再去删被关联表(dep)的记录,关联表(emp)中的记录也跟着删除
delete from dep where id=3;
再去更改被关联表(dep)的记录,关联表(emp)中的记录也跟着更改
update dep set id=222 where id=2;

python全栈开发 * mysql数据类型 * 180829

标签:create   har   授权   开发   精准   字符串存储   l数据库   标识   简单   

原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9557070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!