1. SQL读书笔记——SQL中的连接(1)

《SQL学习指南》中的第5章

1.连接:

在某种机制下,需要将多个表中的数据进行整合到一起,即同一个查询的结果集中包含来自两个或者两个以上的表,这种机制被称为连接(join).

1.1 ANSI连接语法

本文采用的都是符合SQL92版本的ANSI SQL标准,所有的主流数据库都采用了SQL92的连接语法。由于这些数据库都出现SQL92标准发布之前,同时存在一些旧的连接语法,如下所示:

例子1:

SELECT e.fname, e.lname, d.`name`

FROM employee e , department d

WHERE e.dept_id = d.dept_id;

推荐使用SQL92标准 的连接方式,不推荐使用上面的连接方式,主要原因是:

1)连接条件和过滤条件被分隔到两个子句中(ON子句和WHERE子句),使得查询语句更利于理解;

2)每两个表的连接条件都在ON子句中列出,容易找出连接条件;

3)SQL92标准可以在各种数据库中通用,而旧的语法在不同的数据中的表现可能略有不同;

1.2 笛卡尔积

例子 1: 直接使用from连接employee 和 department表

方式一:

SELECT e.fname, e.lname, d.`name`

FROM employee e JOIN department

一个有18个雇员和3个部门,会产生54行数据,由于查询没有明确的指定两个表是如何连接的造成的,这时会默认两张表置换。这样的连接被称为交叉连接(cross join).

 1.3 内连接

 1)两表连接

例子1: 查询每个雇员所属的部门信息

SELECT e.fname, e.lname, d.`name`

FROM employee e JOIN department d

ON e.dept_id = d.dept_id

结果如图所示

此时通过描述上面两个表是通过何种方式关联的,是通过dept_id来关联两个表的。

如果在一个表中的dept_id列中存在某个值,但该值在另一张表的dept_id列中不存在,那么此时相关的行的连接会失败,在结果集中的相关行的连接会失败,在结果集中将会排除包含该值的行,这种类型的连接被称为内连接

    若想要包含某个表中的所有行,并不需要考虑该表的每一行都与另一张表匹配,那么可以使用外连接

 

    2)多表内连接

-- 例子2.查询Woburn支行中所有熟练柜员(在2007年以前入职的柜员)开设的账户

SELECT a.account_id, a.product_cd,a.open_date

FROM account a

INNER JOIN employee e

ON a.open_emp_id = e.emp_id

INNER JOIN branch b

ON e.assigned_branch_id = b.branch_id

WHERE e.start_date < ‘2007-01-01‘

AND (e.title = ‘Teller‘ OR e.title = ‘Head Teller‘)

AND b.`name` = ‘Woburn Branch‘;

 

结果如图所示:

     现在FROM子句中包含3个表,两种连接类型和两个ON子句,看上去连接的顺序是account表,employee表,然后branch表,那么如果交换employ表和account表的连接顺序会出现什么情况呢?

SELECT a.account_id, a.product_cd,a.open_date

FROM employee e

INNER JOIN account a

ON a.open_emp_id = e.emp_id

INNER JOIN branch b

ON e.assigned_branch_id = b.branch_id

WHERE e.start_date < ‘2007-01-01‘

AND (e.title = ‘Teller‘ OR e.title = ‘Head Teller‘)

AND b.`name` = ‘Woburn Branch‘;

结果如图所示---无改变

那么在更换employee和branch的顺序呢?

SELECT a.account_id, a.product_cd,a.open_date

FROM branch b

INNER JOIN account a

ON a.open_branch_id = b.branch_id

INNER JOIN employee e

ON a.open_emp_id = e.emp_id

WHERE e.start_date < ‘2007-01-01‘

AND (e.title = ‘Teller‘ OR e.title = ‘Head Teller‘)

AND b.`name` = ‘Woburn Branch‘;

结果如图所示---无改变

那么更换ON语句的位置呢

SELECT a.account_id, a.product_cd,a.open_date

FROM branch b

INNER JOIN account a

INNER JOIN employee e

ON a.open_branch_id = b.branch_id

ON a.open_emp_id = e.emp_id

WHERE e.start_date < ‘2007-01-01‘

AND (e.title = ‘Teller‘ OR e.title = ‘Head Teller‘)

AND b.`name` = ‘Woburn Branch‘;

结果如图所示---报错!错误原因:ON语句连接关系要紧跟 JOIN语句

例子二多种表达方式的原因:SQL是一种非过程化的语言,也就是说只需要描述要获取的数据对象,

而执行过程是数据库服务器负责(我只要结果集*_*)(但是左连接,右连接的问题,还不是很确定,稍后还要进行测试一下)

3)子查询作为结果集的内连接

例子二中的另一个版本:使用“连接 ”连接子查询,也就是将子查询的结果集作为查询表进行连接

1)

SELECT e.emp_id

FROM employee e

WHERE e.start_date < ‘2007-01-01‘

AND (e.title = ‘Teller‘ OR e.title = ‘Head Teller‘);

2)  SELECT b.branch_id

FROM  branch b

WHERE b.`name` = ‘Woburn Branch‘;

3)  SELECT a.account_id, a.product_cd,a.open_date

FROM account a

INNER JOIN (SELECT e.emp_id

FROM employee e

WHERE e.start_date < ‘2007-01-01‘

AND (e.title = ‘Teller‘ OR e.title = ‘Head Teller‘) ) em

ON a.open_emp_id = em.emp_id

INNER JOIN (SELECT b.branch_id

FROM  branch b

WHERE b.`name` = ‘Woburn Branch‘) br

ON a.open_branch_id = br.branch_id;

4)自连接

例子3.列出雇员的姓名同时列出主管的姓名:

SELECT emp.emp_id AS emp_id,CONCAT(emp.fname,‘ ‘,emp.lname) AS em,

e.emp_id AS super_em_id,CONCAT(e.fname,‘ ‘,e.lname) AS super_em

FROM employee e INNER JOIN employee emp

ON e.emp_id = emp.superior_emp_id;

结果如图所示:

上面查询实现了对表自身进行连接,自连接,employee表中包含了指向自身的外键(superior_emp_id)

同时,employee表一共18行,但此查询返回了17行,这是由于银行的总经理MIchael Smith并没

自己的主管,它的superior_emp_id列为null,因此在改行上的内连接失败,在结果集中并不会显示。

5)不等连接

例子4.假如执行经理决定举办一次面向银行柜员的象棋比赛,现在要创建所有对弈者的列表

SELECT CONCAT(e.fname,‘ ‘,e.lname) as TEAM_A,

‘VS‘, CONCAT(emp.fname,‘ ‘,emp.lname) as TEAM_B

FROM employee e INNER JOIN employee emp

ON e.emp_id < emp.emp_id

WHERE e.title = ‘Teller‘ AND emp.title = ‘Teller‘;

结果如图所示:

时间: 2024-11-13 15:15:48

1. SQL读书笔记——SQL中的连接(1)的相关文章

《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中收缩数据库不好用的原因 数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATE

《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server如何设置自动增长和自动收缩项 SQL Server允许用户设置数据库初始值和最大值,可以通过自动增长或者自动收缩进行配置.通过这些配置,我们可以防止数据库空间问题而导致的应用程序修改失败或者SQL Server磁盘空间耗尽的事情发生.一般来讲,如果数据库不是很忙,默认的设置为自动增长,这种方式能够满足大部分的需求.但是在大量并发的情况下,申请数据文件和日志文件增长本身是一件非常消耗系统资源和影响性能的工作.所以如果

《SQL Server企业级平台管理实践》读书笔记——SQL Server数据库文件分配方式

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server数据库文件分配方式 1.文件分配方式以及文件空间检查方法 最常用的检查数据文件和表大小的命令就是:sp_spaceused 此命令有三个缺陷:1.无法直观的看出每个数据文件和日志文件的使用情况.2.这个存储过程依赖SQL Server存储在一些系统视图里的空间使用统计信息计算出的结果,如果没有更新空间统计信息,比如刚刚发生大数据插入,sp_spaceused的结果就不准确.3.这个命令主要是针对普通用户的数据库,对

3D数学读书笔记——3D中的方位与角位移

本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595 方位和角位移的基本概念 什么是方位.角位移? 直观的说,我们知道,物体的"方位"主要描写叙述物体的朝向,然而,"方向"和"方位"并不全然一样.向量有"方向"但没有"方位",差别在于,当一个向量指向特定方向时,能够让向量自转

《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结

Tempdb系统数据库是一个全局资源.可供连接到SQL Server实例的全部用户使用. 存储的内容项: 1.用户对象 用户对象由用户显示创建.这些对象能够位于用户会话的作用域中.也能够位于创建对象所用例程的作用域中. 例程能够是存储过程.触发器或用户自己定义函数. 用户对象能够是一下项内容之中的一个: 用户定义的表和索引 系统表和索引 全局暂时表和索引 table变量 表值函数中返回的表 2.内部对象 内部对象是依据须要由SQL Server数据库引擎创建的,用户处理SQL Server语句.

《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理

1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以后,引入了分区表的概念(Table Partition),在存储组织上,现有的分区基本上替代了原来表格的概念,原先表的概念成为了一个逻辑概念.一个分区就是一个B树或者一个堆.而一张表格则是一个到多个分区的组合. 1.1用B树存储于聚集索引的表数据页 如果一个表格上有聚集索引(Clustered In

SQL条件逻辑——SQL读书笔记

<SQL学习指南>中的第11章 1.1 概念:      条件逻辑:条件逻辑是程序执行时从多个路径中选取其一的能力 1)简单例子演示: 例子1:查询客户信息时根据客户类型从individual表中检索fname/lname列或者从business表中 获取name列 (左外连接) SELECT c.cust_id,c.fed_id,c.cust_type_cd, CONCAT(i.fname,' ',i.lname) AS indv_name, b.`name` AS business_nam

C#数据库开发读书笔记1---数据库连接及DataReader的使用

1.ADO.NET结构: 两个核心组件:DataSet..NET数据提供程序(Connection.Command.DataReader和DataAdapter四个对象). DataSet是独立于任何数据源的数据访问,因此可用于多种不同的数据源,用于XML数据或独立于管理应用程序本地的数据:DataSet包含一个或多个DataTable对象的集合:DataSet和XML之间是相互兼容的. 2..NET数据提供程序: 2.1.Connection:提供与数据源的连接 2.2.Command:使用户

《Android源码设计模式解析》读书笔记——Android中你应该知道的设计模式

断断续续的,<Android源码设计模式解析>也看了一遍,书中提到了很多的设计模式,但是有部分在开发中见到的几率很小,所以掌握不了也没有太大影响. 我觉得这本书的最大价值有两点,一个是从设计模式的角度去理解Android源码,结合着日常开发中的常用类,对设计模式的理解会更加的深刻:另外一个好处就是了解常用模式,再看其他人写的代码的时候,更容易理解代码思路.下面是我的读书笔记和一些思考,设计模式只整理我认为重要的部分. 建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常