文档章节

理解SQL

Gong_Chen
 Gong_Chen
发布于 2016/04/13 14:28
字数 887
阅读 41
收藏 3
  1. SQL是一种声明式的语言

    SQL语言只是告知数据库你想取得什么样的数据结果,不告知数据库如何去取得这个数据结果

  2. SQL执行顺序不同于语法顺序

    一般情况下SQL的语法顺序如下:

SELECT [DISTINCT] 
FROM
JOIN
ON
WHERE
GROUP BY
HAVING
UNION
ORDER BY

     SQL的执行顺序如下:

FROM       对FROM中的前两个表执行笛卡尔积,生成虚拟表VT_1
ON         对VT_1使用ON条件进行过滤,生成虚拟表VT_2
JOIN       根据不同的连接类型确定保留表和需要插入到VT_2中的数据,生成虚拟表VT_3,若FROM多张表则重复上述操作WHERE      对VT_3表使用WHERE条件进行过滤,生成虚拟表VT_4
GROUP BY   对VT_4表使用GROUP BY中的列进行分组,生成虚拟表VT_5
HAVING     对VT_5表使用HAVING条件进行过滤,生成虚拟表VT_6
SELECT     选择出SELECT列出的列,生成虚拟表VT_7
DISTINCT   去除VT_7表中重复的行,生成虚拟表VT_8
UNION      
ORDER BY   对VT_8按照ORDER BY中的列进行排序,返回一个游标

     应注意如下几点:

  (1)SQL是基于集合理论的,集合仅仅是数据的逻辑集合,不会对数据进行排序,所以不要为表中的行假定任何顺序

  (2)FROM是整个SQL语句执行的起点,它将数据从磁盘加载到数据缓冲区中

  (3)SELECT语句在FROM、WHERE和GROUP BY之句之后执行,所以,不能在WHERE子句中引用SELECT设定的别名

  (4)SQL语法和执行上UNION都在ORDER BY之前,所以不是每个UNION中的字段都能进行排序

  (5)ORDER BY是唯一可以使用SELECT子句中设定的别名的地方,它返回的不再是虚拟表,而是一个游标,所以使用了ORDER BY的子查询不能用作表表达式(视图、子查询、派生表等)

三、SQL的核心是对表的引用

    从上面SQL的执行中可以看到每一步都是产生一张表(ORDER BY除外),所以SQL的核心是对表的引用,从集合理论的角度来看一张数据库表对应一组数据元,每个SQL子句的执行就会改变数据元的关系,从而生成新的数据元,也就产生了新的表

四、SQL的表连接

     SQL中尽量使用JOIN而不要使用逗号在FROM中连接表

     SQL中的连接可以分为5类:EQUI JOIN、SEMI JOIN、ANTI JOIN、CROSS JOIN、DIVISION

     EQUI JOIN主要包括两种连接:INNER JOIN和OUTER JOIN(LEFT、RIGHT、FULL OUTER JOIN)

     SEMI JOIN主要包括IN和EXISTS,SEMI在拉丁文中是半的意思,只连接目标表的一部分,使用IN与EXISTS之间并没有性能上的差异(尽管有些数据性能上的差异非常大),通常我们会有通过INNER JOIN后DISITINCT进行去重操作,但这样性能非常低下,所以不建议这么做

     ANTI JOIN与SEMI JOIN相反,有NOT IN与NOT EXISTS

     CROSS JOIN连接的结果时两个表的乘积

     DIVISION是JOIN的一个逆过程,比较少用

五、SQL语句中GROUP BY是对表的引用进行的操作

     注意:当你是使用GROUP BY子句时,SELECT后没有使用聚合函数的列都要出现在GROUP BY后面,但MySQL并非这样

© 著作权归作者所有

上一篇: Redis学习二
下一篇: Redis学习一
Gong_Chen
粉丝 1
博文 23
码字总数 9377
作品 0
长沙
私信 提问
POWER BI之DAX与SQL区别

前言: 这篇文章对于具有一点SQL查询基础人会十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等。 注:此文不涉及到Filter Context(筛选上下文)的介绍。 正文: 对于对SQL有一定了解的人来...

DBAspace
2018/07/03
0
0
我个人觉得发明Hibernate的人就是一畜生,你们觉得呢?

我个人觉得发明Hibernate的人就是一畜生层壳,我已经精通SQL了,我却还要很累地去为他加上一层壳,过了很久过后,我还要去理解它变成SQL是什么样子,我吃多了。 Hibernate真的面向对象了吗?...

快速开发师
2015/02/11
6.3K
69
数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析

关注微信公众号:【芋艿的后端小屋】有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留...

芋艿V
2017/07/30
0
0
数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析【推荐阅读】

🙂🙂🙂关注微信公众号:【芋艿的后端小屋】有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码...

芋道源码掘金Java群217878901
2017/07/30
0
0
开发者应该学习 SQL 的九个理由

按:“什么都略懂一点,生活就会多彩一点。” 编程语言、开发工具、数据库、网页前端甚至是美工设计,只要能够帮助我们Get Things Done,能够使我们成为一个更好的Developer,都不妨一试,技...

小卒过河
2011/07/31
1K
19

没有更多内容

加载失败,请刷新页面

加载更多

数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
5
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
5
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部