mysql 使用说明-3


3.4 Getting Information About Databases and Tables

获取数据库和表格的信息

如果你忘记了数据库或者表格的名字怎么办?或者给定的表格的结构怎么办?(例如你知道都有哪些列,叫什么名字吗)

mysql 有几种方法能解决这个问题

从前文你已经知道,可以通过Show databases;语句查看数据库,通过 Database()函数能知道当前选择的数据库

SELECT DATABASE();



如果你什么数据库也没选择,这条语句执行的结果是Null,如下图


通过下面的语句,可以查看当前数据库有哪些列表
SHOW TABLES;

mysql 查询增加序号从1开始_数据库

请注意,是Tables,而不是Tables(),没有这个函数


如果想查看数据库的结果,那么就可以用Describe语句,它会将数据库的每一列都展示出来
DESCRIBE pet;

mysql 查询增加序号从1开始_mysql 查询增加序号从1开始_02

注意,它展示的是结构,数据类型等信息,并不是表的完整信息
Field展示列的名字,Type是数据类型。NULL说明这一列可以插入Null值,key说明这一列是否被索引,default说明它的默认值,最后Extra说明特殊信息。如果某一列被 设成AUTO_INCRMENT,它的值会自动递增
如果某一列被索引了,那么可以通过Show INdex From Tbl_name查看相应信息。

3.5 Using mysql in Batch Mode

用mysql批处理模式。

在前面的章节中,你通过mysql的交互模式输入语句,并查看结果。事实上,你可以使用mysql的批处理模式。

要做到这点,你需要将要运行的语句写到文件中,然后告诉Mysql去读取,并运行它。

mysql < batch-file
batch-file
如果你的系统是window,而批处理文件里面包含一些特殊字符,那么,恭喜你,可能会发生一些错误,你可以这样做
mysql -e "source batch-file"
如果你需要通过命令行指定连接的参数,那么命令可以是这样的

batch-file
mysql -h host -u user -p < batch-file
host
user
batch-file
********
mysql < batch-file | more

batch-file
mysql < batch-file > mysql.out
batch-file
6.你可以将你的脚本展示给你的小伙伴,让它们也可以用它。
7.还有一些情况不能使用交互模式,如果在运行一个计划任务时,这种情况下,你必须使用批处理模式

当然,交互模式与批处理模式输出的结果形式可能有些不同


批处理的如下图
source filename;
filename
\. filename
filename
3.6 Examples of Common Queries

常见查询实例
这里以shop表 为例(本例使用test数据库)
首先进入数据库
mysql your-database-name

创建shop表:

your-database-name

创建shop表:
article 是指物品,dealer指商人。

插入数据:



现在来查看下刚才插入的数据:
SELECT * FROM shop;

mysql 查询增加序号从1开始_批处理_03

3.6.1 The Maximum Value for a Column

求某一列的极大值:

这里求哪件商品的序号最大

SELECT MAX(article) AS article FROM shop;

mysql 查询增加序号从1开始_数据库_04

3.6.2 The Row Holding the Maximum of a Certain Column

找出最贵的那件物品的商品序号,及商人
可以用一个子句:
SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

mysql 查询增加序号从1开始_mysql_05

这是相当于先把最大值求出,再将这个最大值作为查询条件使用。

另一种方法是用"Left Join" 或者用mysql的 LIMIT 子句将所有列降序排序,然后取第一行。
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price
WHERE s2.article IS NULL;

mysql 查询增加序号从1开始_mysql_06




SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

mysql 查询增加序号从1开始_mysql 查询增加序号从1开始_07

注:如果表中有多处19.95的商品,也就是说最高价商品有多个,那么这里由于Limit 1,只会显示其中一个。

3.6.3 Maximum of Column per Group

对每一组的列取最大值

这里求每一物品的最高价(因为不同商人价格不同,同一商品为一组)

SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article;

mysql 查询增加序号从1开始_数据库_08

3.6.4 The Rows Holding the Group-wise Maximum of a Certain Column

对具体的列,有最大值的那个组

对每一商品,求出价最高的商人(组,多人)
SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);




mysql 查询增加序号从1开始_批处理_09

这里也是将 Select Max(s2.price From shop s2 Where s1.articel = s2.article )作为一个子句的条件。


前面种方法利用了有相互关联的查询子句,可能导致效率低下。其他可能的能解决这个问题的方法是在From子句中使用相互不关联的子句。或者用Left Join

相互不关联的子句:
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
  SELECT article, MAX(price) AS price
  FROM shop
  GROUP BY article) AS s2
  ON s1.article = s2.article AND s1.price = s2.price;




mysql 查询增加序号从1开始_mysql_10

LEFT JOIN
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL;

mysql 查询增加序号从1开始_数据库_11

Left Join 只有当s1.price是最大值时,且s2.price也没有更大值,s2这行的值为NULL时才有效。

(发现没怎么理解,暂停......待续)