上次讲到的是对数据库和表的一些基础操作,像是创建,删除,简单的查看之类的。
那么今天,我将分享的是,对于表的操作,更深一层的。
那么对表的操作,无非就是我们常说的的增删改查。
那么什么又是增删改查呢?
增:create
删:delete
改:update
查:retrieve
值得注意的是,这里的查、增,只是英文上的表诉,而我们的实际表的操作的话,查:select。
以及insert
ok,我们先从这个新增开始
新增
语法:insert into 表名 values(列,列,列);
比如我新建了一个表
现在我往里面插入一条数据:
这显示成功添加了,我们可以暂时使用这个select 命令进行查讯,后面将会有详细的说明
使用select
值得注意的是,如果这里的name没有正确显示出来,多半是创建数据库的时候没指定正确的字符集
一般们指定是utf-8和gbk
接着我们看下这个有意思的插入
第一列不是int类型吗?第二列不是字符串类型嘛?为什么插入的时候,我写反了,也可以正确插入呢?
这是因为MySQL中,当我们用字符串来添加int的属性时,字符串会尝试自动转换int,同理,
当我们的用int来添加字符串的属性时,字符串会尝试自动转换为字符串。
而上述的转换,称为隐式转换。
这里涉及到一个点
支持隐式类型转换的,称为“弱类型系统”
不太支持隐式类型的,称为:“强类型系统”
弱类型呢,是在运行时检查的,强类型呢,是在编译时检查的。
ok,回归主题。
insert操作还可以指定列插入
指定列插入:
语法:insert into 表名(列,列……)values(值,值,值);
比如,我按照上面的那个表,指定商品和价格插入
很显然,当我们有些列未指定的时候,数据库会自动填充为null。
上面看到,指定列,插入的时候,可以指定多个列,可以联想到,insert 操作也可以进行一次性插入多个,提升效率
一次性插入多行
语法:insert into 表名 values(值),(值),(值);
例子:
有个问题?为什么有些使用一次性插入多个数据呢?
这里要提到MySQL是一个客户端——服务器结构的程序!
所以,我们创建多条数据时,一条条去创建,交互次数多,会增加MySQL的开销。
如若,我们一次性插入多个数据,有助于提高效率,除非数据差异过大,那么会有些明显的额影响。
insert 操作插入时间这个操作,提供了一个方法来自动填充数据。
方法(此例子)insert into artitle (create_date) values(now());
例子
ok,新增操作暂时介绍就这么些,总结一下:直接性的插入、指定列插入、一次性插入多个数据、插入时间。
那么接下来就是查询操作
查询
关键词呢就是:select
第一个操作
全列查询
语法:select * from 表名;
值得注意的是:
1.*是指通配符,可以代指所有列的意思
2.select * 是一个很危险的操作,因为我们当前所用的表,内容少,如若我们进行查询的表非常大,例如百亿千亿的数据量,就会触发大量的硬盘和网络上的I/O,可能会导致把宽带都占满,当其他客户进行查询的时候,就无法正常进行了。
指定列查询
语法:select 列名,列名…… from 表名;
查询时指定表达式
语法 :select 列名(加减乘除)数值,列名(加减乘除)数值,from 表名
值得注意的是,这些查询时指定表达式,出来的结果只是会储存在临时表中,对原有数据不产生影响。
当然,我们还可以引入多个列进行运算
例子:
我这里有一个学生表,然后,我们进行了语文、数学和英语成绩的相加。
但我们发现相加那一列里,表名有点长,那么又什么办法进行缩短它呢?
那就自然引入了as关键字
表达式取别名
语法:select 表达式 as 别名 from 表名;
例子:
当然,这个as也是可以省略的:
但是建议以后不使用,容易引起歧异,对代码的可读性有一定影响。
select操作还支持去重查询
去重查询
语法:select distinct 列名 from 表名;
例子:
select 操作还有一个较为重要的操作——排序操作
排序查询
语法:select * from 表名 order by 列 关键字
此处,我这里并没有进行关键字的填入,但也可以看到,Chinese列中也对其进行排序了
但值得注意的是,这是数据库中对其默认的升序排序了,
但是,如果没有指定结果集的顺序,数据库对其是不会做出任何承若的,所以建议是包含排序关键字。而且当有些行中的数值是相同的时候,它们结果也是不能进行保证。
比如升序的关键字:asc
降序排序关键字:desc
当然,order by也是可以支持多个列进行排序的
例子:
这里要说明的是这写结果是存放在临时表的,不对原来的数据产生影响。
还有,多列进行排序的话,是按照math排序完,然后再到Chinese,如若math相同
那么再按照Chinese进行降序排序。
ok,结束了排序查询,还有一个重要的条件查询。
接触语法之前,先看看这个表
语法:select 列名 from 表名 where 条件;
例子:查英语少于60分的同学
例子:查询语文分数大于数学分数
例子:查询总分低于200分的。
那要是给总分起个别名,用别名再去查询呢?
很遗憾,MySQL不支持这样的操作,会报错
有一个这样的解释:
1.遍历表,取出每一行
2.把当前行,带入到where条件,根据条件的真假决定这一行是否要查询出来
3.再根据select 后面写的列名/表达式,进行选择列计算
4.order by 进行排序。
例子:语文成绩大于八十分并且英语成绩也大于80分
例子:语文成绩大于80或者数学成绩大于80
值得注意的是,如果多个and和or,建议使用括号括起来。
例子:语文成绩在80-90
like模糊查询
like模糊查询,不要完全相等,只需要满足一定条件就行了。
%:匹配0个或者任意个字符
_:匹配1个特定的字符
首先我先插入几个数据先
%匹配:
接着来查询,以孙开头的数据
结尾为孙的名字
中间为孙的名字
_匹配
匹配任意一个字符
null查询
不要直接使用null查询,因为null与什么运算都是null。
例如
会显示为空
要使用安全的比较
或者
在 select* 中,如果一次性查询太多数据,可能会导致服务器挂掉,
所以更为稳妥的做法是采用数据库提供的分页查询
分页查询
语法:select 列名 from 表名 limit N;
例子:
当然,我们的limit 还可以搭配 offset进行使用
offset的意思是,从下标为几这样的地方开始算起
比如:
limit 还可以省略offset 操作,也可以达到以上效果。
比如:
这种写法有时候分不清3,5代表什么意思。
所以不建议使用,可读性较差。
查询操作暂且这么多,那么查询完后,还有个改!
修改
关键词是update
这个东西就是在改硬盘的数据了,而且是持久化的。
语法:update 表名 set 列名=值
还可以搭配条件进行使用
举个例子:
将孙悟空的数学成绩改为80;
值得注意的是,如若不搭配任何条件,仅将某列设置为一个数值,那么将会修改这整列数值。
非常危险!
修改这个挺简单的,那么最后说说这个删吧。
删除
关键词:delete
语法:delete from 表名 where 条件
注意添加条件,会使整个表的内容进行删除。
举个例子,把id=null的值进行删除
ok,删除也讲到这里。
那么一些数据的基础操作也讲到这里了。
完!