数据表的操作🌜
MySQL管理数据的方式🚶
如图所示,数据库中的数据表又类似于excel表.
对于数据表:
- 一个数据库可以有多个数据表,且每个数据表又很多行,每一行称为一条记录,每一行又有很多列,每一列都称为一个字段
- 针对一个数据表,每条记录的字段数量要一致,对整张数据表来说,每一列都必须是同一个类型
- 为了表述字段信息,需要在建表时就指定"表头"
- 表头会指明表格的记录都会有几列,每一列都分别是什么类型,字段名称是什么
MySQL中的数据类型🏎
数值型
数据类型 | 大小 | 说明 | 对应java的类型 |
---|---|---|---|
bit[m] | m指定位数,默认就是1 | 二进制数,m的范围是1-64,储值范围2^m-1 | 常用Boolean对应bit,此时默认就是1位,只能是0或1 |
tinyint | 1byte | Byte | |
smallint | 2byte | Short | |
int | 4byte | Integer | |
bigint | 8byte | Long | |
float(m,d) | 4byte | 单精度浮点数,m指定有效数字个数,d指定小数点后保留几位小数 | Float |
double(m,d) | 8byte | 双精度浮点数,m指定有效数字个数,d指定小数点后保留几位小数 | Double |
decimal(m,d) | m/d最大值+2 | 双精度,m指定有效数字个数,d指定小数点后保留几位小数 | BigDecimal |
numeric(m,d) | m/d最大值+2 | 的decimal一样 | BigDecimal |
Note:float和double都是IEEE754规则去存储的,所以无法精确表示多有的小数,这才有了decimal和numeric,且float和double都不能进行逻辑判等的操作
字符串类型🌵
数据类型 | 大小 | 说明 | 对应的java类型 |
---|---|---|---|
varchar(size) | size指定字符的个数 | 可变长度的字符串 | String |
text | 长文本数据 | String | |
mediumtext | 中等长度文本数据 | String | |
blob | 二进制长文本数据 | byte[] |
日期类型💤
数据类型 | 大小 | 说明 | 对应的java类型 |
---|---|---|---|
datatime | 8byte | 范围从1000到9999年,不会进行时区的检索和转换 | java.utol.Date/java.sql.Timestamp |
timestamp | 4byte | 范围从1970年到2038年,自动检索时区和进行转换 | java.utol.Date/java.sql.Timestamp |
Note:时间戳(timestamp):从1970年1月1日0时0分0秒整体换算成秒,再用当前的年月日时分秒换算成的秒数做减法,得到的结果就是时间戳.到2038年4byte的时间戳就不够用了.
关于数据表的操作✌️
-
创建表
create table 表名(列名 类型,列名 类型...); //操作之前需要先选中在哪个数据库建表
-
查看表
show tables;
-
查看表的结构
desc 表名;
-
删除表
drop table 表名;
-
注释
create table score(id int,name varchar(20) comment '姓名'); -- name是姓名 create table score(id int,name varchar(20) );
Note:如果sql语句比较长,其实我们可以在记事本或者在idea中建立一个sql后缀的文件,编辑完成之后,复制粘贴到控制台执行也行.
初阶数据表的增删查改🗡
-
增加记录(insert)
insert into 表名 values(列的值,...),(列的值,...);
指定列插入:
insert into 表名 (列名,...) values(列的值,列的值,...);
note:
mysql默认的编码方式是拉丁文,那此时如果我们需要插入中文的字符串,需要对mysql的编码方式进行修改,修改的方式就通过修改配置文件的方式来进行,配置文件就是:搜索"服务"->mysql57->找到ini后缀的文件所在路径,然后对default_character-set=utf8,character-set-server=utf8即可.当然也可以设置成utf8mb4,此时相比较于utf8只不过多了一些个表情而已.修改完毕,记得删除之前建立的数据库,重启服务器,重启客户端,修改配置文件的时候,行最前面的#记得删除,否则会被注释掉.
-
查找记录(select)
-
全列查询(整张表格都查出来)
select * from 表名;
note:*是通配符,其次查找的结果只是一张临时表,不是在硬盘上,而是在内存中,当我们将这个表打印在窗口后,内存中的临时表也随之释放了,其次全列查询需要将整张表从硬盘读取到,然后通过网络传输给客户端,数据比较多时,硬盘IO占用太多,网络IO容易吃满,所以在生产环境不建议这样做,毕竟生产环境面向用户,不可以影响用户的体验.公司针对这种情况,通常将这样的sql称之为慢sql,一旦遇到这种慢sql,一般将其杀死.
-
指定列查询
select 列名,列名,.. from 表名;
此时只会打印出我们制定的列.那网络就会针对性的返回指定列的数据,相比较于全列查询,高效不少.
-
指定列查询的字段为表达式
select 字段间的表达式,字段,... from 表名;
表达式和字段的摆放顺序,决定了打印出来的先后顺序.
Note:临时表中的数据类型可能与我们建表时制定的字段数据类型不一致,但没关系,mysql会进行自动适应,以保证计算结果是正确的,但对服务器中的原始数据没影响.
-
查询字段取一个别名
select 列名(表达式也行) as 别名,列名,... from 表名;
as可以省略,但你不建议,省略了可读性会降低.
-
针对查询结果进行降重
select distinct 列名 from 表名;
**Note:**distinct后面可以跟若干个字段,但此时只有两条记录中这个若干个字段(两条记录的同一列)都相同时,才会被视作需要降重的记录.
-
排序
select 列名 from 表名 order by 列名 asc/desc;
asc是默认的排序方式,所以省略不写排序的方式,就默认是升序排序,整句话的意思就是,选中的字段对应的记录,将会依据所指定的字段按照某排序来进行打印.其次,order by后面可以跟若干个列名,意思就是先按最左边的字段进行排序,若针对最左边的字段排序之后还有相同的,才会继续按照第二个字段进行排序.
-
条件查询
select 列名 from 表名 where 条件;
查询结果将会把符合条件的记录保留,不符合的过滤掉.
mysql中的条件:
比较运算符;
运算符 说明 >,>=,<,<= 显然 = 判等 <=> mysql独有的判断,用于null之间的判断,如null<=>null 返回true !=,<> 不等于 between a and b [a,b]返回true,反之返回false,注意事项闭区间 in(a1,a2,a3,…) 是括号中的其中一个,就返回true ,反之返回false is null 判断是不是null is not null 判读是否为 不是null like 模糊查询 逻辑运算符:
运算符 说明 and 且 or 或 not 非 note:
where条件中不可使用别名,因为where是在硬盘中找符合条件的数据呢,表名只不过是对临时表的一些列"美化",此时硬盘里的数据还没来呢!
其次and的优先级高于or,所以适当的使用括号进行逻辑上的操作.
-
模糊查询
比如查找姓孙的学生有哪些:
select * from student where name='孙%';
姓孙,但名字只有两个字的:
select * from student where name='孙_';
-
分页查询
select 8 from student limit 3 offset 3;
从偏移量为3的记录开始,从服务器数据库中拿三条记录到客户端.第一条记录偏移量为0,第二条为1,一次类推.
-
上述选择性查询的各种条件的顺序
select ...from table_name [where..] [order by] [limit..];
即:先where过滤掉一部分记录,剩下的记录再经过order by的排序,然后传输若干条记录给客户端.
-
-
修改(update)
update 表名 set 列名=新的字段值,...[where..] [order by] [limit..];
即晒选出来的结果进行了字段的更新.
mysql中没有直接的撤销操作,只能反向修改.
-
删除(delete)
delete from 表名 where...;
指定的记录将会被删除.
后传输若干条记录给客户端. -
修改(update)
update 表名 set 列名=新的字段值,...[where..] [order by] [limit..];
即晒选出来的结果进行了字段的更新.
mysql中没有直接的撤销操作,只能反向修改.
-
删除(delete)
delete from 表名 where...;
指定的记录将会被删除.