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
Enter password:host
-uuser
-p <batch-file
********
如果你这样做,最好写一个脚本,然后执行这个脚本。
如果你想即使执行批处理文件发生了一些错误也要继续执行,那么你应该使用--force命令行参数(霸王硬上弓模式)
为什么要写脚本呢?
1.例如,有些语句,每天或者每周都要运行一次,写成脚本就能避免一次又一次的重复造*。
2.你可以从已经写好的脚本相似中复制,然后修改下就行了
3.批处理模式同样适用于你在开发多行语句时,如果你不小心弄错了,你不用重新输入,只需要修改正确,然后让mysql再次执行就可以 了
4.如果你的语句执行结果有茫茫多,你可以一页一页的输出,而不是看着它在你的屏幕上翻滚。
shell>mysql <
batch-file
| more
5.你也可以将结果输出到文件,以做进一步的处理
shell> mysql < batch-file
> mysql.out
6.你可以将你的脚本展示给你的小伙伴,让它们也可以用它。
如果你说,我要用批处理模式,但是我也要交互模式的那种结果,那么你就应该使用:mysql -t.如果你想回显执行结果:mysql -V
7.还有一些情况不能使用交互模式,如果在运行一个计划任务时,这种情况下,你必须使用批处理模式
当然,交互模式与批处理模式输出的结果形式可能有些不同
批处理的如下图
下面两种形式都会执行文件
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时才有效。
(发现没怎么理解,暂停......待续)