(小白)MySQL基础学习002 20201007

6 篇文章 0 订阅

(小白)MySQL基础学习002 20201007

历程

  1. 插入数据操作(向表中指定字段插入数据)
    insert into 表名【字段列表】values (对应字段列表)
    insert into
    此处因为我用的是phpstudy下的mysql,所以没办法用net start 的方式打开,需要先打开phpstudy,开户mysql,然后cmd才能登录
    先添加一个my_teacher;

insert into my_teacher(name,age) values(“jack”,30);

在这里插入图片描述
后面values中的值只需要与前面的key相对应即可,不一定需要与表顺序完全相同
比如说可以(age,name)
insert into my_teacher(age,name) values(49,“Tom”);
在这里插入图片描述

某字段没有,只输入一部分也可以
insert into my_teacher(name) values(“Han”);

在这里插入图片描述

  1. 插入数据操作(向表中所有字段插入数据)
    insert into 表名 values (对应表结构)
    insert into my_teacher values(“Lilei”,28); //这时的值列表必须要与原表的字段完全一样
    在这里插入图片描述

insert into my_teacher values(“Lilei2”);
在这里插入图片描述
这样就报错了,因为value的个数不对应

  1. 查询操作
    查询全部:
    select *from my_teacher;
    在这里插入图片描述

查询部分
select 字段列表from 表名 //字段列表使用逗号","分开
select name from my_teacher;

在这里插入图片描述
简单条件查询
select 字段列表/* from 表名 where 字段名 = 值 //mysql中没有==判断,只用=即可
select name from my_teacher where age=30;
在这里插入图片描述
虽然只有一条数据,但也是扫描了全表得到的

  1. 删除操作
    delete from 表名(where 条件); //如果没有where 条件,意味着系统会自动删除该表所有数据(慎用)
    delete from my_teacher where age=30;
    在这里插入图片描述

  2. 更新操作
    update 表名 set 字段名 = 新值 (where 条件):如何没有where,那么所有数据都会被修改
    update my_teacher set age=28 where name=“Han”;
    在这里插入图片描述

  3. 字符集
    在计算机中所看到的任何内容都是字符,在计算机中对应的二进制码,就是字符编码(character code)
    常见字符集:
    ASCII,GB2312,Unicode(将所有的字符编码都放进去了),BIG5字符集,GB18030

  4. 尝试放入中文数据
    insert into my_teacher values(“张三”,34);
    在这里插入图片描述
    如果直接在cmd下插入中文数据可能会出错,我这里没有出错,但数据是有问题的;(原因见第12条)
    在Navicat中是可以看到“张三”的:
    在这里插入图片描述
    但cmd显示的却是:
    在这里插入图片描述

一般出错的原因是:
用户通过mysql.exe来操作mysqld.exe
真正的SQL执行是mysqld.exe来执行
mysql.exe将数据传入mysqld.exe的时候,没有告知符号规则,而mysqld也没有能力来判断,就会使用自己默认的(字符集)
解决方案;mysql.exe客户端在进行数据操作之前将自己所使用的字符集告诉mysqld
Cmd下的mysql.exe 默认都只有一个字符集
在这里插入图片描述

  1. 告知mysqld对应字符集类型gbk
    set names gbk;

在这里插入图片描述

  1. 尝试删除之前我加进去的张三
    delete from my_teacher where name=“张三”;
    在这里插入图片描述
    在这里插入图片描述

  2. 重新添加 张三
    在这里插入图片描述
    在cmd中可以正常显示了

  3. 深层原理
    mysql-mysqld:
    客户端传入数据给服务端:client
    服务端返回数据给客户端:server
    客户端与服务端之间的连接:collection
    set names 字符集的本质,就是一次性打通三层关系的字符集,变得一致:
    在系统中有三个变量来记录着这三个关系对应的字符集:show variables like “character_set%”;
    在这里插入图片描述
    这里三个值都已经变成了utf8
    查看新的客户端的对应字符集关系:
    在这里插入图片描述
    发现我的database与之前的不同

修改某个变量的值:
set character_set_client = gbk;
在这里插入图片描述
发现修改成功
这里就说明了我之前插入没问题,但显示却是乱码的问题:见第7条

  1. 字段类型:
    https://www.runoob.com/mysql/mysql-data-types.html
    在这里插入图片描述
    在这里插入图片描述
    tinyint:采用一个字节来保存,迷你整型 0-255 age/month等

在这里插入图片描述
在这里插入图片描述

  1. 创建不同整型的数据表
    create table my_int(
    int_1 tinyint,
    int_2 smallint,
    int_3 mediumint,
    int_4 int,
    int_5 bigint
    )charset utf8;
    在这里插入图片描述
    在navicat中看不出差别:
    在这里插入图片描述
    查看table可以发现:
    在这里插入图片描述
    这里对数据是有类型差别的

  2. 插入正常数据
    insert into my_int values(10,10000,100000,10000000,100000000);
    在这里插入图片描述

  3. 插入超范围数据
    insert into my_int values(255,255,255,255,255);
    报错:
    在这里插入图片描述
    错误原因:
    虽然一个字节在0-255,但mysql默认将整形设为有负数,也就是区间为:-128~127
    insert into my_int values(-128,255,255,255,255);
    在这里插入图片描述
    实际应用中,应该根据我们数据的类型而选择,一般我们会用tinyint和int

  4. 无负号设定
    在类型之后+unsigned
    alter table my_int add int_6 tinyint unsigned first;
    在这里插入图片描述
    insert into my_int values(255,100,255,255,255,255);

在这里插入图片描述
查看表结构:
在这里插入图片描述
这里int_6是可以的
这里的3,4,6,9,11,20是显示长度的意思
指数据(整型)在数据显示的时候,到底能显示多少位
这时候-128就会是4位

如果想要数据自动添满,需要增加zerofill属性才可以
alter table my_int add int_7 tinyint zerofill first;
在这里插入图片描述
这时候发现,就算我们没有写unsigned,也会默认是unsigned,因为zerofill是从左侧填充0,所以负数就不能使用,所以一定是unsigned
insert into my_int values(1,1,1,1,1,1,1);
在这里插入图片描述
这时候发现是001

  1. 超出显示范围
    alter table my_int add int_8 tinyint(2) zerofill first;

在这里插入图片描述

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

在这里插入图片描述
此时发现,100虽然超出了设置的2位显示范围,但还是显示了3位,而1自动变成了01
显示长度可以自己设定,超出长度但不会超出范围,不会有问题

  1. 小数类型 见13条
    浮点型:又称为精度类型,是一种有可能丢失精度的数据类型,数据有可能不那么准确(尤其是在超出范围的时候)
    float:4个字节来存储,能表示10^38位的数据,如果7位以内基本准确,超出7位就不准确了
    基本语法:
    float:表示不指定小数的浮点数
    float(M,D):表示一共存储M个有效数字,其中小数部分占D位
    float(10,2):表示整数部分为8位,小数部分为2位
    double:10^308位的数据,精确到15位左右
    decimal:

create table my_float(
f1 float,
f2 float(10,2)
)charset utf8;

在这里插入图片描述

  1. 存入正常数据
    insert into my_float values(123.123,12345678.90);
    在这里插入图片描述
    在这里插入图片描述
    这里的数据变化了
    12345678.90=>精度超出了7位,超出7位就已经变了,如果精度丢失,会按四舍五入的方式进行变化

  2. 存入非正常数据
    insert into my_float values(123.1234567,123456789.00);

在这里插入图片描述
超出指定位数。报错!

  1. 数据长度刚好满足条件,但是会超出精度
    insert into my_float values(123.1234567,99999999.99);
    精度超出7位了,所以会变化,四舍五入后会超出精度
    在这里插入图片描述
    我们没办法插入超出整数部分的长度,但直接进位是可以超出原来指定的长度的。

  2. 用科学计数法存储数据
    insert into my_float values(123.123,10e5);

在这里插入图片描述
通常保存数量特别大,大到不需要精确的数据。

  1. 定点数,能够保证数据精确的小数类
    小数部分可能不精确,超出长度会四舍五入,但整数部分一定准确

  2. decimal定点数
    系统自动根据存储数据来分配存储空间,每大概9个数就会分配四个数字来进行存储,同时小数和整数部分是分开的。
    decimal(M,D):M表示总长度,最大值不能超过65,D:小数部分长度,最长部分不能超出30
    create table my_decimal(
    f1 float(10,2),
    d1 decimal(10,2)
    )charset utf8;
    在这里插入图片描述

  3. 插入正常数据
    insert into my_decimal values(12345678.90,12345678.90);
    在这里插入图片描述
    保证了精确度

insert into my_decimal values(99999999.99,99999999.99);
在这里插入图片描述

  1. 尝试定点数进行四舍五入,也就是小数部分超出
    insert into my_decimal values(99999999.99,99999999.999);

在这里插入图片描述
报错了:定点数如果整数部分进位超出长度也会报错
insert into my_decimal values(99999999.99,89999999.999);
在这里插入图片描述
如果整数部分不超出,小数部分超出了,整数部分还是会相应的进位的。

定点数,如果涉及到钱的时候,一般会用到定点数,保证数据的精确性。

  1. 日期类型:
    在这里插入图片描述
    DATETIME实际就是把DATE和TIME合在一起
    timestamp:mysql中的时间戳只是表示从格林威治时间开始,但是其格式依然是:YYYY-MM-DD HH:MM:SS
    YEAR只有一个字节,只以只有255个范围,插入方式可以是两位数YY,也可以是四位是YYYY

  2. 新建时间表
    create table my_date(
    d1 date,
    d2 time,
    d3 datetime,
    d4 timestamp,
    d5 year
    )charset utf8;

在这里插入图片描述
这里时间戳不能为空,也就是Null NO
CURRENT_TIMESTAMP:当前时间戳
Extra: on update CURRENT_TIMESTAMP自动更新到最新的时间戳

  1. 插入正常数据
    insert into my_date values(
    “1900-01-01”,
    “12:12:12”,
    “1900-01-01 12:12:12”,
    “1999-01-01 12:12:12”,
    69
    );

在这里插入图片描述

  1. year两位数插入的时候有一个区间划分
    区分在69和70,因为格林威治从1970开始,高于70就按19计算,低于69就按20

  2. timestamp
    当对应的数据被修改的时候,会自动更新(这个修改的数据不是自己)
    update my_date set d1=“2000-01-01” where d5=2069;

在这里插入图片描述
这时候timestamp也自动更新了

  1. time类型特殊性,本质是用来表示时间区间,所以表示的范围比较大
    在进行时间类型录入的时候(time)还可以使用一个简单的日期代替时间,在时间格式之前加上一个空格,然后指定一个数字,系统会自动将该数字转换成天数*24小时,再加上后面的时间

insert into my_date values(
“1900-01-01”,
“5 12:12:12”,
“1900-01-01 12:12:12”,
“1999-01-01 12:12:12”,
69
);
在这里插入图片描述
5*24+12=132
这个数字5可以是负数
PHP中有非常强大的日期转换函数,date将时间戳转换成想要的格式,strtotime又可以将很多格式转换成对应的时间戳。PHP通常不需要数据库来帮助处理这么复杂的时间日期,所以通常配合PHP的时候,时间的保存通常使用真正的时间戳,从而用整型来保存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值