目录
1.新增数据
1.1 单条插入
insert into 表名 values (值,值,……);
此处的值要对应表中的类型。字符串的表示方法可以用' '或者" "进行表示。
1.2 选择列插入
insert into 表名 (列名,列名,……) values (值,值,……);
那些没赋值的列的值得到的是设置的默认值。
1.3 多条插入
insert into 表名 values(值,值,……),(值,值,……),……;
这样一次插入多条数据,效率比一条一条地插入更高。因为数据库是“客户端--服务器”结构的程序,传输数据需要进行网络交互。就像拿快递一样,一次拿一个效率太低,等着好几个快递都到了再一起去拿,效率会高很多。
2.查询数据
这是表操作中最复杂最重要的一部分。
2.1 全列查询
select * from 表名;
这里的*表示通配符,可以代指所有列。select * 其实也是一个非常危险的操作,MySQL是一个“客户端--服务器”结构的程序,会通过网络进行交互,如果该表中的数据特别多,可能会出现一些问题:
- 读取硬盘,把硬盘IO跑满了,就会变得非常卡顿,程序的其他部分想访问硬盘就会非常慢。
- 操作网络,把网卡的带宽跑满了,其他客户端想通过网络访问服务器就非常慢。
这样的拥堵会让客户端无法顺利地访问到数据库,进一步的影响到了整个系统,相当于是数据库服务器挂了。
2.2 指定列查询
select 列名,列名,......from 表名;
2.3 字段表达式
select 字段表达式 from 表名;
将字段表达式当成一列来看,该列的值表示的是每一行的表达式计算结果。
null参与各种运算,结果都是null。
2.4 别名
select 列名/表达式 as 别名 from 表名;
as可以省略,但是不建议省略,避免将别名当成其他列名。
2.5 去重
select distinct 单列/多列 from 表名;
如果是修饰多列,当全部列的值都相等时才认为是重复的。
2.6 查询时排序
select 列名,列名......from 表名 order by 单列/多列 asc/desc;
排序的依据是order by 后面的列名,排序规则是asc(升序)/desc(降序),如果不写asc/desc,排列顺序默认为asc。
这里的desc与desc 表名中的desc虽然缩写一样,但是意思是不一样的,前者是describe(描述),后者是descend(降序)。
修饰单列时:
当修饰多列时,主要排序依据是靠近order by 的列(列1),次要的排序依据是远离order by的列(列2)。每列的排序规则可以不同,不写排序规则(asc/desc)时默认为asc,当列1的值相等时,根据列2的值使用该列的排序规则进行比较排序。
修饰多列时:
一个sql语句,如果不加order by,查询出的结果是无序的,是不能信任的数据。
2.7 条件查询
select 列名,列名......from 表名 where 条件;
2.7.1 运算符
比较运算符
运算符 | 说明 |
---|---|
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,null不安全,例如null = null的结果是null |
<=> | 等于,null安全,例如null <=> null的结果是true(1) |
!=,<> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0,a1],如果a0 <= value <=a1,返回true(1) |
IN (option,...) | 如果是option中的任意一个,返回true(1) |
IS NULL | 是null |
IS NOT NULL | 不是null |
LIKE | 模糊匹配,%表示任意多个(包括0个)任意字符;_表示任意一个字符(通配符) |
<>:远古时期的不等于符号,现在多用!=。
BETWEEN a0 AND a1:注意范围是闭区间,不是左闭右开。
IN (option,....):如果值在括号中存在,那返回true(1),反之返回false(0)。
LIKE:与文档中查找功能类似,%和_表示两个不同的通配符。
逻辑运算符
运算符 | 说明 |
---|---|
AND | 多个条件必须都为true(1),结果才是true(1) |
OR | 任意一个条件为true(1),结果为true(1) |
NOT | 条件为true(1),结果为false(0) |
AND/OR/NOT:与&& / || / ! 性质一样。
条件查询可以搭配字段表达式使用。
关于条件查询与别名之间的报错,下图中圈起来的报错信息为:在where语句中,有一个“total”不认识。select查询的大概顺序是:
- 遍历表中每一份记录
- 当前记录中的数据带入条件,根据条件筛选。
- 如果这个记录条件成立就保留,然后再进行列上的表达式计算。(别名在此步骤完成)
- 根据order by语句进行排序
这就是为什么条件语句中的别名识别不了,而排序语句可以识别到别名。
2.8 分页查询
select 列名,列名,……from 表名 limit n offset m;
n表示每页有几条数据,m表示每页的第一条数据在整个表中的下标(从表中的第m条数据进行分页)。不写offset时默认有offset 0。
3.修改数据
3.1 单列修改
update 表名 set 列名 = 值 where 条件;
不写条件会将所有行都选中。
3.2 多列修改
update 表名 set 列名 = 值,列名 = 值,...... where 条件;
3.3 修改时的注意事项
3.3.1 数据在被除的时候可能会发生截断
show warnings;
显示所有警告。
这两个是在截断的时候发出的警告,没有修改成功的那一行是因为null。
3.3.2 数据在修改时,可能会超出数值范围
4.删除数据
delete from 表名 where 条件/order by limit n offset m;
如果表名后面不写表名限制的话,即(delete from 表名;),将会删除整个表中的数据,这与"drop table 表名;"不同,delete 最多只能删完表里的数据,而表本身还会保留着,drop会把表里的数据连同表本身一起删除掉。
update和delete操作同样是很危险的操作,一旦条件没设置好,就会把不该动的数据给修改/删除掉。
(insert into 表名/select * from 表名/update 表名/delete from 表名)这些格式形态各异,增加学者学习和记忆成本,此命名格式可以说是我们日后编写程序接口格式的“反面教材”,设计一个东西要尽量确保接口风格一致。
5.数据库数据备份
为了防止因误操作导致数据丢失,需要及时备份,下面有三种备份方式:
- 数据库的数据都是存储在硬盘上的,以文件的形式体现,可以把这里的文件拷贝到另一台机器上,实现备份。这种备份方式称为全量备份,如果需要频繁修改备份数据,此方法效率较低。
- mysqldump 工具(mysql自带的程序),会把你的数据导出成一系列insert语句,可以把这些insert语句放到另一个mysql中运行,实现备份。这种备份方式可以是全量备份,也可以是增量备份。
- mysql中还有一个binlog功能,把mysql中的各种操作,通过日志记录下来,让另一个mysql根据binlog的内容执行,会得到一样的数据。这种备份方式是增量备份/实时备份。