MySQL数据库操作-1
https://developer.aliyun.com/article/1517096
查询结果去重
例如:
里面有221分的重复项,使用distinct关键字,如下
select distinct math + chinese + english as 总分 from exam_result;
他会把重复的去掉,只留下一个数据.
如果distinct指定多个列的话,则这些列的值都相同,才视为重复.
查询结果排序
单权重
使用order by 来对查询结果排序.可能是升序~~也可能是降序~~
例如,存在以下表:
以math的数据为权重,来对查询结果进行一个排序:
select id, math from exam_result order by math;
默认升序(从上往下递增)
或者在order by 权重 后面加一个 desc(descend)来让它以降序排序:
select*from exam_result order by math desc;
还可以使用asc表示升序.
但是,如果在查询的时候没有指定使用order by,则此时的查询结果的顺序时不可预期的.
多权重
如果一个order by 权重后面还有一个权重,形如:
select*from 表名 order by weight1, weight2, weight3.....
那么,排序就会先按照weight1的权重进行升序或者是降序排序,如果weight1这一列里面有相同的数据,那么这些相同的数据会根据weight2的权重进行升序或者是降序排序....以此类推.
条件查询
在筛选,查询的过程中指定查找的条件(符合条件的数据留下,不符合的去除)
描述条件
MySQL中使用一系列的运算符,搭配where来描述:
比较运算符
运算符 |
说明 |
< <= > >= |
小于,小于等于,大于,大于等于 |
= |
等于,NULL不安全,NULL = NULL的结果为NULL |
<=> |
等于,NULL安全,NULL <=> NULL结果为TRUE(1) |
between a0 and a1 |
范围匹配,[a0, a1], a0 <= value <= a1, 返回TRUE(1) |
in(ex1,ex2,ex3, ..... ) |
如果数据属于ex1,ex2,ex3,......其中任意一个,返回TRUE(1) |
is NULL |
是空(NULL) |
is not NULL |
不是空(NULL) |
like |
模糊匹配, %表示任意多个(包括0个)字符; _表示任意一个字符 |
不支持+=运算符
例如:查找英语分数<60的人
select*from exam_result where english < 60;
相当于对当前表进行遍历,取出每一条数据,看条件是否满足如果满足,这个记录就会被保留,作为结果集的一部分,否则这个记录就不会被记录,然后继续遍历下一个数据.
也可以直接拿两个列进行比较:
select*from exam_result where math > chinese;
但是要注意null的比较,例如:
如果使用=对含有null的表达式进行比较,结果还是null => 相当于false,其数据就不会被记录
所以要使用<=>来比较含有null的数据,例如 null <=> null 结果为true;
逻辑运算符
运算符 |
说明 |
and |
多个条件都为TRUE(1),结果才为TRUE(1) |
or |
任意条件为TRUE(1),结果才为TRUE(1) |
not |
条件为TRUE(1),结果为FALSE(0) |
注意:and 和 or 存在一个优先级问题, and 的优先级 > or 的优先级,所以先执行and ,后执行or
例如:
select*from exam_result where chinese > 80 and english > 80;
select*from exam_result where chinese > 80 or math > 80;
比较或者逻辑运算中的表达式查询
例如
select*from exam_result where math + chine + english< 250;
但是,条件查询里面的比较的对象不能是前面数据的小名,例如:
select id, math + chinese + english as total from exam_result where total < 250;
写下一个sql不是从前往后的执行, 执行顺序是有特殊规定的:
- 遍历每一行
- 把这一行带入到where后面的条件判断里面去
- 符合条件的结果,再根据select指定的列,进行查询/计算.
模糊查询
不要求元素完全相同,只要满足一定的规则就可以了,正则表达式就是模糊匹配的典型实现.
like支持两个用法:
- 使用 %表示0个或者n个字符,例如 '张%'就是匹配所有以张开头的数据,如果是'张三%',就匹配所有以张三开头的数据.同理'%张'是查询以'张'结尾的数据.若是'%张%',则是查询包含'张'的数据.
- 使用 _ 代表任意一个字符,例如'张_' ,就会匹配张开头,后面_可以代表任意的字符
例如:
select*from exam_result where name like '张%';
查询name中以'张'开头的数据有哪些
select*from exam_result where name like '张_';
分页查询
有时候数据量太大了,大量数据在一页里面显示, 查看者难免有时候会看不过来, 一方面系统压力也比较大,所以就设置了分页查询,这也是我们生活中经常看到的例子,如下:
对于一个表:
如果我只想看前三条,该怎么办?使用:
select * from exam_result limit 3;
如果需要选定某几条,可以使用offset来改变偏移量,可以类比数组,第一行数据的下标为0,第二行的数据下标为1,.....以此类推:
select * from exam_result limit 3 offset 1;
这种写法等价于:
select * from exam_result limit 1,3;
改
存在表:
使用update关键字来修改:
update 表名 set value1 = xx, value2 = xx, value3 =xx, ... where 条件
例如:
update exam_result set chinese = 60, math = 60, english = 60 where name = '张三';
结果如下:
但是如果加30之后超过了math的decimal(4,2)的范围,就会出现out of range 的异常
若对表中的chinses数据减半操作如下:
update exam_result set chinese = chinses / 2;
但是下面的执行结果出现了:
其中包含一个warnings
使用:show warnings; 来显示错误
结果如下:
Message:Data truncated for column 'chinses' at row 2;
意为数据截断,小数点后面不够用了,只能截断.错误出现在第二行
正常来讲,60.5 / 2 的结果为30.25,但是由于decimal(3,1)只能保留小数点一位,而0.25有两位小数,所以发生了截断,其中的0.05被直接舍弃.
注意:update这个操作非常危险!!!
删
使用delete,意为删除,是按照行(记录)来删除的.
delete from 表名 where 条件;
例如:
delete from exam_result where math <=> null;
同时也可以搭配like(模糊匹配);
直接删除表中的所有数据:
delete from 表名;
这种情况表还存在,但是表中的数据已经全部清除了.