安迪_963

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

3.4 Getting Information About Databases and Tables

获取数据库和表格的信息

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

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

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

mysql> SELECT DATABASE();



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


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

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


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

注意,它展示的是结构,数据类型等信息,并不是表的完整信息
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去读取,并运行它。

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

如果你这样做,最好写一个脚本,然后执行这个脚本。
如果你想即使执行批处理文件发生了一些错误也要继续执行,那么你应该使用--force命令行参数(霸王硬上弓模式)
为什么要写脚本呢?
1.例如,有些语句,每天或者每周都要运行一次,写成脚本就能避免一次又一次的重复造轮子。
2.你可以从已经写好的脚本相似中复制,然后修改下就行了
3.批处理模式同样适用于你在开发多行语句时,如果你不小心弄错了,你不用重新输入,只需要修改正确,然后让mysql再次执行就可以 了
4.如果你的语句执行结果有茫茫多,你可以一页一页的输出,而不是看着它在你的屏幕上翻滚。
shell> mysql < batch-file | more

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

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


批处理的如下图

如果你说,我要用批处理模式,但是我也要交互模式的那种结果,那么你就应该使用:mysql -t.如果你想回显执行结果:mysql -V



下面两种形式都会执行文件
mysql> source filename;
mysql> \. filename

3.6 Examples of Common Queries

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

创建shop表:

article 是指物品,dealer指商人。

插入数据:



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

3.6.1 The Maximum Value for a Column

求某一列的极大值:

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

SELECT MAX(article) AS article FROM shop;

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);

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

另一种方法是用"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;


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

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

3.6.3 Maximum of Column per Group

对每一组的列取最大值

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

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

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);

这里也是将 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;


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;


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

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



 
posted on 2016-04-17 06:57  Andy_963  阅读(563)  评论(0编辑  收藏  举报