十步完全理解 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 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...
随机推荐
- Date.prototype.Format---对Date的扩展
// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...
- JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)
3462. [NOIP2013模拟联考5]休息(rest) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- 03.VUE学习之动态绑定值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- Compiler Error Message: CS0016: Could not write to output
打开网页是报错: Server Error in '/' Application. Compilation Error Description: An error occurred during th ...
- NAND Flash和NOR Flash的比较
目前Flash主要有两种NOR Flash和NADN Flash.NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的 ...
- 问题 1936: [蓝桥杯][算法提高VIP]最大乘积
问题 1936: [蓝桥杯][算法提高VIP]最大乘积 时间限制: 1Sec 内存限制: 128MB 提交: 77 解决: 16 题目描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? ...
- 使用chrome开发程序,自动刷新开发目录
npm i livereload -g 在开发目录下: livereload 安装这个插件:https://chrome.google.com/webstore/detail/livereload/j ...
- cookie注意事项
cookie是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式. 四种会话跟踪技术(URL重写.隐藏表单域.Cookie.Session) 服务端技术:URL重写,Session, ...
- Robotium接入到Jenkins持续集成自动化测试
6.3 将测试用例接入到Jenkins 由于我是自己学习的手机自动化测试,没有实际投入到工作中使用,jenkins的接入也没有具体操作,现摘抄一下网页:http://www.tuicool.com/a ...
- 理解机器为什么可以学习(二)---Training versus Testing
前边由Hoeffding出发讨论了为什么机器可以学习,主要就是在N很大的时候Ein PAC Eout,选择较小的Ein,这样的Eout也较小,但是当时还有一个问题没有解决,就是当时的假设的h的集合是个 ...