仓酷云

标题: 怎样的了解才是完整了解SQL(一) [打印本页]

作者: 若相依    时间: 2015-1-16 14:07
标题: 怎样的了解才是完整了解SQL(一)
在执行崩溃恢复时,理解在一个数据库中的每一个表tbl_name对应的在数据库目录中的3个文件是很重要的:良多程序员视SQL为祸不单行。SQL是一种为数未几的声明性言语,它的运转体例完整分歧于我们所熟知的命令行言语、面向工具的程序言语、乃至是函数言语(只管有些人以为SQL言语也是一种函数式言语)。

我们天天都在写SQL而且使用在开源软件jOOQ中。因而我想把SQL之美先容给那些仍旧对它头疼不已的伴侣,以是本文是为了以下读者而专程编写的:
1、在事情中会用到SQL可是对它其实不完整懂得的人。
2、可以纯熟利用SQL可是其实不懂得其语法逻辑的人。
3、想要教他人SQL的人。

本文侧重先容SELECT句式,其他的DML(DataManipulationLanguage数据利用言语命令)将会在其余文章中举行先容。

10个复杂步骤,完整了解SQL

1、SQL是一种声明式言语

起首要把这个观点记在脑中:“声明”。SQL言语是为盘算机声了然一个你想从原始数据中取得甚么样的了局的一个典范,而不是告知盘算机怎样可以失掉了局。这是否是很棒?

(译者注:复杂地说,SQL言语声明的是了局集的属性,盘算时机依据SQL所声明的内容来从数据库中选择出切合声明的数据,而不是像传统编程头脑往唆使盘算机怎样操纵。)
SELECTfirst_name,last_nameFROMemployeesWHEREsalary>100000

下面的例子很简单了解,我们不体贴这些雇员纪录从那里来,我们所必要的只是那些高薪者的数据(译者注:salary>100000)

我们从哪儿进修到这些?

假如SQL言语这么复杂,那末是甚么让人们“闻SQL色变”?次要的缘故原由是:我们潜认识中的是依照命令式编程的头脑体例思索成绩的。就仿佛如许:“电脑,先实行这一步,再实行那一步,可是在那之前先反省一下是不是满意前提A和前提B”。比方,用变量传参、利用轮回语句、迭代、挪用函数等等,都是这类命令式编程的头脑惯式。

2、SQL的语法其实不依照语法按次实行

SQL语句有一个让年夜部分人都感应狐疑的特征,就是:SQL语句的实行按次跟其语句的语法按次其实不分歧。SQL语句的语法按次是:
1,SELECT[DISTINCT]
2,FROM
3,WHERE
4,GROUPBY
5,HAVING
6,UNION
7,ORDERBY

为了便利了解,下面并没有把一切的SQL语法布局都列出来,可是已足以申明SQL语句的语法按次和其实行按次完整纷歧样,就以上述语句为例,其实行按次为:
1,FROM
2,WHERE
3,GROUPBY
4,HAVING
5,SELECT
6,DISTINCT
7,UNION
8,ORDERBY

关于SQL语句的实行按次,有三个值得我们注重的中央:

1、FROM才是SQL语句实行的第一步,并不是SELECT。数据库在实行SQL语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据举行操纵。(译者注:原文为“Thefirstthingthathappensisloadingdatafromthediskintomemory,inordertooperateonsuchdata.”,可是并不是云云,以Oracle等经常使用数据库为例,数据是从硬盘中抽取到数据缓冲区中举行操纵。)

2、SELECT是在年夜部分语句实行了以后才实行的,严厉的说是在FROM和GROUPBY以后实行的。了解这一点长短常主要的,这就是你不克不及在WHERE中利用在SELECT中设定别号的字段作为判别前提的缘故原由。
SELECTA.x+A.yASz
FROMA
WHEREz=10
--z在此处不成用,由于SELECT是最初实行的语句!
假如你想重用别号z,你有两个选择。要末就从头写一遍z所代表的表达式:
SELECTA.x+A.yASz2.
FROMA3.
WHERE(A.x+A.y)=10
大概乞助于衍生表、通用数据表达式大概视图,以免别号重用。请看下文中的例子。

3、不管在语法上仍是在实行按次上,UNION老是排在在ORDERBY之前。良多人以为每一个UNION段都能利用ORDERBY排序,可是依据SQL言语尺度和各个数据库SQL的实行差别来看,这并非真的。只管某些数据库同意SQL语句对子查询(subqueries)大概派生表(derivedtables)举行排序,可是这其实不申明这个排序在UNION操纵事后仍坚持排序后的按次。

注重:并不是一切的数据库对SQL语句利用不异的剖析体例。如MySQL、PostgreSQL和SQLite中就不会依照下面第二点中所说的体例实行。

我们学到了甚么?

既然并非一切的数据库都依照上述体例实行SQL估计,那我们的劳绩是甚么?我们的劳绩是永久要记得:SQL语句的语法按次和其实行按次其实不分歧,如许我们就可以制止一样平常性的毛病。假如你能记着SQL语句语法按次和实行按次的差别,你就可以很简单的了解一些很罕见的SQL成绩。

固然,假如一种言语被计划成语法按次间接反响其语句的实行按次,那末这类言语对程序员是非常友爱的,这类编程言语层面的计划理念已被微软使用到了LINQ言语中。

3、SQL言语的中心是对表的援用(tablereferences)

因为SQL语句语法按次和实行按次的分歧,良多同砚会以为SELECT中的字段信息是SQL语句的中心。实在真实的中心在于对表的援用。

依据SQL尺度,FROM语句被界说为:
<fromclause>::=FROM<tablereference>[{<comma><tablereference>}...]

FROM语句的“输入”是一张团结表,来自于一切援用的表在某一维度上的团结。我们们渐渐来剖析:
FROMa,b
下面这句FROM语句的输入是一张团结表,团结了表a和表b。假如a表有三个字段,b表有5个字段,那末这个“输入表”就有8(=5+3)个字段。

这个团结内外的数据是a*b,即a和b的笛卡尔积。换句话说,也就是a表中的每条数据都要跟b表中的每条数据配对。假如a表有3条数据,b表有5条数据,那末团结表就会有15(=5*3)条数据。

FROM输入的了局被WHERE语句选择后要经由GROUPBY语句处置,从而构成新的输入了局。我们前面还会再会商这方面成绩。由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:
作者: 变相怪杰    时间: 2015-1-18 11:57
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
作者: 金色的骷髅    时间: 2015-1-26 12:51
连做梦都在想页面结构是怎么样的,绝非虚言
作者: 小魔女    时间: 2015-2-4 19:06
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
作者: 精灵巫婆    时间: 2015-2-10 06:04
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
作者: 飘飘悠悠    时间: 2015-3-1 00:44
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
作者: 仓酷云    时间: 2015-3-10 11:37
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
作者: 小女巫    时间: 2015-3-17 07:09
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
作者: 深爱那片海    时间: 2015-3-24 01:58
你可以简单地认为适合的就是好,不适合就是不好。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2