4.复杂一点的查询
Posted Mrs.King_UP
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.复杂一点的查询相关的知识,希望对你有一定的参考价值。
文章目录
1.视图
1.1 视图是什么
- 视图和表在查询数据操作完全一样
- 视图是虚拟表,不同于直接操作数据表,没有保存实际数据,是从表中派生出来的
- 定义视图的方式可以使得用户看到的数据更加清晰
1.2 创建视图
- 单表视图
CREATE VIEW view_name
AS
SELECT column_name(s)
FROM table_name
WHERE condition
- 多表视图
可以在视图的基础上直接进行查询 - 注意
- 视图名在数据库中保持唯一
- 视图的创建可以基于真实表or其他视图(多重试图,不常用,会降低SQL性能)
- 创建视图不使用order by,数据行没有顺序可言
1.3 修改视图
可以直接修改视图结构,也可以将当前视图删除然后重新创建的方式达到修改的效果。
1.4 更新视图
视图是对基本表中部分数据的映射,所以对视图中数据的更新操作就是对基本表中部分数据的更新。
update productsum
set sale_price='5000'
where product_type='办公用品'
再次查看productsum视图,可以看到数据已经更新,原表中的数据也被更新了
- 当视图中包含聚合函数、Distinct关键词、group by子句、having子句、union或union all运算符、from子句中包含多个表时,这种视图是不可以被更新的
- 不推荐使用这种方式,在创建视图时也尽量使用限制不允许通过视图来修改表
1.5 删除视图
需要有相应的权限才能成功删除
drop view view_shop_product
2.子查询
2.1 子查询定义
一个查询语句嵌套子句在另一个查询语句的内部,子查询结果作为外层另一个查询的过滤条件。
2.2 子查询与视图的区别
子查询是一次性的,不会像视图那样保存在存储介质中,在select语句执行后就消失了。
AS studentSum
可以看作子查询的名称
SELECT stu_name
FROM (
SELECT stu_name, COUNT(*) AS stu_cnt
FROM students_info
GROUP BY stu_age) AS studentSum;
2.3 嵌套子查询
查询嵌套层数越多,SQL语句越难以理解,执行效率也会越差
2.4 标量子查询
一次只返回一个值,也就是某一行的某一列的值,通常用于where子句中,其实任何使用单一值的位置都可以使用。
- 查询销售单价高于平均销售单价的商品
- 查询出注册日期最晚的哪个商品
- 另一种使用方法
2.5 关联子查询
- 选取出各商品种类中高于该商品种类的平均销售单价的商品
上面语句的执行顺序:
- 首先执行不带where的主查询
- 根据主查询结果匹配product_type,获取子查询结果
- 将子查询结果再与主查询结合执行完整的SQL语句
3.练习
2.
不能插入数据到视图中,视图是基本表的映射,这一操作无法改变基本表的内容
3.请根据如下结果编写 SELECT 语句,其中 sale_price_avg 列为全部商品的平均销售单价。
4.关联子查询
:添加链接描述
4.各种函数
4.1 算数函数
- ABS(数值):计算一个数字的绝对值,当数值为NULL时,返回值为NULL
- MOD(被除数,除数):求余数,只能对整数列求余数,小数没有余数的概念
- ROUND(对象数值,保留小数的位数):四舍五入,当保留小数的位数为变量时,可能遇到错误,谨慎使用
4.2 字符串函数
- CONCAT(str1,str2,str3):拼接
- LENGTH(字符串):求字符串长度
- LOWER(字符串):针对英文字母字符串,转换成小写
- UPPER(字符串):针对英文字母字符串,转换成大写
- REPLACE(str1,str2,str3):字符串的替换,将str1中的字符串str2替换为str3
- SUBSTRING(str1 from a for b):字符串的截取,从字符串str1的a位置开始(索引的起始位为1),截取b个字符
- SUBSTRING_INDEX(str1,sep,num):字符串按索引截取,使用sep分割str1后,取前num个索引的子字符串(支持正向和反向,2-前两个,-2-后两个)
4.3 日期函数
- CURRENT_DATE:获取当前日期
- CURRENT_TIME:获取当前时间
- CURRENT_TIMESTAMP:获取当前日期和时间
- EXTRACT(日期元素 from 日期):日期元素有YEAR、MONTH、DAY、HOUR、MINUTE、SECOND
4.4 转换函数
- CAST(转换前的值 AS 想要转换的数据类型)
- COALESCE(数据1,数据2,数据3…):返回参数中从左侧开始第一个不是NULL的值
5.谓词
-
LIKE:部分一致性查询。’_'匹配任意1个字符,‘%’匹配多个字符。取最多记录的子字符串
-
BETWEEN:用于范围的查询,包含两个临界值。
-
IS NULL, IS NOT NULL:选取某些值为NULL的列的数据,不能使用=,而只能使用特定谓词
-
IN,NOT IN:多个查询取并集可以选择用or语句,但不够方便,使用IN选择,但是无法选择出NULL数据
-
使用子查询作为IN谓词的参数
子查询是从最内层开始执行的(由内而外),因此,上述语句的子查询执行之后,sql
展开成下面的语句。
-
EXISTS:判断是否存在满足某种条件的记录,如果存在就为真(True),不存在为假(False)。EXISTS可以用来替换IN,NOT IN可以用NOT EXIST替换。
6.CASE表达式
6.1 根据不同分支得到不同的值
SELECT product_name,
CASE WHEN product_type = ’衣服’ THEN CONCAT(’A : ’,product_type)
WHEN product_type = ’办公用品’ THEN CONCAT(’B : ’,product_type)
WHEN product_type = ’厨房用具’ THEN CONCAT(’C : ’,product_type)
ELSE NULL
END AS abc_product_type
FROM product;
-- 默认else null,可不写;END不可省略
6.2 实现列方向上的聚合
通常写法
SELECT product_type,
SUM(sale_price) AS sum_price
FROM product
GROUP BY product_type;
CASE写法
SELECT SUM(CASE WHEN product_type = ’衣服’ THEN sale_price ELSE 0 END) AS
sum_price_clothes,
SUM(CASE WHEN product_type = ’厨房用具’ THEN sale_price ELSE 0 END) AS
sum_price_kitchen,
SUM(CASE WHEN product_type = ’办公用品’ THEN sale_price ELSE 0 END) AS
sum_price_office
FROM product;
6.3 行转列
SELECT name,
SUM(CASE WHEN subject = ’语文’ THEN score ELSE null END) as chinese,
SUM(CASE WHEN subject = ’数学’ THEN score ELSE null END) as math,
SUM(CASE WHEN subject = ’外语’ THEN score ELSE null END) as english
FROM score
GROUP BY name;
总结:
- 当待转换列为数字时,可以使用 ‘SUM AVG MAX MIN‘等聚合函数;
- 当待转换列为文本时,可以使用 ‘MAX MIN‘等聚合函数
7.练习
1.运算或者函数中含有 NULL 时,结果全都会变为 NULL ?(判断题)
答:否。
2.
- 从product表中筛选出购买价格不在(500,2000,5000)中的产品名称、购买价格
以上是关于4.复杂一点的查询的主要内容,如果未能解决你的问题,请参考以下文章