3.5. 在批处理模式下使用mysql
将要输入的命令组成一个文件,然后导入进去,执行一批的命令;
| kevin.bat file show databases; use xu; show tables; desc test2; select * from test2; kevin@xu:~$ mysql -uroot -p < kevin.bat Enter password: Database information_schema kevin mysql performance_schema test xu Tables_in_xu test test2 Field Type Null Key Default Extra name varchar(20) YES NULL subname varchar(20) YES NULL telephone int(20) YES NULL address varchar(50) YES NULL name subname telephone address kevin xu 1231451 shenzhen sherry xu 1222451 shenzhen kevin@xu:~$ |
如果你想在语句出现错误的时候仍想继续执行脚本,则应使用--force命令行选项。
为什么要使用一个脚本?有很多原因:
- 如果你需要重复运行查询(比如说,每天或每周),可以把它编成一个脚本,则每次执行时不必重新键入。
- 可以通过拷贝并编辑脚本文件从类似的现有的查询生成一个新查询。
- 当你正在开发查询时,批模式也是很有用的,特别对多行命令或多语句命令序列。如果你犯了一个错误,你不必重新输入所有内容,只需要编辑脚本来改正错误,然后告诉mysql再次执行脚本。
- 如果你有一个产生多个输出的查询,你可以通过一个分页器而不是盯着它翻屏到屏幕的顶端来运行输出:
· shell> mysql < batch-file | more
- 你可以捕捉文件中的输出以便进行进一步的处理:
· shell> mysql < batch-file > mysql.out
- 你可以将脚本分发给另外的人,以便他们也能运行命令。
- 某些情况不允许交互地使用,例如, 当你从一个cron任务中运行查询时。在这种情况下,你必须使用批模式。
当你以批模式运行mysql时,比起你交互地使用它时,其默认输出格式是不同的(更简明些)。
使用方式;必须加上mysql -t。为了回显以输出被执行的命令,使用mysql -vvv
mysql> source filename;
mysql> \. filename
| kevin@xu:~$ mysql -uroot -p -t Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 46 Server version: 5.5.35-0ubuntu0.12.10.2 (Ubuntu) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql> mysql> source /home/kevin/kevin.bat +--------------------+ | Database | +--------------------+ | information_schema | | kevin | | mysql | | performance_schema | | test | | xu | +--------------------+ 6 rows in set (0.00 sec) Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed +--------------+ | Tables_in_xu | +--------------+ | test | | test2 | +--------------+ 2 rows in set (0.00 sec) +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | subname | varchar(20) | YES | | NULL | | | telephone | int(20) | YES | | NULL | | | address | varchar(50) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) +--------+---------+-----------+----------+ | name | subname | telephone | address | +--------+---------+-----------+----------+ | kevin | xu | 1231451 | shenzhen | | sherry | xu | 1222451 | shenzhen | +--------+---------+-----------+----------+ 2 rows in set (0.00 sec) |
3.6. 常用查询的例子
3.6.1. 列的最大值 max()函数;
| select max(arg) from test -------------- +----------+ | max(arg) | +----------+ | 20 | +----------+ 1 row in set (0.00 sec) |
3.6.2. 拥有某个列的最大值的行
| mysql> select name from test where arg=(select max(arg) from test) ; -------------- select name from test where arg=(select max(arg) from test) -------------- +--------+ | name | +--------+ | sherry | +--------+ 1 row in set (0.00 sec) |
3.6.3. 列的最大值:按组
| select max(name) ,sex from test as t1 group by arg; -------------- select max(name) ,sex from test as t1 group by arg -------------- +-----------+------+ | max(name) | sex | +-----------+------+ | kevin | M | | sherry | N | +-----------+------+ 2 rows in set (0.00 sec) |
任务:对每项物品,找出最贵价格的物品的经销商。
可以用这样一个子查询解决该问题:
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
3.6.5. 使用用户变量
mysql> select @min_arg:=min(arg), @max_arg:=max(arg) from test; -------------- select @min_arg:=min(arg), @max_arg:=max(arg) from test -------------- +--------------------+--------------------+ | @min_arg:=min(arg) | @max_arg:=max(arg) | +--------------------+--------------------+ | 18 | 20 | +--------------------+--------------------+ 1 row in set (0.00 sec) |
3.6.8. 根据天计算访问量
下面的例子显示了如何使用位组函数来计算每个月中用户访问网页的天数。
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
(2000,2,23),(2000,2,23);
3.6.9. 使用AUTO_INCREMENT
使用auto_increment 可以自动累加变量;
INSERT INTO test (name) VALUES ('a','b','c')等等,可单独插入某一列或多列;
(AUTO_INCREMENT列是多列索引的一部分),如果你在任何组中删除有最大AUTO_INCREMENT值的行,将会重新用到AUTO_INCREMENT值。对于MyISAM表也如此,对于该表一般不重复使用AUTO_INCREMENT值。
如果AUTO_INCREMENT列是多索引的一部分,MySQL将使用该索引生成以AUTO_INCREMENT列开始的序列值。。
要想以AUTO_INCREMENT值开始而不是1,你可以通过CREATE TABLE或ALTER TABLE来设置该值,如下所示:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
本文介绍了在MySQL中使用批处理模式执行命令的方法,包括如何创建脚本文件、使用--force选项处理错误以及批处理模式的优势。还提供了查询示例,如使用max()函数、按组获取最大值等,并展示了如何利用用户变量和AUTO_INCREMENT特性。
1180

被折叠的 条评论
为什么被折叠?



