联结

联结是一种机制,用来在一条 SELECT 语句中关联表。使用特殊的语句,可以联结多个表,同时只返回一组输出

在存储数据时,一般会将数据存储在多个表中,这样更利于处理。但一个 SELECT 语句并没有办法从多张表中检索数据。而使用联结可以解决该问题。

因为联结涉及到多个表,所以相同的列名必须使用完全限定列名。完全限定列名指的是:用一个点号分隔表名与列名。


表别名

联结一般会涉及多张表,对不同的表取不同的别名,不但清晰方便,而且是自联结必须的。

可以通过关键字 AS 为表指定不同的别名。在使用条件时,可以直接使用表别名代替原表名。


WHERE 联结

使用 WHERE 创建联结非常简单,只需要指定要查询的表以及表之间的关系条件即可。

SELECT BillingAddress,invoices.[CustomerId],customers.[FirstName],customers.[SupportRepId],employees.[Email] -- 指定从三个表中查询的数据
       FROM invoices,customers,employees -- 指定要查询的三个表
        WHERE invoices.[CustomerId]=customers.[CustomerId] AND customers.[SupportRepId]=employees.[EmployeeId]; -- 为三个表建立联结条件

上述语句会从三个表中查询需要的数据。

通过 WHERE 语句,将三个表中的数据进行关联。

对于上面语句可以这么理解得到的结果:首先生成迪卡尔积,并且列名都是完全限定列名(表名.列名),然后将不满足 WHERE 条件的行剔除,剩余的就是上述条件返回的。

联结多个表时,与上述语法一样。

INNER JOIN

上面通过 WHERE 语句写的联结就是内联结,但 WHERE 是内联结的简写形式。对于内联结,也可通过 INNER JOIN 与 ON。

SELECT BillingAddress,invoices.[CustomerId],customers.[FirstName],customers.[SupportRepId],employees.[Email] -- 指定从三个表中查询的数据
       FROM customers INNER JOIN invoices INNER JOIN employees -- 指定要查询的三个表
        ON invoices.[CustomerId]=customers.[CustomerId] AND customers.[SupportRepId]=employees.[EmployeeId] LIMIT 1 OFFSET 0; -- 为三个表建立联结条件

与 WHERE 有以下几点区别:

  1. FROM 语句后,各表之间通过 INNER JOIN 连接。

  2. 将 WHERE 关键字替换成 ON,但具体的写法不变。


自联结

自己联结自己就是自联结

本例中所用的表的创建语句如下:

CREATE TABLE IF NOT EXISTS "em" (
  "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
  "name" text,
  "schoolId" integer
);

查询语句如下:

SELECT m.name,m.schoolId FROM em AS e,em AS m 
    WHERE e.name="lisi" AND e.schoolId = m.schoolId;  

本 sql 会查出所有与 lisi 的 schoolId 相同的行。

  1. 自联结需要指定表别名

  2. SELECT 语句中一定要分清楚是哪个表中的哪列。如果将上面的 m.name 写成 e.name,那么得到的所有 name 都将是 lisi。

  3. 可以理解为首先生成笛卡尔积,列名是全列名 ( 通过表别名进行区分 ),然后对笛卡尔积表进行过滤。因此,如果 SELECT 语句中指定错了别名,得到的结果将完全不同。


自然联结

在联结中,至少有一列不止出现在一个表中 ( 使用该列对表进行关系 ) ,当返回所有数据时,相同的列会出现多次。

自然联结会排除多次出现的列,相同的列只会出现一次

  1. 自然联结并没有什么特殊的语法,需要程序自己指定 —— 人为的将重复的列返回一次

  2. 一般来说第一个表返回所有,其余的表就明确列出要返回的列。

SELECT a.*,ar.[Name] FROM albums AS a,artists AS ar 
      WHERE a.[ArtistId]=ar.[ArtistId] LIMIT 1 OFFSET 0;

而 a 与 ar 表中相同的列是 ArtistId。

a.* 是返回 a 表中所有的列,而 ar.[Name] 表示返回 ar 表中的 Name 列。想检索别的列,则依次指定即可,只保证指定的列没有重复的,就是自然联结。


外联结

与内联结相对:内联结将所有的不满足条件行剔除,而外联结会保留其中的一部分

  1. 外联结分为左外联结与右外联结。

  2. 所有的外联结必须与 ON 结合使用

  3. 左外联结,如果 A 左外联结 B,则将 A 的所有记录都保留,而 B 中只保留满足联结条件的记录。关键字为 LEFT OUTER JOIN

  4. 右外联结:与左外联结相反,A 右外联结 B,则将 B 中的所有记录保留,而 A 中只保留满足联结条件的。关键字为 RIGHT OUTER JOIN。sqlite不支持右外联结。

  5. 假如 A 左外联结 B,A 中所有行都会被检索出来。它对应的 B 中的行的数据全部为 null。

  6. 外联结分为左外联结与右外联结,但调整表的顺序,可以将左外联结转换为右外联结,反之也行

SELECT Customers.[cust_id],Orders.[order_num] 
    FROM Customers LEFT OUTER JOIN Orders 
    ON Customers.[cust_id] = Orders.[cust_id] 
左外联结

从结果中可以看了,对于 cust_id 为 2 的行来说,虽然在 Orders 表中没有对应的记录,但它一样被检索出来,只不过对应的 Orders 中的列值都为 null。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • 数据库入门 数据库: 保存有组织的数据的容器(通常是一个文件或一组文件).数据库软件应该称为 DBMS(DataB...
    Mjericho阅读 498评论 0 0
  • 1 使用子查询 查询(query):任何SQL语句都是查询,但一般指SELECT语句。 SQL还允许创建子查询(s...
    hufengreborn阅读 441评论 0 0
  • 学习mysql的几天,将笔记整理一下 SQL(Structured Query Language): 结构化查询语...
    年少懵懂丶流年梦阅读 951评论 0 2
  • 开学已经3周,每周五都莫名的不想讲课。 课堂上我问学生一个问题"你们这一周在学校开心吗?"学生齐声回答道"很...
    凝芸冰澜99阅读 505评论 0 1
  • 《山海经》第二卷中记载:“又八十里,曰符禺之山,其阳多铜,其阴多铁......其草多条,其状如葵,而赤华黄石,如婴...
    裸山阅读 533评论 6 4