mysql笔记-- mysql命令札记3

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)

3.6.4. 拥有某个字段的组间最大值的行

任务:对每项物品,找出最贵价格的物品的经销商。

可以用这样一个子查询解决该问题:

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笔记-- mysql命令札记3)