回顾

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

 
 

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

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

操作数据的指令集合: 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. 出现蓝屏代码0x0000007b的原因及解决办法

    出现蓝屏代码0x0000007b的原因通常是硬盘的存储控制器驱动加载错误,我们可以通过对BIOS界面进行修复来解决这个问题.下面小编将详细介绍解决蓝屏代码0x0000007b的方法,一起来看看吧 导致 ...

  2. POJ 3667 Hotel(线段树)

    POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...

  3. 深入PHP中慎用双等于(==)的详解

    PHP比较运算符出现的频率实在是太高了,尤其是 ==if(a == b){// do something}但是,你真的掌握了 == 了吗?细节很重要!来看下面的代码,说出你认为正确的答案var_dum ...

  4. mac之homebrew安装

    通过homebrew可以管理众多开源软件的安装和卸载.使用homebrew可以非常容易的安装 os x中没有包含的unix工具包和语言包,比如wget;node;lua;rabbitmq;nginx等 ...

  5. android studio - 隐藏编辑器上面的导航条

    菜单栏-“View”-"Navigation Bar"

  6. Google Pagespeed,自动压缩优化JS/CSS/Image

    Google Pagespeed,自动压缩优化JS/CSS/Image 浏览: 发布日期:// 分类:技术分享 关键字: Nginx Appache Pagespeed 自动压缩优化JS/CSS/Im ...

  7. 更新换代----systemctl命令取代chkconfig和service

    systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 ...

  8. Easyui Datagrid扩展fixRownumber方法

    首先,从datagrid生成的代码,我们可以发现,在rowNumber上都有特定的class标记,datagrid-cell-rownumber,datagrid-header-rownumber. ...

  9. hdu 4421(枚举+2-sat)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4421 思路:枚举32位bit,然后2-sat判断可行性,这里给出2-sat矛盾关系构图: 1.a&am ...

  10. 使用Volley缓存图片时,缓存无效的原因。

    使用Volley的ImageLoader异步获取并缓存图片时,发现有的网络图片已经缓存了,可是断网后却读不出来. ImageLoader的用法: RequestQueue requestQueue = ...