SQL 基础笔记(二):进阶查询
本笔记整理自《SQL 基础教程》、《MySQL 必知必会》和网上资料。个人笔记不保证正确。
一、复杂查询
视图
将 SELECT 查询包装成一个虚拟表,该虚拟表就被称为视图。(因为只是一个包装,因此视图的数据也会随着原表的更新而更新)
- 用途:
- 简化复杂的SQL查询,用它替换子查询,能降低查询的嵌套深度。
- SELECT 查询的重用,减少重复查询。
- ...
- 创建视图:
CREATE VIEW <视图名称>(<视图列名1>, <视图列名2>... )AS<SELECT 语句>;
其中 SELECT 的结果列和视图列名一一对应。
- 视图的限制
- 视图的 SELECT 子句,不能包含 ORDER BY 子句。因为视图也是表,而表是集合,它没有顺序。(也有些DB支持该用法,但不通用)
- 视图的更新:只在很有限的条件下,才能在视图上使用 INSERT/DELETE/UPDATE 这样的变更数据的语句。(视图应该只用于检索,能不更新就不要更新它)
- 删除视图:
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 的
- 算术函数
- 加减乘除:+ - * /
- ABS 绝对值
- MOD 求余
- ROUND 四舍五入
- 字符串函数
- CONCAT(str1,str2,...) 拼接
- LENGTH(str) 字符串的 bytes 长度
- CHAR_LENGTH(str)
- LOWER/UPPER 大小写转换
- REPLACE(str,from_str,to_str) 替换
- SUBSTRING(str FROM pos FOR len) 截取
- 时间和日期函数
- CURRENT_DATE 当前日期
- CURRENT_TIME 当前时间
- CURRENT_TIMESTAMP 当前的日期和时间
- EXTRACT(unit FROM date) 截取日期元素,unit 可为
YEAR
MONTH
HOUR
等等
- 转换函数
- CAST(expr AS type) 将 expr 的结果转换成 type 类型
- COALESCE(value,...) 从左往右扫描,返回第一个非 NULL 的值。常用于将 NULL 转换为其他值。eg. COALESCE(sth, 1) 如果 sth 为 NULL 就会返回1.
- 聚合函数:基本就五个,已经学过了。
谓词
即返回布尔值的表达式
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 表达式
- if - else if - else 形式:
CASE WHEN <求值表达式> THEN <表达式>WHEN <求值表达式> THEN <表达式>WHEN <求值表达式> THEN <表达式>...ELSE <表达式>
END
- switch 模式(但不需要break)
CASE <表达式>WHEN <表达式> THEN <表达式>WHEN <表达式> THEN <表达式>...ELSE <表达式>
END
这是对 CASE 后的元素做switch比较。
三、集合运算
注意事项
- 作为运算对象的结果集,列字段必须一一对应,而且对应列的类型必须相同。
结果集的交并差
<查询1> UNION <查询2>
:对两个结果集求并UNION ALL
:添加 ALL 能使结果集包含重复行。<查询1> INTERSECT <查询2>
:两结果集的交集<查询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 代替。使用
LEFT
或RIGHT
指定主表。(两个关键字都能实现同样的效果,不过用 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 基础笔记(二):进阶查询相关推荐
- StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...
- 阿里云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 如 ...
- 通过尚硅谷sql基础的视频及相关资料整理出的SQL基础笔记
一.数据库技术概念 DB:数据库,存储数据的容器 DBNS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB SQL:结构化查询语言,用于数据库通信的语言,不是某个数据库软件特有的,而 ...
- MATLAB 基础笔记(二):常用矩阵的生成
笔记二是简单介绍常用矩阵的生成 目录 笔记二是简单介绍常用矩阵的生成 1.零矩阵的生成 2.单位矩阵的生成 3.全1矩阵的生成 4.随机整数向量生成 5.生成指定对角线元素矩阵 6.生成对角矩阵 7. ...
- SQL基础总结(二):SQL基础
本系列blog源自前年写的SQL学习笔记,汇总一下发上来. --------------------------------------------------------------- 标识符是可以 ...
- MySQL基础(二)查询语句知识点汇总
查询语句知识点汇总 一.基础查询 二.条件查询 三.排序查询 四.常见函数 4.1 单行函数 4.1.1 字符函数 4.1.2 数学函数 4.1.3 日期函数 4.1.4 其他函数 4.1.5 流程控 ...
- SQL基础【二十、索引】(超细致版本,前理论,后实践,应对sql面试绰绰有余)
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.什么是索引? SQL索引有两种,聚集索引和非聚集索引,索 ...
- python基础笔记二_面向对象
面向对象 Object Oriented 概述 面向过程 1.分析出解决问题的步骤,然后逐步实现.例如:婚礼筹办-- 发请柬(选照片.措词.制作)-- 宴席(场地.找厨师.准备桌椅餐具.计划菜品.购买 ...
- Android数据库ObjectBox使用笔记[二]:查询操作
ObjectBox[一]:入门 ObjectBox[二]:查询操作 ObjectBox[三]:关系 ObjectBox[四]:事务 ObjectBox[五]:Kotlin支持 ObjectBox[六] ...
- SQL学习笔记-嵌套查询
嵌套查询 定义: 1 .指在一个外层查询中包含有另一个内层查询.其中外层查询称为主查询,内层查询称为子查询. 2 .SQL允许多层嵌套,由内而外地进行分析,子查询的结果作为主查询的查询条件 3 .子查 ...
最新文章
- DQL、DML、DDL、DCL的概念
- R语言scale函数标准化缩放dataframe数据列实战
- ASP.NET MVC 学习网站
- mysql删除有关联的数据库表_【数据库】mysql如何删除关联表
- 解决spring配置c3p0连接池,tomcat无法正常启动
- DataV:可视化大屏展示神器实战分享
- javascript通用验证
- c语言占用cpu的程序,Windows下用C语言获取进程cpu使用率,内存使用,IO情况
- Leetcode-233-数字1的个数
- (TPC-H测试 SF=10,SF=200) PostgreSQL 11 vs 10 vs Deepgreen
- iPhone软件KK唱响评测 在线视频比拼歌声
- 网络协议学习--SOAP协议(二)
- 13异步多线程(三)Parallel,线程安全
- GYY的词典 char
- 关闭Cortana小娜的几种方法(win10的搜索功能无法使用、黑屏/Cortana占用内存过高)
- 160_zigbee协调器_一种判断数据包有没有拿对的方法【掐头去尾发,拿头指针、尾指针去判断】
- 如何查看Eclipse是32位还是64位?
- hook C++类的虚表,替换成其他函数
- c语言“递归系列”:递归实现x的n次方
- GraphicConverter Mac图片浏览和编辑器