Head First SQL 第六章

来源:互联网 发布:淘宝店铺简介怎么写? 编辑:程序博客网 时间:2024/05/01 20:13

首先文章用影片分类的方式讲述了好分类和坏分类对于数据录入和查询的影响。

仅仅用 UPDATE 更新数据可能比较慢,这里要用一种超大型 UPDATE 方法。

那就是  CASE

UPDATE my_tableSET new_column =CASE  WHEN column1 = somevalue1THEN newvalue1  WHEN column2 = somevalue2THEN newvalue2  ELSE newvalue3END;

比如上面,要更新 new_column列的数据,可以用这种方法。



=======================================================================================

这里如果符合多个分类则取第一个分类执行。这就是问题所在。

所以我们应该在 WHEN 语句中加入 AND

例如:

WHEN cartoon = 'T' AND rating = 'G' THEN 'family'


然后我们需要一种方法来组织一下 SELECT 出的数据。比如选出A 开头分类为family 的影片 P251

SELECT title, category FROM movie_table WHERE title LIKE 'A%' AND category = 'Family';

如果影片超级多,这是很麻烦的,所以我们要使用 ORDER BY 这个命令。

SELECT 的时候,根据某个列的排序(ORDER)所返回的查询结果:

SELECT title, categoryFROM movie_tableWHEREtitle Like 'A%'ANDcategory = 'family'ORDER BY title;


如果是A-Z呢,还有数字呢?

SELECT title, categoryFROM movie_tableWHEREcategory = 'family'ORDER BY title;
去掉 'A%'就行了。


使用ORDER查询:


结果:


======================================================================================================

牢记:先后

NULL>数字>大写字母>小写字母



 

多列排序查询,优先第一列,第一列完了再排序第二列:


SELECT title, category, purchasedFROM movie_tableORDER BY category, purchased;

当然更多列也是可以的。

==================================================================

如果我们要反着来查询,比如先查Z开头的,那么在列名称后面加上关键字 DESC

DESC在 ORDER 里面不是 description 而是 descending(降序)

相应的,默认顺序是ASC(可以不写):P261

SELECT title, purchasedFROM movie_tableORDER BY title ASC, purchased DESC;


===============================================================

使用 SUM 为我们加总和。

我们要计算名为 Nicole 的人的饼干销量。

SELECT SUM(sales)FROM cookie_salesWHERE first_name = 'Nicole';


当然如果这里有很多人,一个一个算还是麻烦了点。
这里用 GROUP BY 来分组加总:

SELECT first_name, SUM(sales)FROM cookie_salesGROUP BY first_nameORDER BY SUM(sales)DESC;

AVG搭配GROUP BY计算平均数:

SELECT first_name, AVG(sales)FROM cookie_salesGROUP BY first_name;

MINMAX

SELECT first_name, MAX(sales)

FROM cookie_sales

GROUP BY first_name;

 

SELECT first_name, MIN(sales)

FROM cookie_sales

GROUP BY first_name;


 

COUNT返回指定列中的行数,这里是销售天数:

SELECT COUNT(sale_date)FROM cookie_sales;
这里实际上返回的是有记录的天数,应该和GROUP BY联合用:

SELECT first_name, COUNT(sale_data)FROM cookie_salesGROUP BY first_name;

===================================================================================

DISTINCT 选出与众不同的值:

SELECT DISTINCT sale_dateFROM cookie_salesORDER BY sale_date;

配合COUNT 返回销售天数最多的人:

SELECT COUNT(DISTINCT sale_date)FROM cookie_sales;


================================================================

如果结果很多,但是我们只想查询前一部分,那么使用LIMIT来限制数量:

SELECT first_name, SUM(sales)FROM cookie_salesGROUP BY first_nameORDER BY SUM(sales)DESCLIMIT 2;

这里只有两行。

如果我们只要第二名呢?

SELECT first_name, SUM(sales)FROM cookie_salesGROUP BY first_nameORDER BY SUM(sales)DESCLIMIT 1,1;

这里1,1指的是从第二条开始,只显示1条记录。注意所有编号是从0开始的,意思是0指的是第一条。









0 0