SQL学习笔记(四)

一 视图

1.1 什么是视图

从我们使用的角度来说视图就是一张表。但是实际上视图并不是一张真正的表,因为他并没有真正的保存数据。视图实际上保存的是select语句。我们在从视图中查询数据的时候,实际上是执行该select语句创建出一张临时表。

1.2 创建视图的语法

CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
AS
<SELECT语句>

1.3 使用视图查询

使用视图查询和正常表相同直接,在from后写视图名称即可。
ps:最好不要在视图的基础上再创建视图,多重视图会降低sql性能。

1.4 视图的限制

  1. 定义视图时不能使用order by子句 (有些数据库也是支持的)
  2. 不能更新视图(有些情况下也是支持的)

1.5 删除视图

drop view 视图名称

二 子查询

2.1 什么是子查询

子查询简单来说就像是一张一次性视图。子查询就是将用来定义视图的select语句直接用于from子句中。如下所示:

SELECT product_type, cnt_product
FROM ( SELECT product_type, COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type ) AS ProductSum;--------

这条sql在执行的时候会首先执行子查询,然后执行外层的select语句。
ps:子查询必须设定名称也就是用as设定别名。

2.2 标量子查询

2.2.1 什么是标量子查询

标量就是单一的意思,标量子查询就是必须返回一行一列的结果。也就是返回单一值的子查询。

2.2.2 在where中使用标量子查询

我们想要查询“查询出销售单价高于平均销售单价的商品。” 我们可能使用如下sql语句:

SELECT product_id, product_name, sale_price
FROM Product
WHERE sale_price > AVG(sale_price);

但是sql不允许在where子句中使用聚合函数。我们可以使用标量子查询来实现这个功能:

SELECT product_id, product_name, sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product);

2.2.3 标量子查询的书写位置

标量子查询可以在任何使用单一值的位置都可以使用。。也就是说,能够使用常数或者列名的地方,无论是SELECT 子句、GROUP BY 子句、HAVING 子句,还是ORDER BY子句,几乎所有的地方都可以使用。

三 关联子查询

3.1 什么是关联子查询

在子查询中添加where子句的条件,就是关联子查询。
ps:关联查询条件一定要写在子查询中。

四 基本函数

sql提供了许多方便的函数,帮助我们对数据进行处理。

4.1 函数的分类

  1. 算数函数
  2. 字符串函数
  3. 日期函数
  4. 转换函数
  5. 聚合函数

ps:函数的介绍按照mysql的提供的整理

4.2 算数函数

4.2.1 ads 绝对值函数

ABS(数值)

4.2.2 mod求余函数

求余函数

MOD(被除数,除数)

4.2.3 round函数四舍五入

ROUND(对象数值,保留小数的位数)

4.3 字符串函数

4.3.1 拼接函数 ||

字符串1||字符串2

ps: mysql 中使用concat函数对字符串进行拼接

4.3.2 length字符串长度函数

LENGTH(字符串)

4.3.3 lower小写转换

LOWER(字符串)

4.3.4 uppper大些转换

UPPER(字符串)

4.3.5 replace字符串替换

REPLACE(对象字符串,替换前的字符串,替换后的字符串)

ps:第一个参数是作用的字符串,可以是一个常量也可以是列名。第二个参数是被替换的字符串,如果不存在就跳过,第三个参数是替换后的字符串。

4.3.6 substring字符串的截取

SUBSTRING(对象字符串 FROM 截取的起始位置 FOR 截取的字符数)

4.4 日期函数

4.4.1 current_date当前日期函数

current_date

4.4.2 current_time当前时间函数

current_time

4.4.3 current_timestamp当前时间戳

current_timestamp

4.4.4 extract截取日期元素

extract(日期元素 from 日期)

4.5  转换函数

4.5.1 cast函数

CAST(转换前的值 AS 想要转换的数据类型)

4.5.2 COALESCE——将NULL转换为其他值

COALESCE(数据1,数据2,数据3……)

ps:mysql提供了类似的ifnull函数

4.6 聚合函数

聚合函数在之前的文章中介绍过了

五 谓词

5.1 什么是谓词

谓词也是函数的一种,是需要满足特定条件的函数,返回值必须是真值。

5.2 常见谓词

  1. like
  2. between
  3. is null, is not null
  4. in
  5. exists

5.3 like 模糊查询

like谓词是用来做字符串模糊查询,查询的规则是前方一致,中间一致和后方一致。
like的通配符%匹配0字符以上的任意字符串。另外还有_来代替%,代表任意一个字符。

5.4 between 范围查询

列 between 数字1 and 数字2。查询的结果是在数字1和数字2之间的列,范围包含数字1和数字2。

5.5 is null,is not null

判断值是否是null的时候不能用“=”,只能使用is null和is not null来判断。

5.6 in

语法

IN (值...);

可以用子查询作为in的值

IN (select...);

可以使用not in来排除值

Not IN (值...);

5.7 exsits

exsits判断参数中的条件是否有结果集返回。如果有就是true,没有就是false。通常来说 in + 子查询的都可以替换成exsits + 子查询。不过exsits的性能更好,所以推荐使用exsits。

六 case表达式

case表达式是sql重要的函数,为sql提供了条件选择的功能。熟练使用case表达式可以用sql实现复杂的功能。

6.1 搜索case表达式

语法:

CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
...
END

例子:

SELECT product_name,
    CASE WHEN product_type = '衣服'
    THEN 'A :' | | product_type
    WHEN product_type = '办公用品'
    THEN 'B :' | | product_type
    WHEN product_type = '厨房用具'
    THEN 'C :' | | product_type
    ELSE NULL
    END AS abc_product_type
FROM Product

6.2 简单case表达式

语法:

CASE <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
.. .
ELSE <表达式>
END

例子:

SELECT product_name,
    CASE product_type
    WHEN '衣服' THEN 'A :' | | product_type
    WHEN '办公用品' THEN 'B :' | | product_type
    WHEN '厨房用具' THEN 'C :' | | product_type
    ELSE NULL
    END AS abc_product_type
FROM Product;