本笔记整理自《SQL 基础教程》、《MySQL 必知必会》和网上资料。个人笔记不保证正确。

一、复杂查询

视图

将 SELECT 查询包装成一个虚拟表,该虚拟表就被称为视图。(因为只是一个包装,因此视图的数据也会随着原表的更新而更新)

  1. 用途:

    1. 简化复杂的SQL查询,用它替换子查询,能降低查询的嵌套深度。
    2. SELECT 查询的重用,减少重复查询。
    3. ...
  2. 创建视图:
CREATE VIEW <视图名称>(<视图列名1>, <视图列名2>... )AS<SELECT 语句>;

其中 SELECT 的结果列和视图列名一一对应。

  1. 视图的限制

    1. 视图的 SELECT 子句,不能包含 ORDER BY 子句。因为视图也是表,而表是集合,它没有顺序。(也有些DB支持该用法,但不通用)
    2. 视图的更新:只在很有限的条件下,才能在视图上使用 INSERT/DELETE/UPDATE 这样的变更数据的语句。(视图应该只用于检索,能不更新就不要更新它
  2. 删除视图:DROP VIEW <视图名称>;

子查询

子查询,其实就是一次性的视图:

SELECT ...FROM (SELECT ...  -- 这就是一个子查询:嵌套的 select 语句) AS <别名>...

上面的查询的 FROM 子句中,给另一 SELECT 子句定义了一个别名,并将它作为了查询对象。这就是一个子查询。

子查询不仅能用于 FROM,还能用在 WHERE 子句等很多地方。

关联子查询

即用到了外部数据的子查询语句:

SELECT ...FROM product AS p1WHERE (SELECT ...FROM duck AS p2WHERE p1.price > p2.price   -- 这里,内部子查询访问了外部查询的表p1,因此是一个关联子查询。);

二、函数、谓词、CASE 表达式

函数

给出的链接都是 MySQL 的

  1. 算术函数

    • 加减乘除:+ - * /
    • ABS 绝对值
    • MOD 求余
    • ROUND 四舍五入
  2. 字符串函数
    • CONCAT(str1,str2,...) 拼接
    • LENGTH(str) 字符串的 bytes 长度
    • CHAR_LENGTH(str)
    • LOWER/UPPER 大小写转换
    • REPLACE(str,from_str,to_str) 替换
    • SUBSTRING(str FROM pos FOR len) 截取
  3. 时间和日期函数
    • CURRENT_DATE 当前日期
    • CURRENT_TIME 当前时间
    • CURRENT_TIMESTAMP 当前的日期和时间
    • EXTRACT(unit FROM date) 截取日期元素,unit 可为 YEAR MONTH HOUR 等等
  4. 转换函数
    • CAST(expr AS type) 将 expr 的结果转换成 type 类型
    • COALESCE(value,...) 从左往右扫描,返回第一个非 NULL 的值。常用于将 NULL 转换为其他值。eg. COALESCE(sth, 1) 如果 sth 为 NULL 就会返回1.
  5. 聚合函数:基本就五个,已经学过了。

谓词

即返回布尔值的表达式

LIKE谓词——简单字符串匹配(慢)

匹配整个列

  • %:任意字符出现任意次
  • _:匹配任意一个字符

举例:

SELECT nameFROM listWHERE name LIKE '%Ryan%';  -- 匹配任意包含 'Ryan' 的字符串

REGEXP谓词——正则字符串匹配

MySQL 只实现了通用正则的一个子集,而且是search模式。(非match)

其他

  • BETWEEN:范围匹配,eg. BETWEEN 1 AND 10
  • IS NULL、IS NOT NULL
  • IN、NOT IN:是否在某集合内
  • EXIST、NOT EXIST(比较难的一个,入门阶段不要求):该谓词比较特殊,只需要右侧一个参数,而且该参数绝大多数情况下,都是一个关联子查询。而且该子查询的SELECT子句的参数基本可以随意,通常使用SELECT *. 对于子查询有返回值的列,它返回True,否则返回False. 但要注意为 NULL 时返回 UNKNOW.(而 WHERE 只认 True)

CASE 表达式

  1. if - else if - else 形式:
CASE WHEN <求值表达式> THEN <表达式>WHEN <求值表达式> THEN <表达式>WHEN <求值表达式> THEN <表达式>...ELSE <表达式>
END
  1. switch 模式(但不需要break)
CASE <表达式>WHEN <表达式> THEN <表达式>WHEN <表达式> THEN <表达式>...ELSE <表达式>
END

这是对 CASE 后的元素做switch比较。

三、集合运算

注意事项

  1. 作为运算对象的结果集,列字段必须一一对应,而且对应列的类型必须相同。

结果集的交并差

  1. <查询1> UNION <查询2>:对两个结果集求并
  2. UNION ALL:添加 ALL 能使结果集包含重复行。
  3. <查询1> INTERSECT <查询2>:两结果集的交集
  4. <查询1> EXCEPT <查询2>:两结果集的差集

以列为单位,对表进行联结(JOIN)

最强大的功能之一

交并差是以行为单位的操作,是竖向的运算。而联结是以列为单位的操作,是横向的拼接。

内联(INNER JOIN)

内联结果只包含两表的交集

语法:

SELECT ...FROM (product INNER JOIN shopON product.p_id = shop.p_id)WHERE filter_condition;

使用 跟在 INNER JOIN 子句后的 ON 子句指定联结条件。(这里我特意用了括号,表示 JOIN 和 ON 两个子句是配套的)

也有另一个很常用的语法(但是现在已经不推荐使用):

SELECT ...FROM product, shopWHERE product.p_id = shop.p_idAND filter_condition;

对于 shop 表中有多行对应同一个 product 的情况(有多人购买了同一款商品),结果中该 product 会被复制给 shop 中的多个购买记录。(也就是说该 product 会变成多行)

INNER 可以省略,也就是说只写 JOIN,就默认是 INNER JOIN

外联(OUTER JOIN)

外联以某表为主表,将另一表的列联结到该表。另一表没有值的列,就用 NULL 代替。使用LEFTRIGHT指定主表。(两个关键字都能实现同样的效果,不过用 LEFT 的多一些)

语法:

SELECT ...FROM product LEFT OUTER JOIN shopON product.p_id = shop.p_id;

这和内联很相似,差别只是联结关键词改成了LEFT OUTER JOIN。这表示以左边的表为主表,把右边的表的内容联结上去。因此左表的所有列都会出现在结果集中。

多表联查举例:

-- 登录异常的账号及密码
select distinct batches.identity_number as '登录失败账号', accounts.passwordfrom ((batches left outer join taskson batches.id = tasks.batch_id)   -- 批次表联结具体的任务表left outer join `status`on tasks.id = status.task_id)  -- 再联结上状态表left outer join accountson batches.identity_number = accounts.identity_number  -- 再联结上账号表where `status`.step_type = 'check_login'     -- 只提取 "check_login" 步骤的记录and status.status != 'info'  -- 状态不为 info,说明登录异常

此外还有 FULL OUTER JOIN 表示返回左右两表的所有行!所有没有匹配的行都给出 NULL

P.S. 其中的关键字 OUTER 通常可省略。但是 LEFT、RIGHT、FULL 不可以省略。

画外:字段引用符号

如果数据库的字段名/数据库名/表名可能和数据库关键字重复,就需要用引用符号将他们引用起来,消除歧义。

MySQL 中经常用反引号干这个事。
而 SQL Server 则使用方括号。
标准 SQL 使用双引号。在看到这些符号时要知道这些差别。

完。(接下来就是用 Python/Java 连接 MySQL 了)

转载于:https://www.cnblogs.com/kirito-c/p/9192776.html

SQL 基础笔记(二):进阶查询相关推荐

  1. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  2. 阿里云AI训练营-SQL基础3:复杂查询方法-视图、子查询、函数等

    3.1 视图 3.1.1 什么是视图 3.1.2 视图与表有什么区别 3.1.3 为什么会存在视图 3.1.4 如何创建视图 3.1.5 如何修改视图结构 3.1.6 如何更新视图内容 3.1.7 如 ...

  3. 通过尚硅谷sql基础的视频及相关资料整理出的SQL基础笔记

    一.数据库技术概念 DB:数据库,存储数据的容器 DBNS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB SQL:结构化查询语言,用于数据库通信的语言,不是某个数据库软件特有的,而 ...

  4. MATLAB 基础笔记(二):常用矩阵的生成

    笔记二是简单介绍常用矩阵的生成 目录 笔记二是简单介绍常用矩阵的生成 1.零矩阵的生成 2.单位矩阵的生成 3.全1矩阵的生成 4.随机整数向量生成 5.生成指定对角线元素矩阵 6.生成对角矩阵 7. ...

  5. SQL基础总结(二):SQL基础

    本系列blog源自前年写的SQL学习笔记,汇总一下发上来. --------------------------------------------------------------- 标识符是可以 ...

  6. MySQL基础(二)查询语句知识点汇总

    查询语句知识点汇总 一.基础查询 二.条件查询 三.排序查询 四.常见函数 4.1 单行函数 4.1.1 字符函数 4.1.2 数学函数 4.1.3 日期函数 4.1.4 其他函数 4.1.5 流程控 ...

  7. SQL基础【二十、索引】(超细致版本,前理论,后实践,应对sql面试绰绰有余)

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.什么是索引? SQL索引有两种,聚集索引和非聚集索引,索 ...

  8. python基础笔记二_面向对象

    面向对象 Object Oriented 概述 面向过程 1.分析出解决问题的步骤,然后逐步实现.例如:婚礼筹办-- 发请柬(选照片.措词.制作)-- 宴席(场地.找厨师.准备桌椅餐具.计划菜品.购买 ...

  9. Android数据库ObjectBox使用笔记[二]:查询操作

    ObjectBox[一]:入门 ObjectBox[二]:查询操作 ObjectBox[三]:关系 ObjectBox[四]:事务 ObjectBox[五]:Kotlin支持 ObjectBox[六] ...

  10. SQL学习笔记-嵌套查询

    嵌套查询 定义: 1 .指在一个外层查询中包含有另一个内层查询.其中外层查询称为主查询,内层查询称为子查询. 2 .SQL允许多层嵌套,由内而外地进行分析,子查询的结果作为主查询的查询条件 3 .子查 ...

最新文章

  1. DQL、DML、DDL、DCL的概念
  2. R语言scale函数标准化缩放dataframe数据列实战
  3. ASP.NET MVC 学习网站
  4. mysql删除有关联的数据库表_【数据库】mysql如何删除关联表
  5. 解决spring配置c3p0连接池,tomcat无法正常启动
  6. DataV:可视化大屏展示神器实战分享
  7. javascript通用验证
  8. c语言占用cpu的程序,Windows下用C语言获取进程cpu使用率,内存使用,IO情况
  9. Leetcode-233-数字1的个数
  10. (TPC-H测试 SF=10,SF=200) PostgreSQL 11 vs 10 vs Deepgreen
  11. iPhone软件KK唱响评测 在线视频比拼歌声
  12. 网络协议学习--SOAP协议(二)
  13. 13异步多线程(三)Parallel,线程安全
  14. GYY的词典 char
  15. 关闭Cortana小娜的几种方法(win10的搜索功能无法使用、黑屏/Cortana占用内存过高)
  16. 160_zigbee协调器_一种判断数据包有没有拿对的方法【掐头去尾发,拿头指针、尾指针去判断】
  17. 如何查看Eclipse是32位还是64位?
  18. hook C++类的虚表,替换成其他函数
  19. c语言“递归系列”:递归实现x的n次方
  20. GraphicConverter Mac图片浏览和编辑器

热门文章

  1. JSPatch源码解读
  2. Handheld Group推出Algiz平板,内置RFID读取器
  3. Ubuntu18.04 关闭和开启图形界面
  4. SPI、I2C、I2S
  5. ThinkPHP redirect 传参
  6. Android内存、性能是程序永恒的话题
  7. Apache 优化配置10条建议
  8. Delphi自动清除临时文件及备份文件的批处理
  9. C++自定义函数类型——typedef的使用
  10. Java 四种权限修饰符