本文主要讨论数据库的增删改查。
一、新增(create)
1、单行数据全列插入
sql
insert into [(字段1,字段2)] values(值,值);
insert into 表示插入一条新数据行,字段就是定义表的字段名,可以是多个也可以是一个;按照字段名的顺序,设置对应的值。例如:
sql
insert into student (id,name) values (1,'张三');
就是往student表中的id和name字段添加数据。
如果列与值的数据不匹配就会报错,且这条记录无法写入数据表。
2、多行插入
就是在上面单行的基础上,多value一些数据,例如:
sql
insert into student (id,name) values (1,'张三'),(2,'李四'),(3,'王五');
执行所有的SQL时都有网络开销,写入数据时还会有磁盘IO的开销,每执行一条语句都会开启一个事务,事务的开启和关闭都需要消耗系统资源。
二、查询(select)
1、全列查询
简单来讲,全列查询就是列出该表的所有数据。
sql
select*from 表名;
select表示查询,*号表示查询表中的所有列,from为关键字。
**【注意】**全列查询是一个非常危险的操作;因为在实际工作中,数据库中的数据量会很庞大,使用该命令时就会消耗很多资源,导致服务器出现问题。
2、指定列查询
sql
select 列名... from 表名
例如:
sql
select id,name from student;
查询的结果也可以是一个表达式,我们可以在此基础上加减数值:
sql
select id,name,10 from exam;
--将英语成绩全部加10分
select id,name,English + 10 from exam;
--将语文,英语和数学成绩全部相加并命名为'总分'
select id,name,Chinese+English+math as 总分 from exam;
3、起别名(as)
上面使用的as就是用于起别名的关键字,可以将字段名修改我我们想要的名字。
sql
select 列名 [as] 别名 [, 列名 [as] 别名]... from 表名;
4、去重(distinct)
sql
select distinct 列名 from 表名;
使用distinct关键字可以去掉重复的数据。这里我们可以输入多个列名,只有所有列名对应的数据都相同才会判定为重复。去重后,重复记录只保留一条。
5、排序(order by)
排序规则:
- 升序:ASC
- 降序:DESC
desc既有查看表结构的作用,也有降序排列的作用。
sql
select 列名 from 表名 order by 列名 [ASC|DESC];
例如:
sql
select*from exam order by Chinese DESC;
表示查看exam表中的所有数据并按照语文成绩进行降序排列。
6、运算符
|-------------------|-----------------------------------------------|
| 运算符 | 说明 |
| >,<,>=,<= | 大于,小于,大于等于,小于等于 |
| = | 等于(MySQL中一个=号就表示等于),且NULL不安全 |
| <=> | 等于,且NULL安全(专门针对NULL判断) |
| !=,<> | 不等于 |
| BETWEEN a1 AND a2 | 在[a1,a2]范围中进行匹配,如果a1<=value<=a1,返回TRUE(1) |
| IN(option,...) | 如果是option中的任意一个,返回TRUE(1) |
| IS NULL | 判断是否为NULL |
| IS NOT NULL | 判断是否不为NULL |
| LIKE | 模糊匹配,%表示任意多个(包括0个)任意字符;_表示任意一个字符 |
这里说明一下LIKE,模糊匹配的意思是我们不清楚要查询的完整信息,只记得其中一部分,那么就可以使用LIKE来进行模糊匹配,比如我们想要查看character,但是忘记怎么拼写:
sql
show variables like '%chara%';
这样就能够查询到包含chara的数据。而_表示占位符,使用方式如下:
sql
show variables like 'ch_ra__er';
7、条件查询(where)
使用where语句的语法如下:
sql
select * from 表名 where 列名/表达式 运算符 条件;
条件查询时,首先要确定好给哪个列设置相应的条件。例如,需要查询英语成绩不及格的同学以及他们的英语成绩:
sql
select name,english from exam where english < 60;

同样我们可以实现更多条件查询:
sql
--查询语文成绩好于英语成绩的同学
select * from exam where chinese > english;
--查询总分在200以下的同学
select name,chinese + math + english where chinese + math + english < 200;
--查询语文成绩大于80分且英语成绩大于70分的同学
select * from exam where chinese > 80 AND english > 70;
在使用条件查询时如果想要使用起别名,就必须要将命令写完整,例如:
sql
select name, chinese + math + english as total from exam where (chinese + math + english) < 200 order by total asc;
这样看起来更加麻烦,所以一般还是不使用起别名的方式。
8、分页查询(limit)
前面说到全列查询是不安全的,那么分页查询就可以限制查询结果的条数。
分页查询的起始下标为0。
sql
--从0开始,筛选n条结果(可加条件、排序)
select ... from table_name [where...] [order by ...] limit n;
--从s开始,筛选n条结果(可加条件、排序)
select ... from table_name [where...] [order by ...] limit s,n;
--从s开始,筛选n条结果(可加条件、排序),相比与上面这种方法更加明确
select ... from table_name [where...] [order by ...] limit n OFFSET s;
如何判断任意一页的s取值?
s = (当前页号 - 1) * 每页显示的记录数量
三、修改(update)
修改的语法如下:
sql
update table_name set column = expr [,column = expr ...] [where ...] [order by ...] [limit ...]
例如,将学生张三的数学成绩修改为80分:
sql
--将学生张三的数学成绩修改为80分
update exam set math = 80 where name = '张三';
**【注意】**在update的时候,如果不加where条件,则修改的将会是整张表中的所有记录,是非常危险的操作!!
四、删除(delete)
删除语法如下:
sql
delete from table_name [where...] [order by ...] [limit...];
例如:
sql
--删除成绩表中小明的成绩
delete from exam where name = '小明';
--删除英语成绩倒数前三的同学的考试成绩
delete from exam order by english asc limit 3;
**【注意】**同样的,如果删除时不加限定,就会删除表中的所有数据,所以需要仔细。
在生产环境中一般不会使用Delete操作,一般会在表中加入一个deleteState的字段,用来表示这条记录是否删除,使用update操作去更新deleteState字段就可以实现删除功能。而该条被删除的数据并没有实质上删除掉而是始终存在于数据库中。