《SQL基础教程》笔记(3)

《SQL基础教程》 读书笔记

一些常见概念的对比和区分

1.DISTINCT使用

-- 取出数据表中的非重复数据
SELECT DISTINCT shohin_id 
    FROM Shohin;

-- 计算去除重复数据后的数据行数
SELECT COUNT(DISTINCT shohin_bunrui)
    FROM Shohin;

2.指定升序或降序

SELECT shohin_id, shohin_mei, shohin_tanka
    FROM Shohin
ORDER BY hanbai_tanka DESC;

3.别名

  • GROUP BY不可以使用别名
  • ORDER BY可以使用别名

4.聚合函数

只有SELECT和HAVING子句,以及ORDER BY子句中能够使用聚合函数

5.GROUP BY 和 ORDER BY

  • 使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的列。
  • 使用ORDER BY子句时,SELECT子句之外的列也可以使用。

6.插入默认值

CREATE TABLE ShohinIns
( shohin_id CHAR(4) NOT NULL,
  hanbai_tanka INTEGER DEFAULT 0, -- 销售单价的默认值设定为0PRIMARY KEY (shohin_id)
);

-- 通过显示方法插入默认值(在VALUES子句中指定DEFAULT关键字)
INSERT INTO ShohinIns (shohin_id, hanbai_tanka)
VALUES('0007',DEFAULT);

-- 通过隐式方法插入默认值(不使用DEFAULT关键字,只要在列清单和VALUES中省略设定了默认值的列就可以了)
INSERT INTO ShohinIns (shohin_id)
VALUES('007');

注:更推荐第一种方法,更加一目了然地知道hanbai_tanka列使用了默认值,SQL语句地含义也更加任意理解。

省略INSERT语句中的列名,就会自动设定为该列的默认值(没有默认值会设定为NULL)。

7.从其他表中复制数据

插入数据的方法,除了使用VALUES子句指定具体的数据之外,还可以从其他表中复制数据。

执行INSERT…SELECT语句时,可以在表之间进行数据传递,可以用于数据备份时候使用。

INSERT INTO ShohinCopy (shohin_id, shohin_mei, shohin_bunrui)
SELECT shohin_id, shobin_mei, shobin_bunrui
    FROM Shobin;

8.视图VIEW

视图包含“不能使用ORDER BY”和“可对其进行有限制的更新”两项限制。

删除视图需要使用DROP VIEW (<视图列名1>,<视图列名2>,...)语句。

视图的使用:

CREATE VIEW ShohinSum(shohin_bunrui, cnt_shohin) --视图的列名
AS
SELECT shohin_bunrui, COUNT(*)
    FROM Shohin
GROUP BY shohin_bunrui;

-- 视图的使用
SELECT shohin_bunrui, cnt_shohin
    FROM ShohinSum;

shohin_bunrui   cnt_shohin
衣服              2
办公用品            2
厨房用具            4

视图的限制1-定义视图时不能使用ORDER BY子句

视图的限制2-对视图进行更新

如果定义视图的SELECT语句能够满足某些条件,那么这个视图就可以被更新。例如:

  • SELECT子句中未使用DISTINCT
  • FROM子句中只有一张表
  • 未使用GROUP BY子句
  • 未使用HAVING子句

9.子查询

子查询就是一次性的视图(SELECT语句)。与视图不同,子查询在SELECT语句执行完毕之后就会消失。

由于子查询需要命名,因此需要根据处理内容来指定恰当的名称。

标量子查询就是只能返回一行一列的子查询。(是子查询返回一行一列,最终的查询并不一定。)

-- 直接在FROM子句中使用定义视图的SELECT语句
SELECT shohin_bunrui, cnt_shohin
    FROM ( SELECT shohin_bunrui, COUNT(*) AS cnt_shohin
            FROM Shohin
            GROUP BY shohin_bunrui
    ) AS ShohinSum;

子查询就是将用来定义视图的SELECT语句直接用于FROM子句当中。虽然“AS ShohinSum”就是子查询的名称,但由于该名称是一次性的,因此不会像视图那样保存在介质(硬盘)之中,而是在SELECT语句执行之后就消失了。子查询(subquery)就是”次级(sub)”的”查询(query)”。

标量子查询:

SELECT shohin_id, shohinmei, hanbai_tanka
    FROM Shohin
WHERE hanbai_tanka > (SELECT AVG(hanbai_tanka)
                      FROM Shohin);

SELECT AVG(hanbai_tanka)
    FROM Shohin;
-- 上面就是标量子查询,SELECT语句的查询结果是单一的值。

标量子查询的书写位置并不仅仅局限于WHERE子句中,通常任何可以使用单一值得位置都可以使用。也就是说,能够使用常数或者列名的地方,无论是SELECT子句、GROUP BY子句、HAVING子句,还是ORDER BY子句,几乎所有的地方都可以使用。

-- SELECT子句中使用标量子查询
SELECT shohin_id,
       shohin_mei,
       hanbai_tanka,
       (SELECT AVG(hanbai_tanka)
           FROM Shohin) AS avg_tanka
    FROM Shohin;

-- HAVING 子句中使用标量子查询
SELECT shohin——bunrui, AVG(hanbai_tanka)
    FROM Shohin
    GROUP BY shohin_bunrui
HAVING AVG(hanbai_tanka) > (SELECT AVG(hanbai_tanka)
                               FROM Shohin);

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/80461191