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的时候,时间的保存通常使用真正的时间戳,从而用整型来保存。