本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql;
5. 中级语句
1. 视图
- 视图的概念:
视图是一个虚拟的表,不同于直接操作数据表,视图是依据SELECT语句来创建的。所以操作视图时会根据创建视图的SELECT语句生成一张虚拟表,然后在这张虚拟表上做SQL操作。
总结:“视图不是表,视图是虚表,视图依赖于表”。 - 创建视图
CREATE VIEW <视图名称>(<列名1>,<列名2>,…) AS <SELECT语句> - 修改视图结构
ALTER VIEW <视图名> AS <SELECT语句> - 更新视图内容
视图是虚表,不建议对其进行数据内容更改,更改会影响原表数据。
UPDATE <视图名> SET <列名1赋值> WHER <条件语句>; - 删除视图
DROP VIEW <视图名1> [ , <视图名2> …]
2.子查询
1. 子查询的概念
子查询指一个查询语句嵌套在另一个查询语句内部的查询,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。
子查询 相当于已一次性的视图,用完即删除。说白了,就是把多个sql语句合并起来。
2.嵌套子查询
SELECT <列名1>,<列名2>,
FROM (SELECT *
FROM (SELECT <列名1>
FROM <表名> WHERE cnt_product = 4))
嵌套子查询可以查询出结果,但是随着子查询嵌套的层数的叠加,SQL语句不仅会难以理解而且执行效率也会很差,所以要尽量避免这样的使用。
3. 标量子查询
标量就是单一的意思,那么标量子查询也就是单一的子查询,
我理解的: 通过嵌套查询的结果,就是一个单一的量。然后通过这个单一量再进行查询。因为是一个单一的量,所以就可以放到任何需要放到的位置上。
比如 where 条件语句里,group by语句中等等。
举例 1班成绩 2班成绩 列出1班中 所有大于二班平均成绩 的人。
解答:用一条sql解决这个问题时 2班的平均成绩查询 就算是是 标量子查询
4. 关联子查询
关联子查询就是通过一些标志将内外两层的查询连接起来起到过滤数据的目的
我理解的: 子查询时,whrer条件中继续要表1信息和表2信息
举例 1班成绩 2班成绩 列出 1班中 所有大于二班 对应姓氏 平均成绩 的人。
解答 获取平均成绩时 要根据表一的姓氏和表二相同的姓氏进行分组。然后再去查询
3其他函数
1.算数函数
1-1 : + - * 、
1-2 : ABS – 绝对值
1-3 :MOD – 求余数
1-4 :ROUND( 对象数值,保留小数的位数 )
2.字符串操作
2-1 : CONCAT(str1, str2, str3) -字符串拼接
2-2: LENGTH( 字符串 ) – 字符串长度
2-3 :LOWER( 字符串 ) – 小写转换
2-4: REPLACE( 对象字符串,替换前的字符串,替换后的字符串 )
2-5:SUBSTRING (对象字符串 FROM 截取的起始位置 FOR 截取的字符数)
截取的起始位置从字符串最左侧开始计算,索引值起始为1。
2-6:SUBSTRING_INDEX (原始字符串, 分隔符,n)
该函数用来获取原始字符串按照分隔符分割后,第 n 个分隔符之前(或之后)的子字符串,支持正向和反向索引,索引起始值分别为 1 和 -1。
3.日期函数
3-1:CURRENT_DATE – 获取当前日期
3-2:CURRENT_TIME – 当前时间
3-3:CURRENT_TIMESTAMP – 当前日期和时间
3-4:EXTRACT(日期元素 FROM 日期) 截取日期元素
4.转换函数
4-1:CAST(转换前的值 AS 想要转换的数据类型) – 类型转换
4-2:COALESCE(数据1,数据2,数据3……) - 将NULL转换为其他值
4.谓词
1. 谓词的概念
谓词就是返回值为真值的函数。包括TRUE / FALSE / UNKNOWN。
2. LIKE谓词 – 用于字符串的部分一致查询
%是代表“零个或多个任意字符串”的特殊符号
_是代表匹配任意 1 个字符
3. BETWEEN谓词 – 用于范围查询
BETWEEN是 闭区间,包含临界值。
4. IS NULL、 IS NOT NULL – 用于判断是否为NULL
5. IN谓词
IN ( 值1, 值2, 值3, … ) 可以和子查询进行搭配使用
6. NOT IN
7. EXIST
实际上即使不使用 EXIST,基本上也都可以使用 IN(或者 NOT IN)来代替
我理解的: ***** in ( sql语句 )
用 in 会先去 执行子查寻的sql语句,然后外部 根据该结果继续查询。
用exist 会把外部的sql进行执行,会拿到一条条(多条)数据。每一条数据通过exist判断 时候显示出来。
要多用not exists,而不用not in,也就是not exists查询的效率远远高与not in查询的效率
5.CASE表达式
1.语句结构
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.
.
.
ELSE <表达式>
END
2.常用做 select <列名> from <表名> 中 对列名展示的修改