天天看点

MySql:增删改查(CRUD)以及乱码编码解决(2)

一.update 更新现有的数据,还是针对上篇的例子,对张飞,关羽,赵云的工资都改成5000 update employee set salary=5000; 可以看到,三位将军的工资都变成了5000: +----+------+--------+------------+------------+----------+--------+------------ -------------------------+ |  1 | 张飞 |      | 1999-09-19 | 2010-10-10 | 将军     |   5000 | 百万军中取 上将首级犹如探囊取物      | |  2 | 赵云 |      | 2000-09-19 | 2011-10-10 | 常胜将军 |   5000 | 百万军左冲 右突如入无人之境          | |  3 | 关羽 |      | 1999-09-19 | 2010-10-10 | 汉寿亭侯 |   5000 | 温酒斩华雄 ,千里走单骑~过五关斩六将 | +----+------+--------+------------+------------+----------+--------+------------ -------------------------+

还可以对某个人的某个字段进行改变,张飞那么猛不可能只给5000吧,我们给他加薪加到10000. update employee set salary=10000 where name='张飞';

不但可以针对某个人某个字段进行更改,还可以对某个人的多个字段进行更改,最近刘备的集团经营不善,张飞薪水太高,我们要给他减2000,但是为了安抚他的心情,决定给他个称号: update employee set salary=8000 ,job=' 车骑将军' where name='张飞';

这个时候就变成这个样子啦: +----+------+--------+------------+------------+----------+--------+------------ -------------------------+ |  1 | 张飞 |      | 1999-09-19 | 2010-10-10 | 车骑将军 |  8000 | 百万军中取 上将首级犹如探囊取物      | +----+------+--------+------------+------------+----------+--------+------------ -------------------------+

赵云在长坂坡那么勇,也给他加加薪,在原有的基础上加1000: update employee set salary=salary+1000  where name='赵云';

这个时候就变成了 +----+------+--------+------------+------------+----------+--------+------------ -------------------------+ |  2 | 赵云 |      | 2000-09-19 | 2011-10-10 | 常胜将军 |   6000 | 百万军左冲 右突如入无人之境          | +----+------+--------+------------+------------+----------+--------+------------ -------------------------+

二.删除 delete from [表名] [条件];

删除表中所有数据: delete from employee; 或 truncate table employee; 两个语句是有区别的,delete from employee;是把整张表的记录一条条地删除,而truncate table employee;是直接把整张表删除,然后再创建一张与之前的表结构一摸一张的表出来。

删除名为关羽的数据: delete from employee where name='关羽';

三.查询 1.查询所有信息: 上篇文章已经说过查询表中所有信息的方法啦,这里再说一次: select* from [表名];

2.查询表中指定的字段: 查询name的字段:select name from employee; +--------+ | name   | +--------+ | 张飞   | | 赵云   | | 诸葛亮 | +--------+ 3.查询多个字段:select name,job from employee; +--------+----------+ | name   | job      | +--------+----------+ | 张飞   | 车骑将军 | | 赵云   | 常胜将军 | | 诸葛亮 | 武侯     | +--------+----------+

4.去掉重复: 在查询信息的时候可以去掉完全一样的信息: 比如张飞和赵云的性别是一样的,那么我们就去重复地查一下性别: select distinct gender from employee; +--------+ | gender | +--------+ |      | |   +--------+ 可以看到因为性别是一样的,而查出来的结果只显示性别,所以查出来的多条数据合并成一条数据显示出来了

5.对结果进行改变: 我们可以对查出来的结果进行一些改变,而不影响数据库上的数据,比如张飞他们的薪水太低了,看上去不好看,而老板又抠门不愿意实际地加工资,只好在查询结果上每个人加两千: select name,salary+2000 from employee; 可以看到他们的薪水都涨了2000,: +--------+-------------+ | name   | salary+2000 | +--------+-------------+ | 张飞   |       12000 | | 赵云   |        8000 | | 诸葛亮 |       14000 | +--------+-------------+

但是实际上,储存在数据库的数据还是没有改变的,我们可以使用一般的查询方法来看一下: +--------+--------+ | name   | salary | +--------+--------+ | 张飞   |  10000 | | 赵云   |   6000 | | 诸葛亮 |  12000 | +--------+--------+   (为了方便后面的例子展示,所以对表的结构进行修改:添加一个“奖金”字段,每个人的奖金都有5000,添加语句在前面的文章有介绍:“MySql:操作表的语句以及常用的字段类型”)

6.统计某个字段: 又到了月底要发薪水了,那么要统计一下每个人一共要发多少钱吧?可以这样: 总的工资=基本薪水+奖金; select name,salary+bonus from employee; +--------+--------------+ | name   | salary+bonus | +--------+--------------+ | 张飞   |        15000 | | 赵云   |        11000 | | 诸葛亮 |        17000 | +--------+--------------+

但是这样的表头不够明确,不能一眼就看出这是总工资,有没有方法把表头salary+bonus改成“总工资”呢? 可以这样查:select name,salary+bonus as '总工资' from employee; +--------+--------+ | name   | 总工资 | +--------+--------+ | 张飞   |  15000 | | 赵云   |  11000 | | 诸葛亮 |  17000 | +--------+--------+

7.where条件查询 查询名为诸葛亮的数据: select * from employee where name='诸葛亮';

查询基本工资大于9000的 select * from employee where salary>9000;

查询总工资大于10000的 select name as '姓名',salary+bonus as '总工资' from employee where salary+bonus>11000; +--------+--------+ | 姓名   | 总工资 | +--------+--------+ | 张飞   |  15000   |  | 诸葛亮 |  17000 | +--------+--------+

查询基本工资为10000,6000的信息: select *from employee where salary in (6000,10000);

查询所有姓张的: select name from employee where name like '张%';                     (百分号是代表‘张’后面可能是一个或多个任意字符)    +------+ | name | +------+ | 张飞 | | 张辽 | +------+

如果想查询的人姓名是只有两个字,而且姓张的,那么可以这样写: select name from employee where name like '张_';  

如果想查询的人姓名是只有三个字而且姓张的,那么可以这样写:

select name from employee where name like '张__';  

8.使用order by关键字查询进行结果排序; 例: 对基本薪水进行排序输出: select name,salary from employee order by salary; +--------+-------------+ | name   | salary      | +--------+-------------+ | 赵云   |        6000 | | 张飞   |       10000 | | 诸葛亮 |       12000 | | 庞统   | 100000.9999 | | 张辽   | 100000.9999 | +--------+-------------+

可以看到默认已经进行升序排序了,那么如何进行升序排序呢? select name,salary from employee order by salary desc;

+--------+-------------+ | name   | salary      | +--------+-------------+ | 庞统   | 100000.9999 | | 张辽   | 100000.9999 | | 诸葛亮 |       12000 | | 张飞   |       10000 | | 赵云   |        6000 | +--------+-------------+

对总工资进行排序: select name '姓名',salary+bonus '总工资' from employee order by  salary+bonus;

+--------+-------------+ | 姓名   | 总工资      | +--------+-------------+ | 赵云   |       11000 | | 张飞   |       15000 | | 诸葛亮 |       17000 | | 张辽   | 101500.9999 | | 庞统   | 102000.9999 | +--------+-------------+

9.聚合函数 (1)count 统计总数: 统计一共有多少个员工:select count(*)from employee; +----------+ | count(*) | +----------+ |        5       | +----------+

统计姓张的有多少个: select count(*) from employee where name like '张%'; +----------+ | count(*) | +----------+ |        2       | +----------+ (2)sum 统计所有人的基本工资一共多少: select sum(salary) from employee ; +-------------+ | sum(salary) | +-------------+ | 228001.9998 | +-------------+

统计所有人的总工资之和: select sum(salary+bonus) from employee; +-------------------+ | sum(salary+bonus) | +-------------------+ |       246501.9998 | +-------------------+

需要注意的是:只要有值为null参与计算那么整个计算也为null; 对于这种情况怎么处理呢? 我们使用ifnull(XX,0);进行处理,意思是如果XX为null则用0替代: select sum(ifnull(salary,0)+ifnull(bonus,0)) from employee;

计算所有员工的平均工资: select sum(salary+bonus)/count(*) '平均工资' from employee; +--------------------+ | 平均工资                 | +--------------------+ | 49300.399959999995 | +--------------------+

(3)avg----计算指定列的平均值 计算所有员工的平均基本工资:

select avg(salary) '平均基本工资' from employee;

+--------------------+ | 平均基本工资       | +--------------------+ | 45600.399959999995 | +--------------------+ 计算所有员工的平均工资:

select avg(salary+bonus) '平均工资' from employee;

+--------------------+ | 平均工资           | +--------------------+ | 49300.399959999995 | +--------------------+

(4)MAX/MIN 获取指定列的最大/小值 查出最多基本工资: select max(salary) from employee; 查出最少基本工资 select min(salary) from employee;

10.分组查询 select name ,birthday from employee group by birthday; 上面的group by brithday意思就是根据brithday分组。 我们来对比一下分组前和分组后: mysql> select name ,birthday from employee group by birthday; +--------+------------+ | name   | birthday   | +--------+------------+ | 张辽   | 1998-09-19 | | 张飞   | 1999-09-19 | | 赵云   | 2000-09-19 | | 诸葛亮 | 2001-01-01 | +--------+------------+ 4 rows in set (0.00 sec) mysql> select name,birthday from employee; +--------+------------+ | name   | birthday   | +--------+------------+ | 张飞   | 1999-09-19 | | 赵云   | 2000-09-19 | | 诸葛亮 | 2001-01-01 | | 庞统   | 1999-09-19 | | 张辽   | 1998-09-19 | +--------+------------+ 5 rows in set (0.00 sec)

可以看到庞统与张辽的出生日期是一样的所以把它们归为一组显示。 分组查询的时候还可以使用where,聚合函数对查询结果进行处理,这里不再多说。

11having having 的用法与where的用法差不多,它们的区别就在于,在分组查询的时候where是先过滤再分组,而having是先分组 然后再对分组的内容进行过滤。而且having子句可以使用聚合函数,而where不行。