5 复杂查询
5.1 视图
从sql角度,视图和表是相同,区别在表中保存的实际数据,而视图保存是select语句(视图本身不存储数据)使用视图,可以轻松完成跨多表查询数据等复杂操作可以将select语句当成视图来使用,创建视图用create view,删除视图用drop
view视图包含"不能使用order by"和"对其进行有限制的更新",实际上视图保存的是select语句
视图的优点无需保存数据,可以节省存储设备的容量频繁的使用select语句保存成视图,不用每次都重新书写了,将进程使用的select做成视图
--创建视图 create view <视图名称> as <select语句>; --视图可以使用在select语句的from子句中,并且视图会自动更新
多重视图 在视图的基础上创建视图,但尽量避免在视图的基础上创建视图,多重视图会降低SQL的性能
视图的限制定义视图时不要使用order by子句因为视图和表一样,数据行都是没有顺序的
对视图进行更新在select语句中视图可以和表一样使用,但是对于insert、delete、update这类更新语句满足了一定条件可以被更新由于使用视图来保存原表的汇总数据时无法判断将视图更改反映到原表中的,例如将一行数据插入视图中,但是原表中的编号等信息不清楚,无法保证数据的一致性视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新
- select子句中未使用distinct
- from 子句中只有一张表
- 未使用group by子句
- 未使用having子句
删除视图
drop view <视图名称>;
5.2 子查询
- 子查询就是一次性视图(select语句),与视图不同,子查询在select语句执行完毕就会消失
- 首先执行内层查询,再执行外层查询
- 子查询必须设定名称,尽量从处理内容的角度出发为子查询设定恰当的名称,使用as关键字,也可省略
标量子查询标量就是单一的意思,在数据库之外的领域也经常使用,标量子查询就是必须且只能返回一行一列的结果,由于只返回单一值,所以标量子查询的返回值可以用在"="或"<>"这样需要单一值比较的运算符之中,
5.3 关联子查询
关联子查询会在细分的组内进行比较时使用
使用关联资产时,通常会使用"限定"或"限制"这样的语言
select product_type,product_name,sale_price from Product as P1 where sale_price > (select avg(sale_price) from Product as P2 where P1.product_type = P2.product_type --结合条件写在子查询中 group by product_type );
6 函数、谓词、case表达式
6.1 各种各样的函数
函数就是输入某一值得相应输出结果的功能,输入值称为参数,输出值称为返回值
算术函数
--算术函数除了常见的四则运算(+-x/),介绍常见一些函数,numeric是大多数DBMS都支持的一种数据类型,参数是null,返回值也是null select round(1123.26723,2); --结果:1123.27 四舍五入 select abs(-1) --结果:1 绝对值 select mod(7,3) --结果:1 取余
字符串函数
concat() --拼接字符串 length() --在sql server中无法使用,sql server中使用len()函数,汉子占两个字符,英文字母占一个 --在MySQL中有length()和char_length() lower() --只对英文字母使用,将参数中的字符串全部转化成小写字母,upper() --将小写转化成大写 replace(对象字符串,替换前的字符串,替换后的字符串) substring(对象字符串 from 截取的位置 for 截取的字符个数) --可以截取字符串一部分
日期函数
current_date--当前日期 current_time--当前时间 current_timestamp--挡墙的日期和时间 extract()函数--截取日期函数,返回值并不是日期型,而是数值类型
转换函数在sql中有两层意思:一是数据类型的转换,简称类型转换,在英语中称为cast;另一层的意思是值的转换;
- cast函数--类型转换
cast(转换前的值 as 想要转换的数据类型) select cast("ooo1" as interger)
- coalesce函数 --将null转换为其他值
--coalesce是sql特有的函数,返回可变参数中左侧第一个不是null的值 coalesce(数据1,数据2,数据3...)
6.2 谓词
谓词是需要满足特定条件的函数,该条件就是返回值是真值。返回值可能是数字、字符串或者日期,但是谓词的返回值就是真值(True/False/Unknown)。这就是谓词和函数的最大区别。
- like --字符串的部分一致查询
-- 前方一致 select * from SampleLike where strcol like "ddd%"; --代表"0个字符以上的字符串" -- 中间一致 select * from SampleLike where strcol like "%ddd%"; --代表"0个字符以上的字符串" -- 后方一致 select * from SampleLike where strcol like "%ddd"; --使用%和_(下划线)进行后方一致查询 select * from SampleLike where strcol like "ddd_ _"; --进行ddd+任意两个字符
- between --范围查询
- is null 、is not null --判断是否是null
--为了选出某些值为null的列的数据,不能使用=,使用特定的谓词is null,不是null的is not null
- in --or的谓词
--选取出在范围的数据,还有not in不在范围的数据,两者都无法选取出null数据
- exists
-- 谓词的作用就是"判断是否存在满足某种条件的记录",存在这样的记录返回True,否则返回False
6.3 case表达式
case表达式分为简单case表达式和搜索case表达式,简单表达式包含在搜索表达式内,只介绍搜索case表达式
case表达式是在区分情况时使用的,在编程中称之为(条件)分支,是相当于sql中的if语句
case when <求值表达式> then <表达式> -- <求值表达式> 类似于"列=值" when <求值表达式> then <表达式> when <求值表达式> then <表达式> . . else <表达式> --指定了不满足when子句中的条件的记录,null之外其他值或表达式都可写在else中 end --不能省略
搜索case表达式
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;
--简单case表达式
select product_name, case product_type --写过一次,不用再写 when "衣服" then "A":'|| product_type' when "办公用品" then "B":'|| product_type' when "厨房用品" then "C":'|| product_type' end as abc_product_type from Product;
--经典案例
select product_name,product_price from Product where purchase_price not in (500,2800,5000);
--结果如下,没有含有null的两行,是因为通常的谓词都无法与null比较product_name purchase_price打孔器 320擦菜板 790
select product_name,product_price from Product where purchase_price not in (500,2800,5000,null);
--结果是什么都没有,使用子查询作为not in 的参数时,子查询的返回值也不能是null