您的位置:首页 > 数据库 > MySQL

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

2015-10-14 11:49 501 查看
一.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不行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: