十二、汇 总 数 据
1、AVG() 返回某列的平均值:
SELECT AVG(p_price) AS avg_price FROM products;
只用于单个列 AVG() 只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个 AVG() 函数。`
2、COUNT() 返回某列的行数
SELECT COUNT(*) AS p_num FROM products;
COUNT() 函数有两种使用方式:
- 使用 COUNT(*) 对表中行的数目进行计数,不管表列中包含的是空值( NULL )还是非空值。
- 使用 COUNT(column) 对特定列中具有值的行进行计数,忽略NULL 值。
3、MAX() 返回某列的最大值
SELECT MAX(p_price) AS max_p FROM products;
对非数值数据使用 MAX() 虽然 MAX() 一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则 MAX() 返回最后一行。
4、MIN() 返回某列的最小值
SELECT MIN(p_price) AS min_p FROM products;
5、SUM() 返回某列值之和
SELECT SUM(p_price) AS sum_p FROM products WHERE p_id=520;
6、组合聚集函数:
SELECT AVG(p_price) AS avg_p, COUNT(p_id) AS cunt_p, MAX(p_price) AS max_p, MIN(p_price) AS min_p FROM products;
十三、分组数据
1、创建分组:分组是在 SELECT 语句的 GROUP BY 子句中建立的。
SELECT p_name,p_id AS num_p FROM products GROUP BY p_name;
2、过滤分组: WHERE 过滤指定的是行而不是分组,目前为止所学过的所有类型的 WHERE 子句都可以用 HAVING 来替代。唯一的差别是WHERE 过滤行,而 HAVING 过滤分组。
SELECT p_name,p_id AS num_p FROM products GROUP BY p_name HAVING p_id>=120;
3、分组和排序:虽然 GROUP BY 和 ORDER BY 经常完成相同的工作,但它们是非常不同的。
不要忘记 ORDER BY 一般在使用 GROUP BY 子句时,应该也给出 ORDER BY 子句。这是保证数据正确排序的唯一方法。千万不要仅依赖 GROUP BY 排序数据。
SELECT p_price,SUM(p_quantity*p_num) AS cun_p FROM products GROUP BY p_price HAVING cun_p>20 ORDER BY cun_p;
4、SELECT子句及其顺序:
- SELECT 要返回的列或表达式 ;
- FROM 从中检索数据的表;
- WHERE 行级过滤;
- GROUP BY 分组说明;
- HAVING 组级过滤;
- ORDER BY 输出排序顺序;
- LIMIT 要检索的行数。
十四、使用子查询
1、子查询:联系不同表,查找需要的信息。SELECT p_name,p_contact FROM customer WHERE p_id IN (SELECT p_id FROM others WHERE p_num IN (SELECT p_num FROM goods WHERE p_item='TNT2'));
1.逐渐增加子查询来建立查询 用子查询测试和调试查询很有技巧性,特别是在这些语句的复杂性不断增加的情况下更是如此。
2.用子查询建立(和测试)查询的最可靠的方法是逐渐进行,这与MySQL处理它们的方法非常相同。首先,建立和测试最内层的查询。
3.然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。这时,再次测试它。
4.对于要增加的每个查询,重复这些步骤。这样做仅给构造查询增加了一点点时间,但节省了以后(找出查询为什么不正常)的大量时间,并且极大地提高了查询一开始就正常工作的可能性。
十五、联结表
1、外键(foreign key):外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
2、创建联结:规定要联结的所有表以及它们如何关联即可。
SELECT p_name,c_num FROM products,customer WHERE products.id=customer.id ORDER BY p_name,c_num;
- 这两个表用 WHERE 子句正确联结, WHERE 子句指示MySQL匹配 vendors 表中的 vend_id 和 products 表中的 vend_id 。
- 完全限定列名:在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,MySQL将返回错误。
3、笛卡儿积(cartesian product): 由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
SELECT p_name,c_num FROM products,customer ORDER BY p_name,c_num;
这里返回的数据用每个供应商匹配了每个产品,它包括了供应商不正确的产品。实际上有的供应商根本就没有产品。
不要忘了 WHERE 子句 应该保证所有联结都有 WHERE 子句,否则MySQL将返回比想要的数据多得多的数据。同理,应该保证 WHERE 子句的正确性。不正确的过滤条件将导致MySQL返回不正确的数据。
4、内部联结:SELECT p_name,c_name,p_price FROM customer INNER JION products ON customer.id=products.id;
在使用这种语法时,联结条件用特定的 ON 子句而不是 WHERE子句给出。传递给 ON 的实际条件与传递给 WHERE 的相同。
使用哪种语法 ANSI SQL规范首选 INNER JOIN 语法。此外,尽管使用 WHERE 子句定义联结的确比较简单,但是使用明确的联结语法能够确保不会忘记联结条件,有时候这样做也能影响性能。
5、联结多个表:SELECT p_name,c_name,p_price,quantity FROM products,customer,other WHERE products.p_id=customer.p_id AND customer.c_id=other.c_id AND o_num=250;
性能考虑 MySQL在运行时关联指定的每个表以处理联结。这种处理可能是非常耗费资源的,因此应该仔细,不要联结不必要的表。联结的表越多,性能下降越厉害。