十步完全理解 SQL(转载)
1 SQL是一种声明式语言
SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。
学好SQL要改变传统函数式编程思想,例如用变量传参、使用循环语句、迭代、调用函数等等,都是这种命令式编程的思维惯式。
2 SQL的语句并不按照语法顺序执行
SQL的语法为
SELECT [DISTINCT]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BYSQL的语句执行顺序为
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY
理解:
FROM才是SQL语句执行的第一步,而并非SELECT。数据库在执行SQL的第一步是将数据从硬盘加载到缓冲区中,以便对这些数据进行操作。
SELECT是在大部分语句(FROM、WHERE、GROUP BY、HAVING)执行之后才执行的。这也就是不能在WHERE中使用SELECT中设定别名的字段作为判断条件的原因。
无论在语法上还是在执行顺序上, UNION 总是排在在 ORDER BY 之前。(hive中cluster=distribute+sort,这些语句都不用被动式,sort hive专有,用于局部排序,order全局排序)
3 SQL的核心是对表的引用
“FROM a, b”语句输出的是一张联合表,联合了表a和表b。如果a表有三个字段,b表有5个字段,那么这个“输出表”就有5+3个字段。这个表里的数据是a和b的笛卡尔积。这个联合表有3*5条数据。
FROM 输出的结果被 WHERE 语句筛选后要经过 GROUP BY 语句处理,从而形成新的输出结果。
4 灵活引用表能使SQL语句变得更强大
<table reference> ::=
<table name>
| <derived table>
| <joined table>
三表的表连接不会生产a+b+c各字段。
5 SQL语句中推荐使用JOIN而不是逗号‘,’进行表连接
使用JOIN的好处:
- 安全,不会漏掉连接条件
- 表达能力更强,可限定LEFT JOIN、FULL JOIN等。
6 SQL的JOIN操作
EQUI JOIN
- INNER JOIN
or just JOIN - OUTER JOIN
LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN
- INNER JOIN
SEMI JOIN
只讨论连接的存在性,如想要知道有书的作者。
常见解法是使用IN或EXISTS。-- Using IN
FROM author
WHERE author.id IN (SELECT book.author_id FROM book) -- Using EXISTS
FROM author
WHERE EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)需要说明,IN和EXISTS只在并没有明显的优劣(分大小表情况),IN简洁易懂,EXISTS表达力强。
ANTI JOIN
和SEMI JOIN相反,加一个NOT就行。-- Using IN
FROM author
WHERE author.id NOT IN (SELECT book.author_id FROM book) -- Using EXISTS
FROM author
WHERE NOT EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)CROSS JOIN
求笛卡尔积,可使用逗号‘,’分割两表,或者使用 CROSS JOIN显式实现。DIVISION
JOIN的反操作。这里未介绍。
7 衍生表
也就是子查询。
-- A derived table with an alias
FROM (SELECT * FROM author) a
子查询可以解决SQL执行逻辑顺序带来的问题,如:
-- Get authors' first and last names, and their age in days
SELECT first_name, last_name, age
FROM (
SELECT first_name, last_name, current_date - date_of_birth age
FROM author
)
-- If the age is greater than 10000 days
WHERE age > 10000
衍生表可以进化为common table expressions通用数据表达式(WITH a AS SELECT)。
子查询(嵌套SELECT,查询结果作为另一个查询语句的输入,最常用于IN、EXISTS、HAVING等中),视图(CREATE VIEW AS不能进行索引,内联视图区别于子查询带别名alies,可以进行后续的连接等操作),临时表(CREATE TEMPORARY TABLE vta_show AS SELECT,可以进行索引)
8 SQL GROUP BY对表引用进行转化
GROUP BY将创建一个只有GROUP BY中列的表引用,不过仍然可以在select中使用其它列作为聚集函数的参数。
9 SQL的SELECT在关系代数中被称为投影
在没有GROUP BY的查询中,SELECT不要同时包含聚集函数和非聚集函数。
其它语句都是对表引用(table reference)管道传输,而SELECT进行彻底地映射转化。
10 SQL中的DISTINCT、UNION、ORDER BY和OFFSET等都很简单
理解SELECT之后,再来看这些操作都很简单。
集合操作
- DISTINCT--去重
- UNION--集合并,去重
- UNION ALL--集合并,不去重,快速,推荐使用
- EXCEPT--集合差
- INTERSECT--集合交集
排序操作
ORDER BY.
自己的使用心得
表连接的时候可以把表看做线(关系),把关联的字段当做节点。
十步完全理解 SQL(转载)的更多相关文章
- 经典:十步完全理解 SQL
经典:十步完全理解 SQL 来源:伯乐在线 链接:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完 ...
- (转)十步完全理解 SQL
十步完全理解 SQL 目录[-] 10个简单步骤,完全理解SQL 1. SQL 是一种声明式语言 2. SQL 的语法并不按照语法顺序执行 3. SQL 语言的核心是对表的引用(table refer ...
- 转载文章----十步完全理解SQL
转载地址:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程 ...
- 【转载】十步完全理解SQL
很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言) ...
- 十步完全理解 SQL(转载)
英文出处:Lukas Eder. 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言(尽管有些人认为 ...
- 十步完全理解SQL
转载于:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序 ...
- 十步完全理解SQL(转)
本文由 伯乐在线 - 水果泡腾片 翻译.未经许可,禁止转载!英文出处:Lukas Eder.欢迎加入翻译组. 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同 ...
- [转]十步完全理解SQL
原文地址:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程 ...
- 转:十步完全理解SQL
来自:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...
随机推荐
- UC浏览器打开首页显示:显示此网页时出了点问题
使用UC浏览器打开网页的时候显示出错,如下图所示.但是用其他浏览器都很正常 我自己用的解决方法:最近刚下载了驱动精灵,听同学的把驱动精灵卸载了就恢复正常了
- Java流(Stream)、文件(File)和IO
Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列 ...
- vscode添加Astyle
1.安装astyle插件,在应用商城里面一键安装即可.2.下载astyle的bin文件,并添加到系统环境变量.3.打开vscode的settings.json,添加以下代码. { "edit ...
- JAVA运行环境配置
win10下,右击我的电脑-->高级系统设置-->高级-->环境变量-->系统变量 1新建 变量名 JAVA_HOME 变量值 C:\Program Files\Jav ...
- [USACO]奶牛赛跑(逆序对)
Description 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈 ...
- vba中ListBox控件的使用
给ListBox添加内容 If CheckBox8 = True Then---------------------------checkbox控件被选中 For i = 0 To ListBox1. ...
- java十分钟速懂知识点——引用
一.由健忘症引起的问题 今天闲来没事在日志中瞟见了个OutOfMemoryError错误,不由得想到前一段时间看到一篇面经里问到Java中是否有内存泄露,这个很久以前是留意过的,大体记得内存溢出和内存 ...
- C#实现eval 进行四则运算(有码)
在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~ 在这里为大家封装了一个C#版本的eval函数,具体的设计参考了<大 ...
- 33、Android Support兼容包详解(转载)
原文转自:微信分享 2015-03-31 22:11 背景 来自于知乎上邀请回答的一个问题Android中AppCompat和Holo的一个问题?, 看来很多人还是对这些兼容包搞不清楚,那么干脆写篇博 ...
- Monkey log异常分析说明
以下主要针对在Android-Phone项目中进行Monkey log进行分析和说明,可以对bug提交作为参考. 要求熟悉,应用的包名.也就是说那个应用包出现问题,该属于那个模块,应用包名是判断依据. ...