(小白)MySQL基础学习002 20201007
(小白)MySQL基础学习002 20201007
历程
- 插入数据操作(向表中指定字段插入数据)
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”);
- 插入数据操作(向表中所有字段插入数据)
insert into 表名 values (对应表结构)
insert into my_teacher values(“Lilei”,28); //这时的值列表必须要与原表的字段完全一样
insert into my_teacher values(“Lilei2”);
这样就报错了,因为value的个数不对应
- 查询操作
查询全部:
select *from my_teacher;
查询部分
select 字段列表from 表名 //字段列表使用逗号","分开
select name from my_teacher;
简单条件查询
select 字段列表/* from 表名 where 字段名 = 值 //mysql中没有==判断,只用=即可
select name from my_teacher where age=30;
虽然只有一条数据,但也是扫描了全表得到的
-
删除操作
delete from 表名(where 条件); //如果没有where 条件,意味着系统会自动删除该表所有数据(慎用)
delete from my_teacher where age=30; -
更新操作
update 表名 set 字段名 = 新值 (where 条件):如何没有where,那么所有数据都会被修改
update my_teacher set age=28 where name=“Han”; -
字符集
在计算机中所看到的任何内容都是字符,在计算机中对应的二进制码,就是字符编码(character code)
常见字符集:
ASCII,GB2312,Unicode(将所有的字符编码都放进去了),BIG5字符集,GB18030 -
尝试放入中文数据
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 默认都只有一个字符集
- 告知mysqld对应字符集类型gbk
set names gbk;
-
尝试删除之前我加进去的张三
delete from my_teacher where name=“张三”; -
重新添加 张三
在cmd中可以正常显示了 -
深层原理
mysql-mysqld:
客户端传入数据给服务端:client
服务端返回数据给客户端:server
客户端与服务端之间的连接:collection
set names 字符集的本质,就是一次性打通三层关系的字符集,变得一致:
在系统中有三个变量来记录着这三个关系对应的字符集:show variables like “character_set%”;
这里三个值都已经变成了utf8
查看新的客户端的对应字符集关系:
发现我的database与之前的不同
修改某个变量的值:
set character_set_client = gbk;
发现修改成功
这里就说明了我之前插入没问题,但显示却是乱码的问题:见第7条
- 字段类型:
https://www.runoob.com/mysql/mysql-data-types.html
tinyint:采用一个字节来保存,迷你整型 0-255 age/month等
-
创建不同整型的数据表
create table my_int(
int_1 tinyint,
int_2 smallint,
int_3 mediumint,
int_4 int,
int_5 bigint
)charset utf8;
在navicat中看不出差别:
查看table可以发现:
这里对数据是有类型差别的 -
插入正常数据
insert into my_int values(10,10000,100000,10000000,100000000); -
插入超范围数据
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 -
无负号设定
在类型之后+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
- 超出显示范围
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
显示长度可以自己设定,超出长度但不会超出范围,不会有问题
- 小数类型 见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;
-
存入正常数据
insert into my_float values(123.123,12345678.90);
这里的数据变化了
12345678.90=>精度超出了7位,超出7位就已经变了,如果精度丢失,会按四舍五入的方式进行变化 -
存入非正常数据
insert into my_float values(123.1234567,123456789.00);
超出指定位数。报错!
-
数据长度刚好满足条件,但是会超出精度
insert into my_float values(123.1234567,99999999.99);
精度超出7位了,所以会变化,四舍五入后会超出精度
我们没办法插入超出整数部分的长度,但直接进位是可以超出原来指定的长度的。 -
用科学计数法存储数据
insert into my_float values(123.123,10e5);
通常保存数量特别大,大到不需要精确的数据。
-
定点数,能够保证数据精确的小数类
小数部分可能不精确,超出长度会四舍五入,但整数部分一定准确 -
decimal定点数
系统自动根据存储数据来分配存储空间,每大概9个数就会分配四个数字来进行存储,同时小数和整数部分是分开的。
decimal(M,D):M表示总长度,最大值不能超过65,D:小数部分长度,最长部分不能超出30
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(99999999.99,99999999.99);
- 尝试定点数进行四舍五入,也就是小数部分超出
insert into my_decimal values(99999999.99,99999999.999);
报错了:定点数如果整数部分进位超出长度也会报错
insert into my_decimal values(99999999.99,89999999.999);
如果整数部分不超出,小数部分超出了,整数部分还是会相应的进位的。
定点数,如果涉及到钱的时候,一般会用到定点数,保证数据的精确性。
-
日期类型:
DATETIME实际就是把DATE和TIME合在一起
timestamp:mysql中的时间戳只是表示从格林威治时间开始,但是其格式依然是:YYYY-MM-DD HH:MM:SS
YEAR只有一个字节,只以只有255个范围,插入方式可以是两位数YY,也可以是四位是YYYY -
新建时间表
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自动更新到最新的时间戳
- 插入正常数据
insert into my_date values(
“1900-01-01”,
“12:12:12”,
“1900-01-01 12:12:12”,
“1999-01-01 12:12:12”,
69
);
-
year两位数插入的时候有一个区间划分
区分在69和70,因为格林威治从1970开始,高于70就按19计算,低于69就按20算 -
timestamp
当对应的数据被修改的时候,会自动更新(这个修改的数据不是自己)
update my_date set d1=“2000-01-01” where d5=2069;
这时候timestamp也自动更新了
- 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的时候,时间的保存通常使用真正的时间戳,从而用整型来保存。