学习笔记与练习 | SQL入门(三)| 复杂一点的查询
文章目录
- 视图
- 创建视图
- 修改视图
- 更新与删除视图
- 子查询
- 标量子查询
- 关联子查询
- 练习Part1
- 各种各样的函数
- 算术函数
- 字符串函数
- 日期函数
- 转换函数
- 聚合函数
- 谓词
- LIKE谓词 – 用于字符串的部分一致查询
- BETWEEN
- CASE表达式
- 练习Part2
视图
视图是一个虚拟的表,不同于直接操作数据表,视图是依据SELECT语句来创建的(会在下面具体介绍),所以操作视图时会根据创建视图的SELECT语句生成一张虚拟表,然后在这张虚拟表上做SQL操作。
视图不仅可以基于真实表,我们也可以在视图的基础上继续创建视图。
虽然在视图上继续创建视图的语法没有错误,但是我们还是应该尽量避免这种操作。这是因为对多数 DBMS 来说, 多重视图会降低
SQL的性能。需要注意的是在一般的DBMS中定义视图时不能使用ORDER BY语句。这是因为视图和表一样,数据行都是没有顺序的。
创建视图
基于单表:
CREATE VIEW productsum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)FROM productGROUP BY product_type ;
基于多表:注意WHERE
中的列名前面要带表名如product.
CREATE VIEW view_shop_product(product_type, sale_price, shop_name)
AS
SELECT product_type, sale_price, shop_nameFROM product,shop_productWHERE product.product_id = shop_product.product_id;
修改视图
基本语句:ALTER VIEW <视图名> AS <SELECT语句>
其中的WHERE
可以不是视图中的列名!
ALTER VIEW productSumASSELECT product_type, sale_priceFROM ProductWHERE regist_date > '2009-09-11';
更新与删除视图
因为视图是一个虚拟表,所以对视图的操作就是对底层基础表的操作,所以在修改时只有满足底层基本表的定义才能成功修改。
对于一个视图来说,如果包含以下结构的任意一种都是不可以被更新的:
- 聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
- DISTINCT 关键字。
- GROUP BY 子句。
- HAVING 子句。
- UNION 或 UNION ALL 运算符。
- FROM 子句中包含多个表。
不建议通过视图修改表
--注意删除视图需要有权限
DROP VIEW productSum;
子查询
子查询不会像视图那样保存在存储介质中, 而是在 SELECT 语句执行之后就消失了。减少嵌套子查询
标量子查询
标量:返回一个值。
由于标量子查询的特性,导致标量子查询不仅仅局限于 WHERE 子句中,通常任何可以使用单一值的位置都可以使用。也就是说, 能够使用常数或者列名的地方,无论是 SELECT 子句、GROUP BY 子句、HAVING 子句,还是 ORDER BY 子句,几乎所有的地方都可以使用。
例子1:
SELECT product_id, product_name, sale_priceFROM productWHERE sale_price > (SELECT AVG(sale_price) FROM product);
例子2:
SELECT product_id,product_name,sale_price,(SELECT AVG(sale_price)FROM product) AS avg_priceFROM product;
关联子查询
通过一些标志将内外两层的查询连接起来起到过滤数据的目的
例子:选取出各商品种类中高于该商品种类的平均销售单价的商品。
- 第二条SQL语句也就是关联子查询中我们将外面的product表标记为p1,将内部的product设置为p2,而且通过WHERE语句连接了两个查询。
- 首先执行不带WHERE的主查询
- 根据主查询结果匹配product_type,获取子查询结果
- 将子查询结果再与主查询结合执行完整的SQL语句
SELECT product_type, product_name, sale_priceFROM product AS p1WHERE sale_price > (SELECT AVG(sale_price)FROM product AS p2WHERE p1.product_type =p2.product_typeGROUP BY product_type);
练习Part1
1. 创建出满足下述三个条件的视图(视图名称为 ViewPractice5_1)。使用 product(商品)表作为参照表,假设表中包含初始状态的 8 行数据。
条件 1:销售单价大于等于 1000 日元。
条件 2:登记日期是 2009 年 9 月 20 日。
条件 3:包含商品名称、销售单价和登记日期三列。
答:
CREATE VIEW ViewPractice5_1(product_name,sale_price,regist_date)ASSELECT product_name,sale_price,regist_dateFROM productWHERE (sale_price>=1000) AND (regist_date="2009-09-20");
2. 向习题一中创建的视图 ViewPractice5_1 中插入如下数据,会得到什么样的结果呢?
INSERT INTO ViewPractice5_1 VALUES (' 刀子 ', 300, '2009-11-02');
答:报错
3. 请根据如下结果编写 SELECT 语句,其中 sale_price_all 列为全部商品的平均销售单价。
SELECT product_id,product_name,product_type,sale_price,(SELECT AVG(sale_price) FROM product) AS sale_price_all
FROM product;
4. 请根据习题一中的条件编写一条 SQL 语句,创建一幅包含如下数据的视图(名称为AvgPriceByType)。
product_id | product_name | product_type | sale_price | avg_sale_price
------------+-------------+--------------+------------+---------------------
0001 | T恤衫 | 衣服 | 1000 |2500.0000000000000000
0002 | 打孔器 | 办公用品 | 500 | 300.0000000000000000
0003 | 运动T恤 | 衣服 | 4000 |2500.0000000000000000
0004 | 菜刀 | 厨房用具 | 3000 |2795.0000000000000000
0005 | 高压锅 | 厨房用具 | 6800 |2795.0000000000000000
0006 | 叉子 | 厨房用具 | 500 |2795.0000000000000000
0007 | 擦菜板 | 厨房用具 | 880 |2795.0000000000000000
0008 | 圆珠笔 | 办公用品 | 100 | 300.0000000000000000
答:参考前文例子,使用p1和p2,输出结果和题目要求完全一致,这题感觉非常重要!!
CREATE VIEW AvgPriceByType(product_id,product_name,product_type,sale_price,avg_sale_price)ASSELECT product_id,product_name,product_type,sale_price,(SELECT AVG(sale_price)FROM product AS p1WHERE p1.product_type=p2.product_typeGROUP BY product_type ) AS avg_sale_priceFROM product AS p2;
各种各样的函数
算术函数
ABS – 绝对值
语法:ABS( 数值 )
当 ABS 函数的参数为NULL时,返回值也是NULL。
MOD – 求余数
语法:MOD( 被除数,除数 )
小数没有余数的概念,只能对整数列求余数。
ROUND – 四舍五入
语法:ROUND( 对象数值,保留小数的位数 )
字符串函数
CONCAT – 拼接
语法:CONCAT(str1, str2, str3)
LENGTH – 字符串长度
语法:LENGTH( 字符串 )
LOWER – 小写转换
LOWER 函数只能针对英文字母使用,它会将参数中的字符串全都转换为小写。类似的, UPPER 函数用于大写转换。
REPLACE – 字符串的替换
语法:REPLACE( 对象字符串,替换前的字符串,替换后的字符串 )
例子:输入结果为“ABC哈哈”
str1=“abc哈哈”,str2="abc",str3="ABC", REPLACE(str1,str2,str3)
SUBSTRING – 字符串的截取
语法:SUBSTRING (对象字符串 FROM 截取的起始位置 FOR 截取的字符数)
截取的起始位置从字符串最左侧开始计算,索引值起始为1。
SUBSTRING_INDEX – 字符串按索引截取
语法:SUBSTRING_INDEX (原始字符串, 分隔符,n)
该函数用来获取原始字符串按照分隔符分割后,第 n 个分隔符之前(或之后)的子字符串,支持正向和反向索引,索引起始值分别为 1 和 -1。
例子:索引符号“.”,结果为“mysql.com”
SUBSTRING_INDEX('www.mysql.com', '.', -2)
日期函数
执行时前面都要加SELECT
喔!
- CURRENT_DATE – 获取当前日期
- CURRENT_TIME – 当前时间
- CURRENT_TIMESTAMP – 当前日期和时间
- EXTRACT – 截取日期元素 语法:EXTRACT(日期元素 FROM 日期) 使用 EXTRACT
函数可以截取出日期数据中的一部分,例如“年” “月”,或者“小时”“秒”等。该函数的返回值并不是日期类型而是数值类型
例子:
SELECT CURRENT_TIMESTAMP as now,
EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AS year,
EXTRACT(MONTH FROM CURRENT_TIMESTAMP) AS month,
EXTRACT(DAY FROM CURRENT_TIMESTAMP) AS day,
EXTRACT(HOUR FROM CURRENT_TIMESTAMP) AS hour,
EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS MINute,
EXTRACT(SECOND FROM CURRENT_TIMESTAMP) AS second;
+---------------------+------+-------+------+------+--------+--------+
| now | year | month | day | hour | MINute | second |
+---------------------+------+-------+------+------+--------+--------+
| 2020-08-08 17:34:38 | 2020 | 8 | 8 | 17 | 34 | 38 |
+---------------------+------+-------+------+------+--------+--------+
1 row in set (0.00 sec)
转换函数
- CAST – 类型转换 语法:CAST(转换前的值 AS 想要转换的数据类型)
SELECT CAST('0001' AS SIGNED INTEGER) AS int_col;
SELECT CAST('2009-12-14' AS DATE) AS date_col;
- COALESCE – 将NULL转换为其他值 语法:COALESCE(数据1,数据2,数据3……)
COALESCE 是 SQL 特有的函数。该函数会返回可变参数 A 中左侧开始第 1个不是NULL的值。参数个数是可变的,因此可以根据需要无限增加。
在 SQL 语句中将 NULL 转换为其他值时就会用到转换函数。
(感觉对它的实际功能还不是很掌握)
例子:
SELECT COALESCE(NULL, 11) AS col_1,
COALESCE(NULL, 'hello world', NULL) AS col_2,
COALESCE(NULL, NULL, '2020-11-01') AS col_3;
+-------+-------------+------------+
| col_1 | col_2 | col_3 |
+-------+-------------+------------+
| 11 | hello world | 2020-11-01 |
+-------+-------------+------------+
1 row in set (0.00 sec)
聚合函数
系列中的(二)整理过了喔,如COUNT,SUM等等
谓词
谓词就是返回值为真值的函数。包括TRUE / FALSE / UNKNOWN。
谓词主要有以下几个:
- LIKE
- BETWEEN
- IS NULL、IS NOT NULL
- IN
- EXISTS
LIKE谓词 – 用于字符串的部分一致查询
BETWEEN
CASE表达式
(条件)分支
练习Part2
5. 运算或者函数中含有 NULL 时,结果全都会变为NULL ?(判断题)
答:
CREATE VIEW ViewPractice5_1(product_name,sale_price,regist_date)ASSELECT product_name,sale_price,regist_dateFROM productWHERE (sale_price>=1000) AND (regist_date="2009-09-20");
6. 对本章中使用的 product(商品)表执行如下 2 条 SELECT 语句,能够得到什么样的结果呢?
SELECT product_name, purchase_priceFROM productWHERE purchase_price NOT IN (500, 2800, 5000);
答:
SELECT product_name, purchase_priceFROM productWHERE purchase_price NOT IN (500, 2800, 5000, NULL);
答:
7. 按照销售单价( sale_price)对练习 6.1 中的 product(商品)表中的商品进行如下分类。
- 低档商品:销售单价在1000日元以下(T恤衫、办公用品、叉子、擦菜板、 圆珠笔)
- 中档商品:销售单价在1001日元以上3000日元以下(菜刀)
- 高档商品:销售单价在3001日元以上(运动T恤、高压锅) 请编写出统计上述商品种类中所包含的商品数量的 SELECT 语句,结果如下所示。
SELECT product_name, purchase_priceFROM productWHERE purchase_price NOT IN (500, 2800, 5000);
学习笔记与练习 | SQL入门(三)| 复杂一点的查询相关推荐
- 学习笔记之Qt从入门到精通(三)
整理日期: 2010年4月9日 本文是学习笔记之Qt从入门到精通(二)的接续 Part 3: 进阶学习 Qt4 学习笔记 Qt 可以运行在不同的平台,像是Unix/X11.Windows.Mac OS ...
- Bootstrap学习笔记01【快速入门、栅格布局】
Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...
- MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- 【数据库学习笔记】Day03 - SQL语言基础及数据库定义功能
[数据库学习笔记]Day03 - SQL语言基础及数据库定义功能 〇.本文所用数据库表格: 一.关系运算: 关系运算,数学名词,基本运算有两类:一类是传统的集合运算(并.差.交等),另一类是专门的关系 ...
- Vue 新手学习笔记:vue-element-admin 之入门开发教程(v4.0.0 之前)
说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些 但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手架框架布了都没看过 干就完事,不过 ...
- mongo学习笔记四:Mongodb的三种集群(Replica Set)
Replica Set 中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的.其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据 ...
- 【白帽子学习笔记14】SQL注入常用语句
[白帽子学习笔记14]SQL注入常用语句 目前网站中使用的最多的数据库要算是 ACCESS.SQL Server(MSSQL).MySQL 这三个了,所以这里的手工注入,我就以他们三个数据库来分成三 ...
- Flowable学习笔记(一、入门)
转载自 Flowable学习笔记(一.入门) 一.Flowable简介 1.Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎.Flowable流程引擎可用于部署BP ...
- MyBatis:学习笔记(4)——动态SQL
MyBatis:学习笔记(4)--动态SQL 转载于:https://www.cnblogs.com/MrSaver/p/7453949.html
最新文章
- ESI计算机排名2021年01月,喜忧参半!2021年5月ESI世界大学排行榜,21个学科排名数据分析!...
- Qt最新版5.12在Windows环境静态编译安装和部署的完整过程(VS2017)
- apache解析php的方法
- 有限元基础: Jacobian 矩阵和高斯积分
- boost::adaptors::formatted相关的测试程序
- Java程序员必备 : Java反编译神器——“GUI” 资源分享
- java object monitor_Java精通并发-通过openjdk源码分析ObjectMonitor底层实现
- java map 输入 查询 修改_map的查询和修改方法
- java 轻量级 编辑器_Java相关概念汇总
- oracle merge
- linux+awk过滤端口,Awk简单过滤[1]
- 0927_C/C++笔试题_10:16道c语言面试例子【2】
- 计算机辅助项目管理有关论文,项目管理论文
- box-sizing: border-box的作用
- 2021全国特种设备-G3锅炉水处理模拟考试题库一[安考星]
- java 导出压缩文件,IO流非正常关闭引起的“不可预料的压缩文件末端”的解决办法
- 用递归法求两个数的最大公约数
- python爬虫-20行代码爬取王者荣耀所有英雄图片,小白也轻轻松松
- Could not load the following font :pdfFontName : STSong-Light问题
- 新时期计算机网络通信发展现状与趋势