目录
- 前言
- 1. 新增
- 1.1 指定列插入
- 1.2 一次插入多行
- 2. 查询
- 2.1 全列查询
- 2.2 指定列查询
- 2.3 表达式查询
- 2.4 带别名的查询
- 2.5 去重
- 2.6 查询的时候进行排序
- 根据某个列来排序
- 根据表达式来排序
- 根据多个列来进行排序
- 2.7 条件查询
- 举例
- 2.8 分页查询
- 3. 修改
- 4. 删除
- 注释
- warnings
前言
增删改查(CRUD),是数据库非常基础的部分,也是后端开发日常工作中,最主要的一项工作
1. 新增
insert into 表名 values(值,值……);
此处的值的个数和类型要和表结构相匹配
使用单引号或者双引号来表示字符串,SQL没有字符这个类型
1.1 指定列插入
insert into 表名(列名,列名……) values(值,值……);insert into student (name) values ('lisi');
此时的值就要和前面的列相匹配
在指定列插入的时候,未被填写的其他列就会被填充为默认值
1.2 一次插入多行
insert into 表名 values(值,值……),(值,值……);insert into student values (3, 'wangwu'), (4, 'lisi');
一次插入多行记录,相比于一次插入一行,分多次插入要快
datetime类型如何插入呢?
可以使用一个固定格式的字符串,来表示时间 举例:‘2000-01-01 12:00:00’
create table student (id int, name varchar(20), birthday datetime);
insert into student values (1, 'zhangsan', '2000-01-01 12:00:00');
如果想填写的时间日期就是当前时刻。sql提供了一个现成的函数,now()
2. 查询
sql中的增删改都非常简单,查询比较多样
2.1 全列查询
select * from 表名;
把表中的所有行和所有列都查询出来。
*表示通配符,可以代指所有的列
这里查询出来之后,服务器通过网络,把这些数据返回给客户端,并且在客户端以表格的形式打印出来
select * 操作也是一个危险的操作!
mysql是一个客户端-服务器结构的程序。客户端的操作都会通过请求发送给服务器,服务器查询的结果也会通过响应返回。
当数据量很大的时候,这个操作可能把硬盘IO跑满,也可能把网卡宽带跑满,会非常慢,导致客户端无法顺利访问到数据库,进一步对整个系统造成影响
2.2 指定列查询
select 列名,列名…… from 表名;
一个表的列数可能是非常多的,某些场景下,只需要关注其中的几个列
先创建一个表
create table exam_result (id int,name varchar(20),chinese decimal(3,1),math decimal(3,1),english decimal(3,1));insert into exam_result (id, name, chinese, math, english) values(1,'唐三藏', 67, 98, 56),(2,'孙悟空', 87.5, 78, 77),(3,'猪悟能', 88, 98.5, 90),(4,'曹孟德', 82, 84, 67),(5,'刘玄德', 55.5, 85, 45),(6,'孙权', 70, 73, 78.5),(7,'宋公明', 75, 65, 30);
select name, chinese from exam_result;
2.3 表达式查询
就是一遍查询一遍进行计算。在查询的时候,写作由列名构成的表达式,把这一列中的所有行都代入到表达式中参与运算
举例:想查询所有同学语文减十分后的结果
select name, chinese - 10 from exam_result;
这个操作不会修改数据库服务器上的原始数据,只是在最终响应里的临时结果中做了计算。
mysql中进行查询的时候,是把服务器这里的数据读出来,返回个客户端,并且以临时表的形式进行展示
举例2:查询所有同学总分
select name, chinese + math + english from exam_result;
表达式查询,是列 和 列之间的运算,会把每一行都代入到这样的运算中。并不是行 和 行之间的
当然如果这个表达式比较复杂,此时查询结果不容易理解这个表达式到底是啥意思,为了解决这个问题,就引入了别名
2.4 带别名的查询
查询的时候给 列/表达式 指定别名(表也能指定别名)
这列的as是可以省略的,但是并不建议这么做
select 表达式/列 as 别名 from 表名;
2.5 去重
查询时使用distinct修饰某个列/多个列,值相同的行就只会保留一个
select distinct 行名, 行名 from 表名;
修饰多个列的时候,只有在多个列的行都相同的情况下,才会去重
2.6 查询的时候进行排序
查询时候将行进行排序
需要指出
- 针对那个列作为排序的规则
- 排序的时候是升序还是降序
根据某个列来排序
select 列名 from 表名 order by 列名 asc/desc;
select后面的列名表示要查询的列(待会将展示出来的列)
order by后面的列是指定某个列作为排序规则,即使不展示出来也不影响排序
asc代表升序,desc代表降序。如果不写排序规则,默认是升序排序
排序是以行为单位的
把排序请求发给服务器后,服务器进行查询数据,并且把查询到的结果进行排序之后,在组织成响应数据返回给客户端
如果一个sql不加order by此时查询的结果数据的顺序是“不确定的”/“无序的”,
如果不加order by代码就不应该依赖上序顺序展开一些逻辑,数据库没有承诺过这个数据是有顺序的。
根据表达式来排序
order by还可以根据表达式来进行排序
select name, math + chinese + english as total from exam_resultorder by total desc;
根据多个列来进行排序
order by后面可以写多个列,使用,分开
select * from exam_result order by math desc, chinese desc ;
这段代码的意思是先根据math来进行排序,如果math相同,则根据chinese来进行排序。当有多个列的时候,写在越前面的优先级越高。
2.7 条件查询
会指定具体的条件,按照条件针对数据进行筛选
select 列名 from 表名 where 条件;
条件会遍历这个表的每一行记录,把每一行的数据分别代入到条件中,如果条件成立,这个记录就会被放入结果集合中。
如果条件不成立,这个记录就pass
比较运算符
- sql中没有==,是使用=表示相等。null参与运算的结果仍然是null,所以说null不安全。于是提供了<=>
- 不等于写 != 就行了,<>是上古时期的写法了
- between and是闭区间,并不是左闭右开区间
- 模糊查询不理解可以看下文的例子
逻辑运算符
逻辑与、或、非,在sql中是and、or、not
where条件可以使用表达式,但不能使用别名。
sql中and的优先级大于or,但是不建议大家记这个优先级,同事遇到时可以手动加()
举例
基本查询就不说了,简单举几个运算符的例子
-- and 和 or
-- 查询语文成绩大于80,且英语成绩大于80分的同学
select * from exam_result where chinese > 80 and english > 80;-- 查询语文成绩大于80分,或英语成绩大于80分的同学
select * from exam_result where chinese > 80 or english > 80;
-- between and
-- 查询语文成绩在[80,90]分的同学及语文成绩
select name, chinese from exam_result where chinese between 80 and 90;
-- 使用in来表示一个离散的集合
select name, math from exam_result where math in (58,76,87);
模糊查询
通配符就是一些特殊的字符,能够表示特定的含义
%:代表任意个数任意字符(0个字符也可以)
_:代指一个任意字符
-- 模糊查询% 查询姓孙的同学(名字就叫孙也能查出来)
select name from exam_result where name like '孙%';-- 模糊查询_ 查询姓孙的两个字同学名
select name from exam_result where name like '孙_';
select name from exam_result where name like '孙__';
-- 这样写就是查询姓孙的三个字同学名
2.8 分页查询
之前提到使用select * 这种方式查询是比较危险的,所以要保证一次查询不要查出来太多
limit 可以限制这次查询最多能查出来多少个结果
有的时候,数据非常多,一次全部显示出来,不但会影响效率也不方便用户去看。一般来说limit 是写到整个sql语句的最后
select * from 表名 limit N offset M;
N表示这次查询查出几个记录
offset是偏移量,M表示这次查询的这N个数据,是从第几个下标开始算
上述写法都属于最基础的查询操作
3. 修改
update 表名 set 列名 = 值, 列名 = 值 where 条件;
使用update 是可以一次修改多个列也可以只修改一个列
=出现在update里意思就是赋值,出现在where中就是相等
举例:将总成绩倒数前三的 3 位同学的数学成绩减 30 分update exam_result set math = math - 30 order by chinese + math + english limit 3;
4. 删除
delete from 表名 where 条件/ order by/ limit;
where条件和order by以及limit都是可以搭配的
不指定任何条件就是删除整张表的记录
这里的delete和drop table 不太一样
drop table是删除了表同时也删除了表里的记录
delete是只删除了表里的记录,表是还在的,只不过是一张空的表
delete和update 都是很危险的操作
修改和删除操作时会影响到数据库服务器硬盘中的数据
注释
sql中可以通过 – 表示注释(两横线一个空格)
warnings
有问题但是不严重就是警告
show warnings;
-- 展示警告