SQL必知必会学习笔记2

SQL必知必会学习笔记2

七、创建计算字段

1.计算字段

  存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或者格式化过的数据,而不是检索出数据然后再在客户端应用程序中更新格式化。

2.拼接字段

  将两个列拼接起来,需要使用操作符(+)或者(||)。

SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;

  以上语句是拼接一个name(country)的字段。如果需要去除拼接后填充的空格,可以使用RTRIM函数来完成。

SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name;

  RTRIM()函数去掉是右边所有空格,LTRIM()去掉的是左边的括号,以及TRIM()去掉两边的空格。

使用别名

  可以使用别名来表示计算字段,使用AS关键字赋予。别名也称为导出列。

SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;

3.执行算术计算

操作符 说明
+
-
*
/

  实例如下:

SELECT prod_id,quantity,item_price, quantity*item_price
AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

八、使用函数处理数据

1.使用函数

  大多数SQL实现支持以下类型的函数:

  • 处理文本字符串
  • 数值计算操作
  • 处理日期和时间,并从中提取特定成分。
  • 返回DBMS使用的特殊信息(如用户登录信息)的系统函数。

文本处理函数

函 数 说 明
LEFT() 返回字符串左边的字符
LENGTH() 返回字符串的长度
LOWER() 将字符串转换为小写
LTRIM() 去掉字符串左边的空格
RTRIM() 去掉字符串右边的空格
RIGHT() 返回字符串右边的字符
SOUNDEX() 返回字符串的SOUNDEX值
UPPER() 字符串转换为大写

  SOUNDEX是一个将任何文本转换为描述其语音表示的字母数字模式算法。可以进行发音匹配。举例,Customers表中有一个顾客Kids Place,其联系名为Michelle Green。如果这是错误输入,此联系名实际上应该是Michael Green,该怎么办?显然按照正确的联系名进行搜索不会返回数据。使用SOUNDEX函数进行搜索,匹配发音类似于Michael Green的联系名:

SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');

日期和时间处理函数

  SQL中检索2012年所有的订单,可以如下进行:

SELECT order_num
FROM Orders
WHERE DATEPART(yy, order_date) = 2012;

数值处理函数

函 数 说 明
ABS() 返回一个数的绝对值
COS() 返回一个角度的余弦
EXP() 返回一个数的指数值
PI() 返回圆周率
SIN() 返回一个角度的正弦
SORT() 返回一个数平方根
TAN() 返回字符串的SOUNDEX值

九、汇总数据

1.聚集函数

函 数 说 明
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

AVG()函数

  • 只能使用单个列
  • AVG()函数忽略值为NULL的行。

COUNT()

  两种使用方式:

  • 使用COUNT(*)对于表中行的数目进行技术,不管表列中包含的是(NULL)还是非空值。
SELECT COUNT(*) 
AS num_cust
FORM Customers
  • 使用COUNT(column)对特定列中具有值得进行计数,忽略NULL值。统计有值的个数。
SELECT COUNT(cust_email) 
AS num_cust
FORM Customers

MAX()和MIN()

  这两个将忽略NULL值。

SUM()函数

SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;

  返回订单中所有物品数量之和,WHERE子句保证只统计某个物品订单中的物品。

2.聚集不同值

  以上五个聚集函数都可以如下使用:

  • 对所有执行计算,指定ALL参数或不指定参数。
  • 只包含不同的值,指定DISTINCT。
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';

警告:DISTINCT不能用于COUNT(*)

3.组合聚集函数

  在一个语句中使用多个聚集函数:

SELECT COUNT(*) AS num_item, 
MIN(prod_price) AS price_max, 
AVG(prod_price) AS price_avg,
FROM PRoducts;

十、分组数据

1.数据分组

  如果要返回每个供应商提供的产品数目,该怎么办?这个时候就需要分组,使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。使用GROUP BY进行分组建立。

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;

  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子句之前。
  • GROUP BY可以基于相对位置进行分组,GROUP BY 2,1。

2.过滤分组

  要想对分组进行过滤,不能使用WHERE子句,WHERE过滤指定的是行而不是分组。需要使用HAVING子句

SELECT cust_id,COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;

  WHERE和HAVING配合使用

SELECT cust_id, COUNT(*) AS orders
FROM Orders
WHERE prod_price >= 4
GROUP BY cust_id
HAVING COUNT(*) >= 2;

  ORDER BY和GROUP BY配合使用

SELECT order_num, COUNT(*) 
AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;

十一、使用子查询

1.子查询

  我们迄今为止所看到所有的SELECT语句都是简单查询,子查询就是简单查询嵌套简单查询的方式进行查询,举例如下:

SELECT cust_id
FROM Orders
WHERE order_num IN
(SELECT order_num 
FROM OrderItems
WHERE prod_id = 'RGAN01')

  子查询都是从内到外进行处理。

2.使用完全限定列名

SELECT cust_name, cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customer.cust_id) AS orders
FROM Customers
ORDER BY cust_name;

  查询涉及多个表的时候要使用完全限定列名。 WHERE Orders.cust_id = Customers.cust_id

十二、联结表

1.联结

  SQL最强大的功能之一就是能在数据查询中执行联结(join)表。先来了解一下基础知识。

关系表

  举例:现在有同一供应商生产的多种物品,那么在何处存储供应商名、地址、联系方式等供应商的信息呢?见这些数据与产品信息翻开存储的理由:

  • 同一供应商的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;
  • 如果供应商信息发生变化,例如供应商迁址或者电话号码变动,只需修改一次即可。
  • 如果重复数据,则很难保证每次输入数据的方式都相同。不一致的数据在报表中就很难利用。

  相同数据出现多次决不是一件好事,这是关系数据库设计的基础,关系表的设计就是要把信息分解成多个表,一类数据一个表。各表通过某些共同的值相互关联。

  这个例子中可以建立两个表:一个存储供应商信息,一个存储产品信息。Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识。此标识称为主键,可以是供应商ID或任何其他唯一值。PRODUCT表只存储产品信息,除了存储供应闪ID外,不存储其他有关供应商的信息。

为什么使用联结

  关系表带来了有效存储,跟方便的处理,但如果数据存储在多个表中,怎样用一条SELECT语句就检索出数据呢?答案就是联结

2.创建联结

SELECT vend_name, prod_name, prod_price, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

  从两个表中获取数据,就是联结,用WHERE语句进行正确的联结,vend_id进行匹配。要使用完全限定名。

笛卡尔积 由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目僵尸第一个表中函数乘以第二个表中的行数。返回笛卡尔积的联结,也成叉联结。

内联结

  前面的例子是等值联结,这种联结也成为内联结,可以使用不同的语法来指明它:

SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

联结多个表

SELECT vend_name, prod_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;

警告:性能考虑:DBMS在运行时关联指定的每个表,已处理联结。这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性能下降越厉害。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容

  • 表 存储在表中的数据是同一种类型的数据或清单。 数据库中的表有为一个名字来标识自己。 表具有一些特性,这些特性定义...
    蛐蛐囍阅读 1,307评论 0 7
  • 本书所用的表: 第一章:了解SQL 数据库:保存有组织的数据的容器(通常是一个文件或一组文件)。 数据库软件:DB...
    狼牙战士阅读 900评论 0 1
  • 注:这一系列的文章是《SQL必知必会》第四版的读书笔记。 7.创建计算字段 什么是计算字段,怎么创建计算字段,以及...
    zuyuxia阅读 332评论 0 0
  • 数据库入门 数据库: 保存有组织的数据的容器(通常是一个文件或一组文件).数据库软件应该称为 DBMS(DataB...
    Mjericho阅读 496评论 0 0
  • 笔记本电脑都是已经每家必备的了,在使用的过程中时间久了难免会出现一些问题,这次电脑管家就跟大家聊一聊你的笔记本是不...
    Angelo_s阅读 2,443评论 0 3