SQL必知必会 第二篇

第七课

        这一课介绍了什么是计算字段,如何创建计算字段,以及如何从应用程序中使用别名引用它们

        主要代码如下:

select vend_name + '(' + vend_country + ')'
from Vendors
order by vend_name;
select rtrim(vend_name) + '(' + rtrim(vend_country) + ')'
from Vendors
order by vend_name;
select rtrim(vend_name) + '(' + rtrim(vend_country) + ')'
	   as vend_title
from Vendors
order by vend_name;
select prod_id, quantity, item_price
from OrderItems
where order_num = 20008;
select prod_id, quantity, item_price, quantity*item_price as expanded_price
from OrderItems
where order_num = 20008;

        1. 去除空格的函数包括RTRIM,LTRIM以及TRIM

        2. 不建议用字符串来作别名的名字,如果要这样做,要括在引号里

小结:这一课介绍了计算字段以及如何创建计算字段。用例子说明了计算字段在字符串拼接和算术计算中的用途。此外。还讲述了如何创建和使用别名,以便应用程序能够引用计算字段。


第八课

        这一课介绍什么是函数,DBMS支持何种函数,以及如何使用这些函数;还将讲解为什么SQL函数的使用可能会带来问题

        主要代码如下:

select vend_name, upper(vend_name) as vend_name_upcase
from Vendors
order by vend_name;
select cust_name, cust_contact
from Customers
where cust_contact = 'michael green';
select cust_name, cust_contact
from Customers
where soundex(cust_contact) = soundex('michael green');
select order_num 
from Orders
where datepart(yy, order_date) = 2012;

        1. 由于不同的DBMS都有特定的函数,因此使用函数会使得程序的可移植性变差,如果要使用函数,应该做好代码注释

小结:这一课介绍了如何使用SQL的数据处理函数。虽然这些函数在格式化、处理和过滤数据中非常有用,但它们在各种SQL实现中很不一致


第九课

        这一课介绍什么是SQL的聚集函数,如何利用它们汇总表的数据

        主要代码如下:

select avg(prod_price) as avg_price
from Products;
select avg(prod_price) as avg_price
from Products
where vend_id = 'DLL01';
select count(*) as num_count
from Customers;
select count(cust_email) as num_cust
from Customers;
select max(prod_price) as max_price
from Products;
select min(prod_price) as min_price
from Products;
select sum(quantity) as items_ordered
from OrderItems
where order_num = 20005;
select sum(item_price*quantity) as total_price
from OrderItems
where order_num = 20005;
select avg(distinct prod_price) as avg_price
from Products
where vend_id = 'DLL01';
select count(*) as num_items,
	   min(prod_price) as min_price,
	   max(prod_price) as max_price,
	   avg(prod_price) as avg_price
from products;

        1. 聚集函数是对某些行运行的函数,计算并返回一个值    

        2. AVG只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出,AVG函数忽略列值为NULL的行

        3. COUNT函数进行计数,如果指定列名,则COUNT函数会忽略指定列的值为空的行,如果COUNT函数中用的是星号*,则不忽略

        4. MAX和MIN函数都忽略列值为NULL的行,一般不用这两个函数返回文本列

        5. SUM用来返回指定列值的和,SUM函数忽略列值为NULL的行

        6. DISTINCT不能用于COUNT(*),DISTINCT必须使用列名

        7. 在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名

小结:聚集函数用来汇总函数。SQL支持5个聚集函数,可以用多种方法使用它们,返回所需的结果。这些函数很高效,它们返回结果一般在客户端应用程序中计算要快的多


第十课

        这一课介绍如何分组数据,以便汇总表内容的子集。这涉及两个新SELECT子句:GROUP BY子句和HAVING子句

        主要代码如下:

select count(*) as num_probs
from Products
where vend_id = 'DLL01';
select vend_id, count(*) as num_probs
from Products
group by vend_id;
select cust_id, count(*) as orders
from Orders
group by cust_id
having count(*) >= 2;
select vend_id, count(*) as num_probs
from Products
where prod_price >= 4 
group by vend_id
having count(*) >= 2;
select vend_id, count(*) as num_probs
from Products
group by vend_id
having count(*) >= 2;
select order_num, count(*) as items
from OrderItems
group by order_num
having count(*) >= 3;
select order_num, count(*) as items
from OrderItems
group by order_num
having count(*) >= 3
order by items, order_num;

        1. GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集

        2. 在使用GROUP BY子句前,有一些重要的规定         

  • GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致的进行分组
  • 如果在GROUP BY子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(不能从个别的列取回数据)
  • GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名
  • 大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)
  • 除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出
  • 如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组
  • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前                   

        3. 有些SQL实现允许GROUP BY子句使用相对位置指定列,但容易出错

        4. HAVING过滤分组,而WHERE过滤行

        5. WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。WHERE排除的行不包括在分组中,这可能会改变计算值

        6. 使用HAVING时应该结合GROUP BY子句,而WHERE子句用于标准的行级过滤

        7. ORDER BY与GROUP BY的差别   

  • ORDER BY对产生的输出排序,而GROUP BY对行分组,但输出可能不是分组的顺序
  • ORDER BY对任意列都可以使用,GROUP BY只可能使用选择列或表达式列,而且必须使用每个选择列表达式
  • ORDER BY不一定需要,GROUP BY如果与聚集函数一起使用列(或表达式),则必须使用

        8. 一般在使用GROUP BY子句时,应该也给出GROUP BY子句,这是保证数据正确排序的唯一方法

小结:这一课讲授了如何使用GROUP BY子句对多组数据进行汇总计算,返回每个组的结果。我们看到了如何使用HAVING字句过滤特定的组,还知道了ORDER BY和GROUP BY之间以及WHERE和HAVING之间的差异。




猜你喜欢

转载自blog.csdn.net/weixin_42048278/article/details/80063931