回顾

数据库基础知识: 关系型数据库(磁盘)和非关系型数据库(内存)

 
 

关系型数据库: 建立在关系模型上的数据库

数据结构: 二维表(比较浪费空间)

操作数据的指令集合: SQL(DDL,DML[DQL]和DCL)

完整性约束: 表内和表之间(实体)

 
 

Mysql关系型数据库: c/s结构软件(连接认证, 发送SQL指令, 服务器处理指令返回结果,客户端接收结果解析结果)

 
 

Mysql服务端对象: DBMS -> Database -> Table -> fields

 
 

SQL基本操作: 库操作, 表操作(字段)和数据操作

 
 

字符集问题: 中文数据问题

改变服务器接收数据的字符集: character_set_client

改变服务器返回数据的字符集: character_set_results

快捷方式: set names 字符集(三件事情)

 
 

web乱码问题: 浏览器解析, PHP处理(本地文件), 数据库处理

 
 

校对集问题: 比较规则: _bin, _cs和_ci, 利用排序(order by)

 
 

算法: 快速排序(递归)

--default-character-set=latin1 -- latin1一个字符对应一个字节

数据类型(列类型)

 
 

所谓的数据类型: 对数据进行统一的分类, 从系统的角度出发为了能够使用统一的方式进行管理: 更好的利用有限的空间.

 
 

SQL中将数据类型分成了三大类: 数值类型, 字符串类型和时间日期类型

 
 

 
 

数值型

数值型数据: 都是数值

系统将数值型分为整数型和小数型.

 
 

整数型

存放整型数据: 在SQL中因为更多要考虑如何节省磁盘空间, 所以系统将整型又细分成了5类:

 
 

Tinyint: 迷你整型,使用一个字节存储, 表示的状态最多为256种(常用)

Smallint: 小整型,使用2个字节存储,表示的状态最多为65536种

Mediumint: 中整型, 使用3个字节存储

Int: 标准整型, 使用4个字节存储(常用)

Bigint: 大整型,使用8个字节存储

 
 

创建一张整形表

 
 

插入数据: 只能插入整型, 只能插入范围内的整型

 
 

 
 

SQL中的数值类型全部都是默认有符号: 分正负

有时候需要使用无符号数据: 需要给数据类型限定: int unsigned; -- 无符号: 从0开始

 
 

数据的插入

 
 

 
 

查看表结构的时候,发现每个字段的数据类型之后都会自带一个括号,里面有指定的数字

 
 

显示宽度: 没有特别的含义, 只是默认的告诉用户可以显示的形式而已: 世界上用户是可以控制的,这种控制不会改变数据本身的大小.

 
 

显示宽度的意义: 在于当数据不够显示宽度的时候,会自动让数据变成对应的显示宽度: 通常需要搭配一个前导0来增加宽度, 不改变值大小: zerofill(零填充): 零填充会导致数值自动变成无符号

 
 

零填充+显示宽度的效果

 
 

零填充的意义(显示宽度): 保证数据格式

 
 

小数型

小数型: 带有小数点或者范围超出整型的数值类型.

 
 

SQL中: 将小数型细分成两种: 浮点型和定点型

浮点型: 小数点浮动, 精度有限,而且会丢失精度

定点型: 小数点固定, 精度固定, 不会丢失精度

 
 

 
 

浮点型

 
 

浮点型数据是一种精度型数据: 因为超出指定范围之后, 会丢失精度(自动四舍五入)

浮点型: 理论分为两种精度

Float: 单精度, 占用4个字节存储数据, 精度范围大概为7位左右

Double: 双精度,占用8个字节存储数据, 精度方位大概为15位左右

 
 

创建浮点数表: 浮点的使用方式: 直接float表示没有小数部分; float(M,D): M代表总长度,D代表小数部分长度, 整数部分长度为M-D

 
 

插入数据: 可以是直接小数,也可以是科学计数法

 
 

浮点型数据的插入: 整型部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)

 
 

结果: 浮点数一定会进行四舍五入(超出精度范围): 浮点数如果是因为系统进位导致整数部分超出指定的长度,那么系统也允许成立.

 
 

 
 

定点型

 
 

定点型: 绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)

 
 

创建定点数表: 以浮点数作为对比

 
 

插入数据: 定点数的整数部分一定不能超出长度(进位不可以),小数部分的长度可以随意超出(系统自动四舍五入)

 
 

浮点数如果进位导致长度溢出没有问题,但是定点数不行

 
 

查看数据效果

 
 

 
 

时间日期类型

Datetime: 时间日期, 格式是YYYY-mm-dd HH:ii:ss,表示的范围是从1000到9999年,有0值: 0000-00-00 00:00:00

Date: 日期,就是datetime中的date部分

Time: 时间(段), 指定的某个区间之间, -时间到+时间

Timestamp: 时间戳, 并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss格式与datetime完全一致

Year: 年份,两种形式, year(2)和year(4): 1901-2156

 
 

创建时间日期表

 
 

插入数据: 时间time可以是负数,而且可以是很大的负数, year可以使用2位数插入,也可以使用4位数

 
 

Timestamp字段: 只要当前所在的记录被更新, 该字段一定会自动更新成当前时间

 
 

网站是以PHP为实现的主要操作对象: PHP中有非常强大的时间日期处理函数: date,只需要一个时间戳就可以转换成任意类型的时间: 以PHP为主的时候, 都是在数据库使用时间戳(整型)来存储时间.

 
 

字符串类型

在SQL中,将字符串类型分成了6类: char,varchar,text , blob, enum和set

定长字符串

定长字符串: char, 磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度.

 
 

Char(L): L代表length, 可以存储的长度, 单位为字符, 最大长度值可以为255.

Char(4): 在UTF8 环境下,需要4 * 3 = 12个字节

 
 

变长字符串

变长字符串: varchar, 在分配空间的时候, 按照最大的空间分配: 但是实际上最终用了多少,是根据具体的数据来确定.

 
 

Varchar(L): L表示字符长度 理论长度是65536个字符, 但是会多处1到2个字节来确定存储的实际长度: 但是实际上如果长度超过255,既不用定长也不用变长, 使用文本字符串text

 
 

Varchar(10): 的确存了10个汉字, utf8环境, 10 * 3 + 1 = 31(bytes)

存储了3个汉字: 3 * 3 + 1 = 10(bytes)

 
 

定长与变长的存储实际空间(UTF8)

实际存储数据

Char(4)

Varchar(4)

Char占用字节

Varchar(占用字节)

ABCD

ABCD

ABCD

4 * 3 = 12

4 * 3 + 1 = 13

A

A

A

4 * 3 = 12

1 * 3 + 1 = 4

ABCDE

数据超过长度

数据超过长度

 
 

 
 

如何选择定长或者是变长字符串呢?

定长的磁盘空间比较浪费, 但是效率高: 如果数据基本上确定长度都一样, 就是使用定长, 如身份证, 电话号码, 手机号码等

 
 

变长的磁盘空间比较节省, 但是效率低: 如果数据不能确定长度(不同数据有变化), 如姓名, 地址等

 
 

文本字符串

如果数据量非常大, 通常说超过255个字符就会使用文本字符串

 
 

文本字符串根据存储的数据的格式进行分类: text和blob

Text: 存储文字(二进制数据,实际上都是存储路径)

Blob: 存储二进制数据(通常不用)

 
 

 
 

枚举字符串

枚举: enum, 事先将所有可能出现的结果都设计好, 实际上存储的数据必须是规定好的数据中的一个.

 
 

枚举的使用方式

定义: enum(可能出现的元素列表);    //如enum('男','女','不男不女','妖','保密');

使用: 存储数据,只能存储上面定义好的数据

 
 

创建枚举表

 
 

加入数据: 作用之一: 规范数据格式: 数据只能是规定的数据中的其中一个

 
 

作用之二: 节省存储空间(枚举通常有一个别名: 单选框): 枚举实际存储的是数值而不是字符串本身.

在mysql中,系统也是自动转换数据格式的: 而且基本与PHP一样(尤其是字符串转数字)

 
 

证明字段存储的数据是数值: 将数据取出来 + 0 就可以判断出原来的数据存的到底是字符串还是数值: 如果是字符串最终结果永远为0, 否则就是其他值.

 
 

找出了枚举元素的实际规律: 按照元素出现的顺序, 从1开始编号

 
 

枚举原理: 枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中): 然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储, 然后在进行数据提取的时候, 系统自动将数值转换成对应的字符串显示.

 
 

因为枚举实际存储的是数值,所以可以直接插入数值.

 
 

 
 

集合字符串

集合跟枚举很类似: 实际存储的是数值,而不是字符串(集合是多选)

 
 

集合使用方式:

定义: Set(元素列表)

使用: 可以使用元素列表中的元素(多个), 使用逗号分隔

 
 

创建集合表

 
 

插入数据: 可以使用多个元素字符串组合, 也可以直接插入数值

 
 

查看数据: 数值 + 数据查看

 
 

集合中没一个元素都是对应一个对应二进制位

 
 

集合中元素的顺序没有关系: 最终系统都会去匹配顺序

 
 

集合的强大在于能够规范数据和节省空间: PHP也可以规范数据, 但是对于PHP来说效率优先, 而且数据的维护可以通过数字进行, 增加PHP的维护成本: PHP根本没有办法判断数据在数据库的形式.

 
 

 
 

Mysql记录长度

Mysql中规定: 任何一条记录最长不能超过65535个字节.(varchar永远达不到理论值)

 
 

Varchar的实际存储长度能达到多少呢? 看字符集编码.

 
 

Utf8 下varchar的实际顶配: 21844字符

GBK下的varchar的实际顶配: 32766字符

 
 

想用完整个65535个字节长度: 增加一个tinyint字段即可

 
 

Mysql记录中: 如果有任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL(若想释放NULL所占用的字节: 必须保证所有的字段都不允许为空)

 
 

 
 

Mysql中text文本字符串,不占用记录长度: 额外存储. 但是text文本字符串也是属于记录的一部分: 一定需要占据记录中的部分长度: 10个字节(保存数据的地址以及长度).

 
 

 
 

 
 

列属性

列属性: 真正约束字段的是数据类型, 但是数据类型的约束很单一. 需要有一些额外的约束, 来更加保证数据的合法性.

 
 

列属性有很多: NULL/NOT NULL, default, Primary key, unique key, auto_increment,comment

 
 

 
 

空属性

两个值: NULL(默认的)和NOT NULL(不为空)

 
 

虽然默认的, 数据库基本都是字段为空, 但是实际上在真实开发的时候, 尽可能的要保证所有的数据都不应该为空: 空数据没有意义; 空数据没有办法参与运算.

 
 

创建一个实际案例表: 班级表(名字,教室)

 
 

 
 

列描述

列描述: comment, 描述, 没有实际含义: 是专门用来描述字段,会根据表创建语句保存: 用来给程序猿(数据库管理员)来进行了解的.

 
 

 
 

默认值

默认值: 某一种数据会经常性的出现某个具体的值, 可以在一开始就指定好: 在需要真实数据的时候,用户可以选择性的使用默认值.

 
 

默认值关键字: default

 
 

默认值的生效: 使用, 在数据进行插入的时候,不给改字段赋值

 
 

想要使用默认值,可以不一定去指定列表,故意不使用字段列表: 可以使用default关键字代替值

 

 

对应sql脚本代码:

-- 创建整型表

create table my_int(

int_1 tinyint,

int_2 smallint,

int_3 int,

int_4 bigint

)charset utf8;

 

-- 插入数据

insert into my_int values(100,100,100,100);     -- 有效数据

 

insert into my_int values('a','b','199','f');     -- 无效数据: 类型限定

 

insert into my_int values(255,10000,100000,1000000);    -- 错误: 超出范围

 

-- 给表增加一个无符号类型

alter table my_int add int_5 tinyint unsigned; -- 无符号类型

 

-- 插入数据

insert into my_int values(127,1000,10000,1000000,255);

 

alter table my_int add int_6 tinyint(1) unsigned;-- 指定显示宽度为1;

 

insert into my_int values(127,0,0,0,255,255);

 

alter table my_int add int_7 tinyint(2) zerofill; -- 显示宽度为2,0填充

 

insert into my_int values(1,1,1,1,1,1,1);

insert into my_int values(100,100,100,100,100,100,100);

 

-- 浮点数表

create table my_float(

f1 float,

f2 float(10,2),    -- 10位在精度范围之外

f3 float(6,2)    -- 6位在精度范围之内

)charset utf8;

 

-- 插入数据

insert into my_float values(1000.10,1000.10,1000.10); -- 符合条件

insert into my_float values(1234567890,12345678.90,1234.56); -- 符合条件

insert into my_float values(3e38,3.01e7,1234.56); -- 符合条件

insert into my_float values(9999999999,99999999.99,9999.99); -- 最大值

 

-- 超出长度插入数据

insert into my_float values(123456,1234.123456768,123.9876543);    -- 小数部分OK

insert into my_float values(123456,1234.12,12345.56);    -- 整数部分超出

 

-- 创建定点数表

create table my_decimal(

f1 float(10,2),

d1 decimal(10,2)

)charset utf8;

 

-- 插入数据

insert into my_decimal values(12345678.90,12345678.90); -- 有效数据

insert into my_decimal values(1234.123456,1234.1234356); -- 小数部分超出:ok

 

insert into my_decimal values(99999999.99,99999999.99); -- 没有问题

insert into my_decimal values(99999999.99,99999999.999); -- 进位超出范围

 

-- 创建时间日期表

create table my_date(

d1 datetime,

d2 date,

d3 time,

d4 timestamp,

d5 year

)charset utf8;

 

-- 插入数据

insert into my_date values('2015-9-28 11:50:36','2015-9-28','11:50:54','2015-9-28 11:51:08',2015);

 

-- 时间使用负数

insert into my_date values('2015-9-28 11:50:36','2015-9-28','-11:50:54','2015-9-28 11:51:08',2015);

insert into my_date values('2015-9-28 11:50:36','2015-9-28','-211:50:54','2015-9-28 11:51:08',2015);

insert into my_date values('2015-9-28 11:50:36','2015-9-28','-2 11:50:54','2015-9-28 11:51:08',2015); -- -2过去2天:48

 

-- year可以使用2位或者4位

insert into my_date values('2015-9-28 11:50:36','2015-9-28','11:50:54','2015-9-28 11:51:08',69);

insert into my_date values('2015-9-28 11:50:36','2015-9-28','11:50:54','2015-9-28 11:51:08',70);

 

-- timestamp: 修改记录

update my_date set d1 = '2015-9-28 11:55:45' where d5 = 2069;

 

-- 创建枚举表

create table my_enum(

gender enum('男','女','保密')

)charset utf8;

 

-- 插入数据

insert into my_enum values('男'),('保密'); -- 有效数据

 

-- 错误数据

insert into my_enum values('male');    -- 错误: 没有该元素

 

-- 将字段结果取出来进行+0运算

select gender + 0, gender from my_enum;

 

-- 数值插入枚举元素

insert into my_enum values(1),(2);

 

-- 创建集合表

create table my_set(

hobby set('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')

--         足球             台球 网球

-- 集合中: 每一个元素都是对应一个二进制位,被选中为1,没有则为0: 最后反过来

-- 0 1 0 0 0 1 1 0

-- 反过来 01100010 = 98

 

)charset utf8;

 

-- 插入数据

insert into my_set values('足球,台球,网球');

insert into my_set values(3);

 

-- 查看集合数据

select hobby + 0, hobby from my_set;

 

-- 98转成二进制 = 64 + 32 + 2 = 01100010

 

-- 颠倒元素出现的顺序

insert into my_set values('网球,台球,足球');

 

-- 求出varchar在utf8和GBK下的实际最大值

create table my_utf8(

name varchar(21844) -- 21844 * 3 + 2 = 65532 + 2 = 65534

)charset utf8;

 

create table my_gbk(

name varchar(32766) -- 32766 * 2 + 2 = 65532 + 2 = 65534

)charset gbk;

 

create table my_utf81(

age tinyint,     -- 1

name varchar(21844) -- 21844 * 3 + 2 = 65532 + 2 = 65534

)charset utf8;

 

create table my_gbk1(

age tinyint,     -- 1    

name varchar(32766) -- 32766 * 2 + 2 = 65532 + 2 = 65534

)charset gbk;

 

-- 释放NULL

create table my_utf82(

age tinyint not null,     -- 1

name varchar(21844) not null -- 21844 * 3 + 2 = 65532 + 2 = 65534

)charset utf8;

 

create table my_gbk2(

age tinyint not null,     -- 1    

name varchar(32766) not null -- 32766 * 2 + 2 = 65532 + 2 = 65534

)charset gbk;

 

-- text占用十个字节长度

create table my_text(

name varchar(21841) not null, -- 21841 * 3 + 2 = 65523 + 2 = 65525

content text not null     -- 10        

)charset utf8;

 

-- 创建班级表

create table my_class(

name varchar(20) not null,

room varchar(20) null -- 代表允许为空: 不写默认就是允许为空

)charset utf8;

 

-- 创建表

create table my_teacher(

name varchar(20) not null comment '姓名',

money decimal(10,2) not null comment '工资'

)charset utf8;

 

-- 默认值

create table my_default(

name varchar(20) not null,

age tinyint unsigned default 0,

gender enum('男','女','保密') default '男'

)charset utf8;

 

-- 插入数据

insert into my_default (name) values('高强');

 

insert into my_default values('范立峰',18,default);

 
 

 
 

 
 

  

MySQL第二天的更多相关文章

  1. 【small项目】MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

    MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  2. 详解MySQL第二篇—DML语句

    DML 语句: DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert).更新(update).删除(delete)和查(select),是开发人员日常使用最频繁的操作.下面将依次 ...

  3. MySQL 第二篇

    一.MySQL多实例介绍 mysql多实例,共用一套mysql安装程序,使用不同的配置文件(my.cnf).启动程序.和数据文件,即在一台服务器上同时开启多个不同的服务器端口(3306,3307),同 ...

  4. python---连接MySQL第二页

    用python向MySQL插入值.并取出被插入行的主键. #!/usr/bin/python #!coding:utf-8 import mysql.connector from mysql.conn ...

  5. c潭州课堂25班:Ph201805201 MySQL第二课 (课堂笔记)

    mysql> create table tb_2( -> id int, -> name varchar(10) not null -> ); 插入数据 insert into ...

  6. mysql 第二高薪水

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | ...

  7. mysql第二次安装失败的解决方法

    1首先在控制面板中将名字与mysql有关的逐一的卸载. 2 然后找到mysql安装目录将mysql文件夹全部删掉,即使是空的文件夹也要删掉. 3打开C:\ProgramData,找到MySQL文件夹, ...

  8. MySQL 第二篇:库操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  9. MYSQL第二课

    创建数据库: 输入:CREATE DATABASE itcase;计算机输出: Query OK, 1 row affected 查看数据库:输入:SHOW DATABASES;计算机输出: +--- ...

随机推荐

  1. pandas 绘图与滑窗

    #import nessary library before start import pandas as pd import numpy as np import matplotlib.pyplot ...

  2. zabbix proxy 安装

    ### 前期准备 ```   # 直接yum安装 ```   ### 安装 ``` # 安装 sqlite zabbix-proxy-sqlite3 yum -y install sqlite sql ...

  3. C/C++中,空数组、空类、类中空数组的解析及其作用

    转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多 ...

  4. SourceTree代码管理学习git命令操作

    Git管理工具SourceTree提交代码时报文件名过长,用命令解决这个错误: 使用git status查看状态信息 git status 使用git add将修改后的文件(.代表全部文件)添加到暂存 ...

  5. Atitit.js this错误指向window的解决方案

    Atitit.js this错误指向window的解决方案 1.1. 出现地点and解决之道1 1.2. call,apply和bind这三个方法2 1.2.1. Function.prototype ...

  6. DMA (直接存储器访问)

    DMA (直接存储器访问) 编辑 DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载.否 ...

  7. iptables修改

    https://fedoraproject.org/wiki/How_to_edit_iptables_rules?rd=User_talk:Rforlot Listing Rules Current ...

  8. 内核调试神器SystemTap — 探測点与语法(二)

    a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 探測点 SystemTap脚本主要是由探測点和探測点处理函数组成的,来看下 ...

  9. 用JWT技术为SpringBoot的API增加授权保护(转),需要自己实现userdetailservice接口

    转自:https://blog.csdn.net/haiyan_qi/article/details/77373900 概述 示例 https://github.com/qihaiyan/jwt-bo ...

  10. Nginx编译安装第三方模块http_substitutions_filter_module

    Nginx编译安装第三方模块http_substitutions_filter_module 分类:服务器技术  作者:rming  时间:-- . >>ngx_http_substitu ...