SQL学习之“复杂一点的查询”
本节将学习一些SQL查询语句的复杂用法,
在SQL中,视图是基于 SQL 语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表,但它实际不是真实的表。视图与表的区别在于“是否保存了实际的数据”,其数据来源均建立在真实表的基础上。
1、视图介绍
创建视图的语法如下:
CREATE VIEW 视图名 AS
SELECT 列名
FROM 表名
WHERE 查询条件;
如果需要更新视图中的列或者其他信息,无需删除,使用 CREATE OR REPLACE VIEW
选项。而删除视图,使用 DROP
即可。
之所以要采用视图,是基于以下几点原因。
- 通过定义视图可以将频繁使用的SELECT语句保存以提高效率。
- 通过定义视图可以使用户看到的数据更加清晰。
- 通过定义视图可以不对外公开数据表全部字段,增强数据的保密性。
- 通过定义视图可以降低数据的冗余。
因为视图和表一样,数据行都是没有顺序的,所以,在一般的DBMS中定义视图时不能使用ORDER BY语句。在 MySQL中视图的定义是允许使用 ORDER BY 语句的,但是若从特定视图进行选择,而该视图使用了自己的 ORDER BY 语句,则视图定义中的 ORDER BY 将被忽略。
修改视图的语法如下。
ALTER VIEW <视图名> AS <SELECT语句>
更新视图的语法如下。
UPDATE <视图名>SET 语句WHERE 语句
视图归根结底还是从表派生出来的,因此,如果原表可以更新,那么视图中的数据也可以更新。反之,修改视图的内容,数据表也会相应更新,注意,这是有条件地更新,因为视图只是原表的一个窗口,所以它修改也只能修改透过窗口能看到的内容。
删除的视图的语法如下。
DROP VIEW <视图名1> [ , <视图名2> …]
2、子查询
子查询就是将一个查询的结果作为另一个查询(主查询)的数据来源或判断条件的查询。常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询,子查询要使用小括号();
子查询是一次性的,所以子查询不会像视图那样保存在存储介质中, 而是在 SELECT 语句执行之后就消失了。
标量子查询就是要求我们执行的SQL语句只能返回一个值,也就是要返回表中具体的某一行的某一列,即返回一个特定查询值。标量子查询不仅仅局限于 WHERE 子句中,通常任何可以使用单一值的位置都可以使用。也就是说, 能够使用常数或者列名的地方,无论是 SELECT 子句、GROUP BY 子句、HAVING 子句,还是 ORDER BY 子句。
关联子查询就是通过一些标志将内外两层的查询连接起来起到过滤数据的目的。
关联子查询的执行逻辑如下。
(1)先从主查询的Product表中product _type列取出第一个值,进入子查询中,得到子查询结果,然后返回父查询,判断父查询的where子句条件,则返回整个语句的第1条结果。
(2)重复上述操作,直到所有主查询中的Product表中product _type列记录取完为止。得出整个语句的结果集,就是最后的答案。
3、SQL中各种函数
SQL中自带了多种函数,大致分为如下几类:
- 算术函数 (用来进行数值计算的函数)
- 字符串函数 (用来进行字符串操作的函数)
- 日期函数 (用来进行日期操作的函数)
- 转换函数 (用来转换数据类型和值的函数)
- 聚合函数 (用来进行数据聚合的函数)
(1)ABS 函数用于计算一个数字的绝对值,表示一个数到原点的距离。
语法为ABS( 数值 )
(2)MOD 是计算除法余数(求余)的函数,是 modulo 的缩写。小数没有余数的概念,只能对整数列求余数。
语法为MOD( 被除数,除数 )
(3)ROUND 函数用来进行四舍五入操作。
语法为ROUND( 对象数值,保留小数的位数 )
(4) CONCAT 函数进行拼接。
语法为CONCAT(str1, str2, str3)
(5)LOWER 函数会将参数中的字符串全都转换为小写,只能针对英文字母使用。
语法为LOWER( 字符串 )
(6) SUBSTRING 函数 可以截取出字符串中的一部分字符串。截取的起始位置从字符串最左侧开始计算,索引值起始为1。
语法为SUBSTRING (对象字符串 FROM 截取的起始位置 FOR 截取的字符数)。
(7)SUBSTRING_INDEX用来获取原始字符串按照分隔符分割后,第 n 个分隔符之前(或之后)的子字符串,支持正向和反向索引,索引起始值分别为 1 和 -1。
语法为SUBSTRING_INDEX (原始字符串, 分隔符,n)
(8)REPEAT函数用来对特定字符实现按需重复。
语法为REPEAT(string, number)。
(9)常用的时间函数:CURRENT_DATE 函数获取当前日期;CURRENT_TIME函数获取当前时间;CURRENT_TIMESTAMP函数获取当前日期和时间。
EXTRACT 函数可以截取出日期数据中的一部分,例如“年”
“月”,或者“小时”“秒”等。该函数的返回值并不是日期类型而是数值类型,语法为EXTRACT(日期元素 FROM 日期)。
(10)CAST函数是类型转换函数。
语法为CAST(转换前的值 AS 想要转换的数据类型)
(11)COALESCE 函数会返回可变参数 A 中左侧开始第 1个不是NULL的值。参数个数是可变的,因此可以根据需要无限增加。
4、SQL中的谓词
对于通常的函数来说,返回值有可能是数字、字符串或者日期等,但是谓词的返回值都是真值(true/false/unknown)。这是谓词和函数的最大区别。
SQL中的谓词主要有 LKIE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS。
其中LIKE用于字符串的部分一致查询(模糊查询),部分一致大体可以分为前方一致、中间一致和后方一致三种类型。
语法如下:
①前方一致select * from user where username like 'aaa%';
②中间一致select * from user where username like '%aaa%';
③后方一致select * from user where username like '%aaa';
其中的%
是代表“零个或多个任意字符串”的特殊符号。也可以使用“_”l来代替“%”,不同的是,“_”代表“任意1个字符”。
使用 BETWEEN 可以进行范围查询。BETWEEN的特点是结果中会包含临界值。如果不想让结果中包含临界值,那就必须使用 < 和 >。
IS NULL和IS NOT NULL是用于查询某些值位NULL或不为NULL的数据列是使用。
OR是用于多个查询条件取并集。但是当需要使用多个OR语句时,语句会比较冗长,这时可以使用IN 谓词 `IN(值1, 值2, 值3, ......)来替换多个OR 语句。但在使用IN 和 NOT IN 时是无法选取出NULL数据的。
IN 谓词(NOT IN 谓词)具有其他谓词所没有的用法,那就是可以使用子查询作为其参数。子查询就是 SQL内部生成的表,因此也可以说“能够将表作为 IN 的参数”。同理,我们还可以说“能够将视图作为 IN 的参数”。
EXIST的作用就是判断是否存在满足某种条件的记录,如果存在就返回真(true),不存在就返回假(false)。NOT EXIST的作用与其相反。EXIST 只关心记录是否存在,返回哪些列都没有关系。
CASE 表达式是在区分情况时使用的,这种情况的区分在编程中通常称为(条件)分支。分为简单CASE表达式和搜索CASE表达式两种。语法如下:
ase表达式会从对最初的when语句进行求值开始。所谓求值就是要调查该表达式的真值是什么。如果结果为真,就返回then语句中的表达式,case表达式的执行到此为止。如果不为真,就跳转到下一条when子句的求值之中,如果直到最后when子句为止返回结果都不为真,那么就会返回else中表达式,执行终止。
5、练习题
练习题3.1答案
CREATE VIEW ViewPractice5_1 (product_name, sale_price, regist_date) AS
SELECT product_name, sale_price, regist_date
FROM product
WHERE sale_price >= 1000
AND regist_date = "2009-09-20";
SELECT * FROM ViewPractice5_1;
练习题3.2答案
执行语句
INSERT INTO ViewPractice5_1 VALUES (' 刀子 ', 300, '2009-11-02');
会出现如下所示的错误提示
当插入数据到视图时,也会将数据插入原表中,该语句中只插入了三个数据,而原表product中’product_id’、'product_type’被限制为NOT NULL,因此无法完成插入。
练习题3.5答案
我认为不是的,比如在语句SELECT COALESCE(NULL, 11) AS col_1中含有NULL,但是结果为11。
练习题3.6答案
(1)
(2)
练习题3.7答案
SELECT SUM(CASE WHEN sale_price <= 1000 THEN 1 ELSE 0 END) AS low_price,
SUM(CASE WHEN sale_price BETWEEN 1001 AND 3000 THEN 1 ELSE 0 END) AS mid_price,
SUM(CASE WHEN sale_price >= 3001 THEN 1 ELSE 0 END) AS high_price
FROM product;
SQL学习之“复杂一点的查询”相关推荐
- 【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作
数据库系统软件:SQL Server 2019 Express 操作系统:Windows 10 文章目录 嵌套查询 IN 与 NOT IN EXISTS 与 NOT EXISTS 比较运算符 SOME ...
- SQL学习(四)条件查询(字符串类型属性筛选)
本节主要使用WHERE语句筛选字符串类型的属性. 概述 LIKE(模糊查询) 和 %(通配符)是字符串相关查询的两个关键字. 条件查询语句还是WHERE语句 SELECT column, anothe ...
- 经典SQL学习笔记 (四)-子查询
子查询 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命令的WHERE子句中.子查询是一个 SELECT 语句,它嵌 ...
- SQL学习笔记3-复杂一点的查询
目录 3.1 视图 3.1.1 什么是视图 3.1.2 视图与表有什么区别 3.1.3 为什么会存在视图 3.1.4 如何创建视图 3.1.5 如何修改视图结构 3.1.6 如何更新视图内容 3.1. ...
- SQL编程-组队学习打卡task03-复杂一点的查询
复杂一点的查询 1. 视图与表的区别 1.1 创建视图 1.2 修改视图 1.3 更新视图 1.4 删除视图 2. 子查询 2.1 标量子查询 2.2 关联子查询 3. 函数 3.1 算术函数 (用来 ...
- 学习笔记与练习 | SQL入门(三)| 复杂一点的查询
文章目录 视图 创建视图 修改视图 更新与删除视图 子查询 标量子查询 关联子查询 练习Part1 各种各样的函数 算术函数 字符串函数 日期函数 转换函数 聚合函数 谓词 LIKE谓词 – 用于字符 ...
- 2020-12-21《SQL训练营——Task03:复杂一点的查询》
Task03:复杂一点的查询 组队学习SQL编程语言 之前接触了sql基本的查询用法,接下来介绍一些相对复杂的用法. 3.1 视图 我们先来看一个查询语句(仅做示例,未提供相关数据) SELECT s ...
- SQl复杂一点的查询
复杂一点的查询 视图 我们先来看一个查询语句(仅做示例,未提供相关数据) SELECT stu_name FROM view_students_info; 单从表面上看起来这个语句是和正常的从数据表中 ...
- SQL学习(3)——表的复杂查询与函数操作
SQL学习(3)--表的复杂查询 1.视图 1.1.创建视图 1.1.1.基于单表的视图 1.1.2.基于多表的视图 1.2.查询视图 1.3.修改视图 1.4.更新视图 1.5.删除视图 2.子查询 ...
最新文章
- 【c语言】蓝桥杯入门训练 圆的面积
- C#中组件与控件的主要区别是什么?
- poj 2524 Ubiquitous Religions (并查集)
- spring集成kafka
- 修改注册表设置默认浏览器
- 类目,延展,协议的基本概念
- C语言 memset函数简单实现
- C++中公有继承、保护继承、私有继承
- 《相关性准则——大数据时代的高效能之道》一一2.3 数字信息
- modal verbs(一)
- C 语言中获取文件长度(ftell函数)
- 打开计算机出现服务器运行失败,win7打开Windows Media Player听歌提示“服务器运行失败”怎么办...
- 通俗地讲解目标检测中AP指标
- 解析 | 模-数(A/D)转换器
- mac虚拟机服务器设置u盘启动不了,手把手教你解决win7系统苹果电脑运行虚拟机后无法识别显示U盘的图文方案...
- Ariane和riscv-gnu-toolchain工具链的安装
- git恢复误删代码或文件
- 阿里云服务器ECS新手搭建
- ccf试题棋局评估c语言,第十三次CCF CSP认证(2018年3月)真题棋局评估 题解
- 根据空间中不共面的四个点坐标,求构成任意四面体的内外球
热门文章
- MIS和DSS的区别及联系+DSS能解决的问题
- isc-dhcp dhcpv6配置
- Latex 插入代码块
- 受不了互联网996,我终于如愿上岸在国企当程序员!
- 密码转换 输入一个大写字母,把它往后移动两个位置加密,即A变C,B变D,X变Z,Z变B
- 百亿数据,毫秒级返回查询优化
- 白话Java基础—JVM内存模型
- 擦地机器人排行榜_擦地机器人好用吗?扫地机器人排名?
- 嘀嘀打车java_Java滴滴打车系统实现(同时实现租车购物车)
- – 6、查询“李“姓老师的数量