仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1085|回复: 8
打印 上一主题 下一主题

[学习教程] 怎样的了解才是完整了解SQL(二)

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。假如我们从汇合论(干系代数)的角度来看,一张数据库的表就是一组数据元的干系,而每一个SQL语句会改动一种或数种干系,从而发生出新的数据元的干系(即发生新的表)。

我们学到了甚么?
思索成绩的时分从表的角度来思索成绩提,如许很简单了解数据怎样在SQL语句的“流水线”长进行了甚么样的变化。

4、天真援用表能使SQL语句变得更壮大

天真援用表能使SQL语句变得更壮大。一个复杂的例子就是JOIN的利用。严厉的说JOIN语句并不是是SELECT中的一部分,而是一种特别的表援用语句。SQL言语尺度中表的毗连界说以下:
<tablereference>::=
<tablename>
|<derivedtable>
|<joinedtable>
就拿之前的例子来讲:
FROMa,b
a大概输如如许的毗连:a1JOINa2ONa1.id=a2.id
将它放到之前的例子中就酿成了:FROMa1JOINa2ONa1.id=a2.id,b

只管将一个毗连表用逗号跟另外一张表团结在一同并非经常使用作法,可是你切实其实能够这么做。了局就是,终极输入的表就有了a1+a2+b个字段了。

(译者注:原文这里用词为degree,译为维度。假如把一张表视图化,我们能够设想每张表都是由横纵两个维度构成的,横向维度即我们所说的字段大概列,英文为columns;纵向维度即代表了每条数据,英文为record,依据高低文,作者这里所指的应当是字段数。)

在SQL语句中派生表的使用乃至比表毗连加倍壮大,上面我们就要讲到表毗连。

我们学到了甚么?

思索成绩时,要从表援用的角度动身,如许就很简单了解数据是如何被SQL语句处置的,而且可以匡助你了解那些庞大的表援用是做甚么的。

更主要的是,要了解JOIN是构建毗连表的关头词,并非SELECT语句的一部分。有一些数据库同意在INSERT、UPDATE、DELETE中利用JOIN。

5、SQL语句中保举利用表毗连

我们先看看方才这句话:
FROMa,b
初级SQL程序员大概学会给你忠言:只管不要利用逗号来取代JOIN举行表的毗连,如许会进步你的SQL语句的可读性,而且能够制止一些毛病。

使用逗号来简化SQL语句偶然候会形成头脑上的凌乱,想一下上面的语句:
FROMa,b,c,d,e,f,g,h
WHEREa.a1=b.bx
ANDa.a2=c.c1
ANDd.d1=b.bc
...

我们不丢脸出利用JOIN语句的优点在于:
平安。JOIN和要毗连的表离得十分近,如许就可以制止毛病。更多毗连的体例,JOIN语句能往辨别出来外毗连和内毗连等。

我们学到了甚么?

记住要只管利用JOIN举行表的毗连,永久不要在FROM前面利用逗号毗连表。

6、SQL语句中分歧的毗连操纵

SQL语句中,表毗连的体例从基本上分为五种:
EQUIJOIN
SEMIJOIN
ANTIJOIN
CROSSJOIN
DIVISION
EQUIJOIN

这是一种最一般的JOIN操纵,它包括两种毗连体例:

INNERJOIN(大概是JOIN)
OUTERJOIN(包含:LEFT、RIGHT、FULLOUTERJOIN)

SEMIJOIN

这类毗连干系在SQL中有两种体现体例:利用IN,大概利用EXISTS。“SEMI”在拉丁文中是“半”的意义。这类毗连体例是只毗连方针表的一部分。这是甚么意义呢?再想一下下面关于作者和书名的毗连。我们设想一下如许的情形:我们不必要作者/书名如许的组合,只是必要那些在书名表中的书的作者信息。那我们就可以这么写:
UsingIN
FROMauthor
WHEREauthor.idIN(SELECTbook.author_idFROMbook)

UsingEXISTS
FROMauthor
WHEREEXISTS(SELECT1FROMbookWHEREbook.author_id=author.id)

只管没有严厉的划定申明你什么时候应当利用IN,什么时候应当利用EXISTS,可是这些事变你仍是应当晓得的:

1,IN比EXISTS的可读性更好

2,EXISTS比IN的表达性更好(更合适庞大的语句)

3,两者之间功能没有差别(但关于某些数据库来讲功能差别会十分年夜)

由于利用INNERJOIN也能失掉书名表中书所对应的作者信息,以是良多初学者时机以为能够经由过程DISTINCT举行往重,然后将SEMIJOIN语句写成如许:
SELECTDISTINCTfirst_name,last_name
FROMauthor
JOINbookONauthor.id=book.author_id

这是一种很糟的写法,缘故原由以下:

SQL语句功能低下:由于往重操纵(DISTINCT)必要数据库反复从硬盘中读取数据到内存中。(译者注:DISTINCT切实其实是一种很泯灭资本的操纵,可是每种数据库关于DISTINCT的操纵体例大概分歧)。

这么写并不是完整准确:只管大概如今这么写不会呈现成绩,可是跟着SQL语句变得愈来愈庞大,你想要往重失掉准确的了局就变得好不容易。先说DDL的分类。有一类DDL,是不需要重建表的,比如加非聚簇索引。这类操作其实不会丢数据,也是在原表上直接操作,对于我们“以恢复数据为目的”的闪回,是可以先忽略的。另外一类,则是会影响到表数据的操作。
不帅 该用户已被删除
沙发
发表于 2015-1-18 11:57:13 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
爱飞 该用户已被删除
板凳
发表于 2015-1-26 12:51:21 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
小妖女 该用户已被删除
地板
发表于 2015-2-4 19:05:54 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
乐观 该用户已被删除
5#
发表于 2015-2-10 06:04:58 | 只看该作者
比如日志传送、比如集群。。。
分手快乐 该用户已被删除
6#
发表于 2015-3-1 00:24:29 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
第二个灵魂 该用户已被删除
7#
发表于 2015-3-10 11:29:33 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
深爱那片海 该用户已被删除
8#
发表于 2015-3-17 07:09:23 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
谁可相欹 该用户已被删除
9#
发表于 2015-3-24 01:58:27 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 02:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表