文章目录

  • 视图
    • 创建视图
    • 修改视图
    • 更新与删除视图
  • 子查询
    • 标量子查询
    • 关联子查询
  • 练习Part1
  • 各种各样的函数
    • 算术函数
    • 字符串函数
    • 日期函数
    • 转换函数
    • 聚合函数
  • 谓词
    • LIKE谓词 – 用于字符串的部分一致查询
    • BETWEEN
  • CASE表达式
  • 练习Part2

视图

视图是一个虚拟的表,不同于直接操作数据表,视图是依据SELECT语句来创建的(会在下面具体介绍),所以操作视图时会根据创建视图的SELECT语句生成一张虚拟表,然后在这张虚拟表上做SQL操作。

  1. 视图不仅可以基于真实表,我们也可以在视图的基础上继续创建视图。

  2. 虽然在视图上继续创建视图的语法没有错误,但是我们还是应该尽量避免这种操作。这是因为对多数 DBMS 来说, 多重视图会降低
    SQL的性能。

  3. 需要注意的是在一般的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。

谓词主要有以下几个:

  1. LIKE
  2. BETWEEN
  3. IS NULL、IS NOT NULL
  4. IN
  5. 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入门(三)| 复杂一点的查询相关推荐

  1. 学习笔记之Qt从入门到精通(三)

    整理日期: 2010年4月9日 本文是学习笔记之Qt从入门到精通(二)的接续 Part 3: 进阶学习 Qt4 学习笔记 Qt 可以运行在不同的平台,像是Unix/X11.Windows.Mac OS ...

  2. Bootstrap学习笔记01【快速入门、栅格布局】

    Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...

  3. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  4. 【数据库学习笔记】Day03 - SQL语言基础及数据库定义功能

    [数据库学习笔记]Day03 - SQL语言基础及数据库定义功能 〇.本文所用数据库表格: 一.关系运算: 关系运算,数学名词,基本运算有两类:一类是传统的集合运算(并.差.交等),另一类是专门的关系 ...

  5. Vue 新手学习笔记:vue-element-admin 之入门开发教程(v4.0.0 之前)

    说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些 但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手架框架布了都没看过 干就完事,不过 ...

  6. mongo学习笔记四:Mongodb的三种集群(Replica Set)

    Replica Set    中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的.其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据 ...

  7. 【白帽子学习笔记14】SQL注入常用语句

    [白帽子学习笔记14]SQL注入常用语句 目前网站中使用的最多的数据库要算是 ACCESS.SQL Server(MSSQL).MySQL 这三个了,所以这里的手工注入,我就以他们三个数据库来分成三 ...

  8. Flowable学习笔记(一、入门)

    转载自  Flowable学习笔记(一.入门) 一.Flowable简介 1.Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎.Flowable流程引擎可用于部署BP ...

  9. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)--动态SQL 转载于:https://www.cnblogs.com/MrSaver/p/7453949.html

最新文章

  1. ESI计算机排名2021年01月,喜忧参半!2021年5月ESI世界大学排行榜,21个学科排名数据分析!...
  2. Qt最新版5.12在Windows环境静态编译安装和部署的完整过程(VS2017)
  3. apache解析php的方法
  4. 有限元基础: Jacobian 矩阵和高斯积分
  5. boost::adaptors::formatted相关的测试程序
  6. Java程序员必备 : Java反编译神器——“GUI” 资源分享
  7. java object monitor_Java精通并发-通过openjdk源码分析ObjectMonitor底层实现
  8. java map 输入 查询 修改_map的查询和修改方法
  9. java 轻量级 编辑器_Java相关概念汇总
  10. oracle merge
  11. linux+awk过滤端口,Awk简单过滤[1]
  12. 0927_C/C++笔试题_10:16道c语言面试例子【2】
  13. 计算机辅助项目管理有关论文,项目管理论文
  14. box-sizing: border-box的作用
  15. 2021全国特种设备-G3锅炉水处理模拟考试题库一[安考星]
  16. java 导出压缩文件,IO流非正常关闭引起的“不可预料的压缩文件末端”的解决办法
  17. 用递归法求两个数的最大公约数
  18. python爬虫-20行代码爬取王者荣耀所有英雄图片,小白也轻轻松松
  19. Could not load the following font :pdfFontName : STSong-Light问题
  20. 新时期计算机网络通信发展现状与趋势

热门文章

  1. 纯CSS实现手风琴效果(附演示)
  2. FileOutputStream flush()
  3. oracle中制表符,oracle中去掉文本中的换行符、回车符、制表符
  4. 百度地图自定义覆盖物
  5. 匈牙利算法编程c语言,华为oj之素数伴侣---匈牙利算法
  6. Settings 设置
  7. 数据可视化~matplotlib阶梯图,直方图
  8. 人脸识别机与服务器访问协议,人脸识别终端485通信协议.doc
  9. php单链表检测有没有环,PHP 和 Go 实现环路链表检测
  10. 多想别人学习。增强编程能力。