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


    * 库的操作   (增删改查)
    一.系统数据库
    查看系统库命令 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 enginesG;
    查看正在使用的存储引擎 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 a1G;
    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;
  • 相关阅读:
    Jenkins以root用户运行的方法
    nginx进行反向代理,80端口使用
    centos7 开机启动服务链接说明
    开始写博客
    python 读取文件夹,目录中出现中文的问题
    python unrar 解压缩
    python远程下载
    kryo 序列化
    python 多线程实验
    python decorator模式
  • 原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9557070.html
Copyright © 2020-2023  润新知