假设有一个public_db库,一个info表
建库:
create database public_db;
建表:
DROP TABLE IF EXISTS info;
CREATE TABLE info (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
value INTEGER NOT NULL
);
插入语句:
insert into info value(996, 'NallY', 1002);
insert into info value(997, 'NallY', 1900);
insert into info value(998, 'NallY', 900);
insert into info value(999, 'NallY', 500);
insert into info value(990, 'Uinoh', 1080);
insert into info value(991, 'Uinoh', 980);
insert into info value(992, 'Uinoh', 520);
insert into info value(993, 'Pokyi', 730);
insert into info value(993, 'Pokyi', 1270);
显然最后一条会报错,因为主键重复了,删除主键:
alter table info drop primary key;
然后就可以进行插入了,但是一般一个表都会有主键,这是为了查询方便。我这里只是为后面的内容做铺垫,所以删除了主键。
现在表里的数据就是:
mysql> select * from info;
+-----+-------+-------+
| id | name | value |
+-----+-------+-------+
| 990 | Uinoh | 1080 |
| 991 | Uinoh | 980 |
| 992 | Uinoh | 520 |
| 993 | Pokyi | 730 |
| 996 | NallY | 1002 |
| 997 | NallY | 1900 |
| 998 | NallY | 900 |
| 999 | NallY | 500 |
| 993 | Pokyi | 1270 |
+-----+-------+-------+
9 rows in set (0.00 sec)
如果要查询到 id, name, 以及不同name下value的和,且需要value大于1000,根据这个条件,写出如下查询语句:
mysql> select id, name, sum(value) as sum_value from info group by id, name having sum_value > 1000;
+-----+-------+-----------+
| id | name | sum_value |
+-----+-------+-----------+
| 990 | Uinoh | 1080 |
| 993 | Pokyi | 2000 |
| 996 | NallY | 1002 |
| 997 | NallY | 1900 |
+-----+-------+-----------+
4 rows in set (0.01 sec)
看起来很奇怪,因为正常情况下id和name应该是一一对应的关系,这里主要是having子句
的使用,常与group by一起使用,目的是将分组后的组合进行筛选,这与where子句
先进行条件筛选不同。
什么意思?其他的数据可能会产生误导,所以仅仅看id=993这条记录就可以理解了,它有两个值:730和1270,如果使用where,那么必然最后的结果集sum的时候不会看到730这条记录,因为sum之前已经被where过滤掉了。但是having却是恰恰相反,可以达到我们的目的。
备份与恢复
将整个库备份到.sql文件:
mysqldump -uroot -p123456 public_db > /tmp/test_db.sql
恢复前,如果源数据被删除,需要重新建立数据库,再执行下面的恢复语句:
mysql -uroot -p123456 test_db < /tmp/test_db.sql