SQL学习笔记(四)
一 视图
1.1 什么是视图
从我们使用的角度来说视图就是一张表。但是实际上视图并不是一张真正的表,因为他并没有真正的保存数据。视图实际上保存的是select语句。我们在从视图中查询数据的时候,实际上是执行该select语句创建出一张临时表。
1.2 创建视图的语法
CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
AS
<SELECT语句>
1.3 使用视图查询
使用视图查询和正常表相同直接,在from后写视图名称即可。
ps:最好不要在视图的基础上再创建视图,多重视图会降低sql性能。
1.4 视图的限制
- 定义视图时不能使用order by子句 (有些数据库也是支持的)
- 不能更新视图(有些情况下也是支持的)
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 函数的分类
- 算数函数
- 字符串函数
- 日期函数
- 转换函数
- 聚合函数
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 常见谓词
- like
- between
- is null, is not null
- in
- 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;