目录
上一篇文章中我们谈论了对数据库的操作,对表的操作,那么接下来这篇文章我带你们来熟悉对表里面内容的操作。数据库中最最最核心的操作就是增删改查,简称也就是CRUD。
新增记录
一次插入一行
sql
1.下面这种情况的时候,values后面我们要填入的值要做到列的个数和类型要和创建好的表一一对应
在sql中没有字符这一说,所以在sql中我们用单引号还是双引号都可以
insert into 表名 values(值, 值, ......);
例: insert into student values(1,'张三');
2.我们也可以对指定列进行插入
这时候我们要保证后面填的值要和前面的对应位置的字段名的类型一致,当然前后括号的个数也要一致
insert into 表名 (表中字段名,表中字段名.....) values (值1, 值2.......);
例: insert into student (name) values('张三');
上面我们插入了中文,这就要保证我们创建数据库的时候编码类型要设置为utf8,如我我们数据库类型设置为了utf8还是报错,那么我们去查看表的类型是否为utf8,如果也是那我们就去看看对应的字段的编码方式是不是utf8,我相信大家将这些都设置为utf8肯定不会报错了。在下面我也讲解了,插入出错的时候怎么办。
一次插入多行
上面我们主要演示了一次插入一行的时候,我们插入数据的时候还可以一次插入多行。values后面有多个()就行,每个()用,分隔。
sql
insert into student values(1,'张三'),(2,'李四'),(3,'王五');
前两者插入的区别
前两者都可以正确将数据插入进去,只不过区别就在于速度。MySQL是一个客户端-服务器结构的程序,每次发送请求都要等服务器响应。一次插入多行会快很多,他请求一次,将要插入的数据全部传过去,服务器给他响应一次。而一条一条插入,客户端请求一次,服务器响应一次,当有很多数据的时候,效率大大降低。每次交互都会用到很多资源,一次一次的插入大量记录会浪费很多成本。
解决插入中文时报错
1.这里我们首先查看表的建立结构。语句是show create table 表名;
2.更改表的编码,语句是:alter table 表名 default character set utf8; 修改完以后我们再次查看,看是否更改成功。
3.再次插入,如果发现仍然报错,那么我们看对应的字段的编码为什么!也是通过第一步的语句。
4.仍然报错那就是字段的编码不正确,那么我们通过这个语句对字段编码进行修改:alter table 表名 change 字段名 字段名 设置的这个字段的类型 character set utf8; 字段名上的反引号不用带着
5.再次插入应该就没错了!(为了以防万一,创建数据库的时候一定要指定编码类型!!!)
查询记录
查询语句可以让我们看到数据库中的内容。我们查询出来的是个临时表,并不是原数据,所以查询时对表的操作并不会影响原表内容。
全列查询
这个查询会查询出表的所有行所有列。(其实不太建议这么图省事,如果你的数据很多,服务器会一直响应,无法再给其他客户提供服务)
sql
#下面语句的*是一个通配符表示,任意列
select * from 表名;
指定列查询
这里需要我们手动指定我们要查询哪一列或哪几列。
sql
select 列名,列名... from 表名;
查询的字段可以为表达式
查询的同时可以进行计算。(主要是列与列之间进行计算)
sql
select 字段,字段,表达式 from 表名;
#例子:
select name,math + 10 from student;
对于服务器返回给客户端的临时表,字段名与我们查询的一致,对于这种有表达式的,如果表达式很长,那么字段名可能会很长,我们不好再次进行操作,所以我们可以起别名。
查询的时候可以对列或者表达式起别名
SQL中可以对列名,表名起别名,都是用as,而且as可以省略,但是不建议省略。
sql
select 字段, 表达式 as 别名 from 表名;
#例:
select name, math + 10 as score from student;
查询时去重
去重要用到关键字distinct。
sql
#1.distinct后面只有一个字段的时候,会把重复的行去掉,只保留一个
select distinct 字段名 from 表名;
#查询指定列,因为有distinct,如果这个列有相同的值,则去掉一个重复行
#2.distinct后面可以有多个字段,当有多个字段的时候,只有满足多个字段值对应的值全部相等的时候
#才算重复,才会删除重复行。
select distinct 字段名,字段名 from 表名;
排序查询
如果我们查询的时候没有进行排序,服务器返回给客户端的临时结果集并没有固定顺序而言,我们每次查询可能恰巧返回都一样罢了,所以我们没有进行排序的时候,我们不应该依赖服务器返回给我们的结果集的顺序。
sql
#升序
select * from 表名 order by 列名 asc;
#降序
select * from 表名 order by 列名 desc;
#不指定升序降序的时候,默认为升序
select * from 表名 order by 列名;
#order by可以根据多个列进行排序
select * from 表名 order by 列名1,列名2 asc;
#先根据列名1进行排序,当列名1值相同时,根据列名2去比较
条件查询
我们先来介绍一下运算符
1.条件运算符
2.逻辑运算符
sql
select * from 表名 where 条件
我们要了解一下查询的执行过程:
1.首先会先把表中记录遍历一遍;
2.然后再将记录带入后面的条件判断是否符合,符合的话则放到临时结果集中,不符合就跳过这条记录。
前面我们提到过查询字段可以时表达式,我们条件中也可以有表达式的存在,但是在条件中的表达式不支持别名!
分页查询
针对查出来的结果进行截取,取其中一部分。
sql
#获取n条记录
select * from 表名 limit n;
#当有偏移量的时候
select * from 表名 limit n offset m;
#第一个sql没有写offset表示从0开始读n条记录。
#offset下标从0开始。
#第二句sql的意思是从下标为m的地方读取n条记录。
修改记录
修改的是服务器上的内容,不再是临时表的。
sql
#1.
update 表名 set 字段名 = 值 where.......;
#2.后面没有where条件,此时修改的是整个表
update 表名 set 字段名 = 值;
删除记录
sql
#1.
delete from 表名 where 条件;
#此时就会将符合条件的行删除掉
#2.没有指定where条件的时候,就会将整个表的数据全部删除
#此时表在,内容不在了。drop表的时候,内容不在,表也不在。
delete from 表名;