一.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不行。