4.复杂一点的查询

Posted Mrs.King_UP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.复杂一点的查询相关的知识,希望对你有一定的参考价值。

文章目录

1.视图

1.1 视图是什么

  • 视图和表在查询数据操作完全一样
  • 视图是虚拟表,不同于直接操作数据表,没有保存实际数据,是从表中派生出来的
  • 定义视图的方式可以使得用户看到的数据更加清晰

1.2 创建视图

  1. 单表视图
CREATE VIEW view_name 
AS
SELECT column_name(s)
FROM table_name
WHERE condition
  1. 多表视图

    可以在视图的基础上直接进行查询
  2. 注意
  • 视图名在数据库中保持唯一
  • 视图的创建可以基于真实表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 关联子查询

  • 选取出各商品种类中高于该商品种类的平均销售单价的商品

    上面语句的执行顺序:
  1. 首先执行不带where的主查询
  2. 根据主查询结果匹配product_type,获取子查询结果
  3. 将子查询结果再与主查询结合执行完整的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.复杂一点的查询的主要内容,如果未能解决你的问题,请参考以下文章

第五章 复杂查询 5-3 关联子查询

复杂一点的二叉树递归

各种排序算法时间复杂度稳定性初始序列是否对元素比较次数有关

解析稍微复杂一点的数据

opencv复杂一点的变换

SQl查询的简单问题,