怎么样的理解才是完全理解SQL(二)

如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个 SQL 语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。

我们学到了什么?
思考问题的时候从表的角度来思考问题提,这样很容易理解数据如何在 SQL 语句的“流水线”上进行了什么样的变动。

4、 灵活引用表能使 SQL 语句变得更强大

灵活引用表能使 SQL 语句变得更强大。一个简单的例子就是 JOIN 的使用。严格的说 JOIN 语句并非是 SELECT 中的一部分,而是一种特殊的表引用语句。 SQL 语言标准中表的连接定义如下:
<table reference > ::= 
<table name >
| <derived table >
| <joined table > 
就拿之前的例子来说:
FROM a, b 
a 可能输如这样的连接:a1 JOIN a2 ON a1.id = a2.id 
将它放到之前的例子中就变成了:FROM a1 JOIN a2 ON a1.id = a2.id, b 

尽管将一个连接表用逗号跟另一张表联合在一起并不是常用作法,但是你的确可以这么做。结果就是,最终输出的表就有了 a1+a2+b 个字段了。

(译者注:原文这里用词为 degree  ,译为维度。如果把一张表视图化,我们可以想象每一张表都是由横纵两个维度组成的,横向维度即我们所说的字段或者列,英文为columns;纵向维度即代 表了每条数据,英文为 record ,根据上下文,作者这里所指的应该是字段数。)

在 SQL 语句中派生表的应用甚至比表连接更加强大,下面我们就要讲到表连接。

我们学到了什么?

思考问题时,要从表引用的角度出发,这样就很容易理解数据是怎样被 SQL 语句处理的,并且能够帮助你理解那些复杂的表引用是做什么的。

更重要的是,要理解 JOIN 是构建连接表的关键词,并不是 SELECT 语句的一部分。有一些数据库允许在 INSERT 、 UPDATE 、 DELETE 中使用 JOIN 。

5、 SQL 语句中推荐使用表连接

我们先看看刚刚这句话:
FROM a, b 
高级 SQL 程序员也许学会给你忠告:尽量不要使用逗号来代替 JOIN 进行表的连接,这样会提高你的 SQL 语句的可读性,并且可以避免一些错误。

利用逗号来简化 SQL 语句有时候会造成思维上的混乱,想一下下面的语句:
FROM a, b, c, d, e, f, g, h 
WHERE a.a1 = b.bx 
AND a.a2 = c.c1 
AND d.d1 = b.bc 
... 

我们不难看出使用 JOIN 语句的好处在于:
安全。 JOIN 和要连接的表离得非常近,这样就能避免错误。更多连接的方式,JOIN 语句能去区分出来外连接和内连接等。

我们学到了什么?

记着要尽量使用 JOIN 进行表的连接,永远不要在 FROM 后面使用逗号连接表。

6、 SQL 语句中不同的连接操作

SQL 语句中,表连接的方式从根本上分为五种:
EQUI JOIN
SEMI JOIN
ANTI JOIN
CROSS JOIN
DIVISION
EQUI JOIN

这是一种最普通的 JOIN 操作,它包含两种连接方式:

INNER JOIN(或者是 JOIN )
OUTER JOIN(包括: LEFT 、 RIGHT、 FULL OUTER JOIN)

SEMI JOIN

这种连接关系在 SQL 中有两种表现方式:使用 IN,或者使用 EXISTS。“ SEMI  ”在拉丁文中是“半”的意思。这种连接方式是只连接目标表的一部分。这是什么意思呢?再想一下上面关于作者和书名的连接。我们想象一下这样的情况:我们不 需要作者 / 书名这样的组合,只是需要那些在书名表中的书的作者信息。那我们就能这么写:

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 ,但是这些事情你还是应该知道的:

1,IN比 EXISTS 的可读性更好

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

3,二者之间性能没有差异(但对于某些数据库来说性能差异会非常大)

因为使用 INNER JOIN 也能得到书名表中书所对应的作者信息,所以很多初学者机会认为可以通过 DISTINCT 进行去重,然后将 SEMI JOIN 语句写成这样:

SELECT DISTINCT first_name, last_name
FROM author
JOIN book ON author.id = book.author_id 


这是一种很糟糕的写法,原因如下:

SQL 语句性能低下:因为去重操作( DISTINCT )需要数据库重复从硬盘中读取数据到内存中。(译者注: DISTINCT 的确是一种很耗费资源的操作,但是每种数据库对于 DISTINCT 的操作方式可能不同)。

沈阳463美容医院程序提醒:这么写并非完全正确:尽管也许现在这么写不会出现问题,但是随着 SQL 语句变得越来越复杂,你想要去重得到正确的结果就变得十分困难。

转载于:https://www.cnblogs.com/chaorenman/p/4157686.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scala学习笔记-环境搭建以及简单语法

关于环境的搭建&#xff0c;去官网下载JDK8和Scala的IDE就可以了&#xff0c;Scala的IDE是基于Eclipse的。 下面直接上代码&#xff1a; 这是项目目录&#xff1a; A是scala写的&#xff1a; package first import scala.collection.mutable.ListBufferobject A {def main(args…

UVa 12169 (枚举+扩展欧几里得) Disgruntled Judge

题意&#xff1a; 给出四个数T, a, b, x1,按公式生成序列 xi (a*xi-1 b) % 10001 (2 ≤ i ≤ 2T) 给出T和奇数项xi&#xff0c;输出偶数项xi 分析&#xff1a; 最简单的办法就是直接枚举a、b&#xff0c;看看与输入是否相符。 1 #include <cstdio>2 3 const int maxn …

使用Beautifulsoup爬取药智网数据

使用Beautifulsoup模块爬取药智网数据 Tips&#xff1a;1.爬取多页时&#xff0c;先用一页的做测试&#xff0c;要不然ip容易被封 2.自己常用的处理数据的方法&#xff1a; regre.compile(正则表达式) datareg.sub(要替换的字符串,data) 代码&#xff08;其实没多少&#xff09…

幂集 返回某集合的所有子集

幂集。编写一种方法&#xff0c;返回某集合的所有子集。集合中不包含重复的元素。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入&#xff1a; nums [1,2,3]输出&#xff1a; [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]来源&#xff1a;力扣&#xff08;LeetCode…

iOS标准时间与时间戳相互转换

本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dzqd.html [cpp] view plaincopy 设置时间显示格式: NSString* timeStr "2011-01-26 17:40:50"; NSDateFormatter *formatter [[[NSDateFormatter alloc] init] autorelease]; [formatter s…

JavaScript设计模式 Item 3 --封装

在JavaScript 中&#xff0c;并没有对抽象类和接口的支持。JavaScript 本身也是一门弱类型语言。在封装类型方面&#xff0c;JavaScript 没有能力&#xff0c;也没有必要做得更多。对于JavaScript 的设计模式实现来说&#xff0c;不区分类型是一种失色&#xff0c;也可以说是一…

【WCF安全】WCF 自定义授权[用户名+密码+x509证书]

1.x509证书制作(略) 2.直接贴代码 ----------------------------------------------------------------------服务端------------------------------------------------------------------------------------------- WCF服务 1 using System;2 using System.Collections.Generi…

openMVS-编译

opencv4 编译 会有问题&#xff0c;可以重新下载 opencv3 编译并指定好路径。 OpenCV_DIRyour opencv3 build install path cmake -DCMAKE_BUILD_TYPERelease -DVCG_ROOT"$main_path/vcglib" ..

ASP.NET Web API 数据提供系统相关类型及其关系

转载于:https://www.cnblogs.com/frankyou/p/4932651.html

openMVG跑自定义数据出错

使用自己拍摄的图片跑 openMVG 的 turtor_demo.py 时&#xff0c;出现错误&#xff0c;没有生成 sfm_data.bin DSC01988" model "DSC-RX100M6" doesnt exist in the database Please consider add your camera model and sensor width in the database.原因时数…

windows server 2003下安装iis6+php

参照http://www.myhack58.com/Article/sort099/sort0100/2012/35579.htm 这篇文章&#xff0c;即可&#xff01; 前 面我写了《windows安装PHP5.4Apache2.4Mysql5.5》的安装教程&#xff0c;本地实现是很简单的&#xff0c;但是有人还是喜欢用IIS来配置 PHP环境&#xff0c;部分…

将 JAR 转为 EXE – JSMOOTH 的使用教程(第二期)(转载)

http://www.iteknical.com/convert-jar-to-exe-phase-ii-jsmooth-use-tutorial/转载于:https://www.cnblogs.com/leinuo2016/p/4932790.html

“”要求左值

错误 C2102 “&”要求左值 wrong code typedef struct CodeData {void *ptr_;CodeData(void*ptr) : ptr_(ptr){} } CodeData;typedef struct Data {int data_;data(int data) : data_(data){} } Data;// 这里出错&#xff0c;因为&后面是临时变量&#xff0c;不能取地…

winform自定义文件程序-- 不允许所请求的注册表访问权(ZSSQL)

常见问题1&#xff1a; 不允许所请求的注册表访问权 win7、win8 双击程序文件ZSSQL时候会出现 不允许所请求的注册表访问权 的弹窗异常 解决方法&#xff1a;ZSSQL.exe 右键 属性--兼容性--以管理员身份运行此程序 转载于:https://www.cnblogs.com/DemoLee/p/4173324.html

UITabBarController使用总结

刚看了几天教程就开始跟着开发了&#xff0c;以前也没学过C&#xff0c;太痛苦了~只能看看大神的博客&#xff0c;自己再总结学习一下了。 1.首先新建一个TabBarViewController继承于UITabBarController。然后什么都不用写&#xff0c;相当于装各个tab页的容器。 2.给每个视图都…

Auto-Configuration Error: Cannot find gcc or CC

bazel 编译的时候出错 首先 echo $CC 检查&#xff0c;若输出无值&#xff0c;则 export CCcc

Effective Modern C++英文版及中文翻译

https://pan.baidu.com/s/1uqEBGHn3dcVON18oRK5LNQ 提取码&#xff1a;gqqv 中文版不用看了&#xff0c;译者估计自己都不怎么用c11\14&#xff0c;翻译的巨垃圾。

第一个 mac 程序 Create-JSON-Model

第一个 mac 程序 Create-JSON-Model 效果图 数据 {"ID":null,"name":"Doe","first-name":"John","age":25,"hobbies":["reading","cinema",{"sports":["volley-bal…

php中utf8 与utf-8

php中utf8 与utf-8 原文:php中utf8 与utf-8相信很多程序员刚开始也会有这样的疑惑&#xff0c;如题&#xff0c;我也是。 其实&#xff0c;他们可以这样来区分。 一、在php和html中设置编码&#xff0c;请尽量统一写成“UTF-8”,这才是标准写法&#xff0c;而utf-8只是在…

编译vtk

https://vtk.org/Wiki/VTK/Configure_and_Build#On_Windows