`
wangchaovsjava
  • 浏览: 68497 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

SQL中连接查询

SQL 
阅读更多
在表之间连接
到目前为止,我们的查询一次只访问了一个表。查询可以一次访问多个表,或者用某种方式访问一个表,而同时处理该表的多个行。一个同时访问同一个或者不同表的多个行的查询叫连接查询。举例来说,比如你想列出所有天气记录以及这些记录相关的城市。要实现这个目标,我们需要拿 weather 表每行的 city 字段和 cities 表所有行的 name 字段进行比较,并选取那些这些数值相匹配的行。

【注意】这里只是一个概念上的模型。连接通常以比实际比较每个可能的配对行更高效的方式执行,但这些是用户看不到的。

这个任务可以用下面的查询来实现:

SELECT *
    FROM weather, cities
    WHERE city = name;     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(2 rows)观察结果集的两个方面:

没有城市 Hayward 的结果行。这是因为在 cities 表里面没有与 Hayward 匹配的行,所以连接忽略了 weather 表里的不匹配行。我们稍后将看到如何修补这个问题。

有两个字段包含城市名。这是正确的,因为 weather 和 cities 表的字段是接在一起的。不过,实际上我们不想要这些,因此你将可能希望明确列出输出字段而不是使用 * :

SELECT city, temp_lo, temp_hi, prcp, date, location
    FROM weather, cities
    WHERE city = name;【练习】看看省略 WHERE 子句的含义是什么。

因为这些字段的名字都不一样,所以分析器自动找出它们属于哪个表,但是如果两个表中有重复的字段名,你就必须使用字段全称限定你想要的字段:

SELECT weather.city, weather.temp_lo, weather.temp_hi,
       weather.prcp, weather.date, cities.location
    FROM weather, cities
    WHERE cities.name = weather.city;一般认为在连接查询里使用字段全称是很好的风格,这样,即使在将来向其中一个表里添加了同名字段也不会引起混淆。

到目前为止,这种类型的连接查询也可以用下面这样的形式写出来:

SELECT *
    FROM weather INNER JOIN cities ON (weather.city = cities.name);这个语法并非像上面那个那么常用,我们在这里写出来是为了让你更容易了解后面的主题。

现在我们将看看如何能把 Hayward 记录找回来。我们想让查询干的事是扫描 weather 表,并且对每一行都找出匹配的 cities 表里面的行。如果没有找到匹配的行,那么需要一些"空值"代替 cities 表的字段。这种类型的查询叫 外连接(我们在此之前看到的连接都是内连接)。这样的命令看起来像这样:

SELECT *
    FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);

     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
Hayward       |      37 |      54 |      | 1994-11-29 |               |
San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(3 rows)这个查询是一个左外连接,因为连接操作符(LEFT OUTER JOIN)左边的表中的行在输出中至少出现一次,而右边的表中的行只输出那些与左边的表有匹配的行。如果输出的左表中的行没有右表中的行与其对应,那么右表中的字段将填充为 NULL 。

【练习】还有右连接和全连接。试着找出来它们能干什么。

我们也可以把一个表和自己连接起来。这叫自连接。比如,假设我们想找出那些在其它天气记录的温度范围之外的天气记录。这样我们就需要拿 weather 表里每行的 temp_lo 和 temp_hi 字段与 weather 表里其它行的 temp_lo 和 temp_hi 字段进行比较。我们可以用下面的查询实现这个目标:


SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
    W2.city, W2.temp_lo AS low, W2.temp_hi AS high
    FROM weather W1, weather W2
    WHERE W1.temp_lo < W2.temp_lo
    AND W1.temp_hi > W2.temp_hi;

     city      | low | high |     city      | low | high
---------------+-----+------+---------------+-----+------
San Francisco |  43 |   57 | San Francisco |  46 |   50
Hayward       |  37 |   54 | San Francisco |  46 |   50
(2 rows)在这里我们把 weather 表重新标记为 W1 和 W2 以区分连接的左边和右边。你还可以用这样的别名在其它查询里节约一些敲键,比如:

SELECT *
    FROM weather w, cities c
    WHERE w.city = c.name;以后会经常碰到这样的缩写。

分享到:
评论

相关推荐

    SqlServer连接工具

    综上所述,SQL Server连接工具是SQL Server生态系统中不可或缺的一部分,它们为数据库管理员和开发者提供了强大的支持,使得SQL Server的管理和开发工作更加高效便捷。无论是在本地环境还是云端,选择合适的工具能够...

    SQL子查询、内连接和外连接查询

    在SQL中,子查询、内连接和外连接是进行复杂数据检索的关键工具。这些概念的理解和熟练应用对于数据库管理与数据分析至关重要。 **子查询** 是一个嵌套在其他SQL语句中的查询,它首先执行并返回结果,这个结果再...

    SQL多表连接查询优化的相关研究

    一、SQL连接查询类型: 1. 内连接(INNER JOIN):返回两个表中匹配的行。 2. 左连接(LEFT JOIN):返回左表的所有行,即使右表没有匹配的行,结果用NULL填充。 3. 右连接(RIGHT JOIN):与左连接相反,返回右表的...

    数据库作业7:SQL练习4 – SELECT(连接查询、嵌套查询)

    数据查询2—连接查询:同时涉及两个以上的表的查询 连接条件:用来连接两个表的...从两个表中查询,需要先用笛卡尔积将两个表连接起来,连接之后再找出符合条件相等的。 【思考】:如何用SQL表达笛卡尔积×? SELECT Stu

    仿sqlserver连接查询视图、存储过程等功能

    标题中的“仿sqlserver连接查询视图、存储过程等功能”是指开发的一款软件或应用程序,它模仿了Microsoft SQL Server的一些核心特性,以便用户可以进行数据库管理、查询和操作。这款工具可能提供了与SQL Server类似...

    SQL连接查询语句实例

    本文将深入探讨几种主要的SQL连接查询类型,包括内连接(INNER JOIN)、外连接(FULL JOIN、LEFT JOIN、RIGHT JOIN)以及交叉连接(CROSS JOIN),并提供实例来帮助初学者理解。 首先,我们来看内连接(INNER JOIN...

    SqlDbx连接oracle

    4. 使用配置好的连接进行SQL查询、数据库对象浏览或其他数据库操作。 关于NETWORK文件,通常在Oracle环境中指的是网络配置文件,如tnsnames.ora。这个文件定义了Oracle数据库的服务名,包含服务器的主机名、端口和...

    JSP与SQL Server2000的连接查询

    本篇将详细阐述如何使用JSP与SQL Server 2000进行连接查询,展示数据。 首先,要实现JSP与SQL Server 2000的连接,我们需要以下组件: 1. **JDBC驱动**:Java Database Connectivity (JDBC) 是Java编程语言中用来...

    如何查看sql server数据库连接数

    2. 在下面的项目中选择用户连接(User Connection),这样就可以实时查询到 SQL Server 数据库连接数。 方法二:通过系统表查询 可以通过系统表来查询 SQL Server 数据库连接数。具体步骤如下: 1. 使用以下查询...

    SQL连接器 SQL连接器

    在给定的文件名称列表中,"SQLTools.exe"可能是一个包含SQL连接功能的实用工具或图形用户界面(GUI),它可能提供了更简便的方式来与数据库交互,如执行SQL查询、管理数据库对象、导入导出数据等。具体使用方法,...

    SQL SERVER连接oracle数据库几种方法

    OPENQUERY 是 SQL Server 中的一个系统存储过程,用于执行远程查询。我们可以使用 OPENQUERY 来连接 Oracle 数据库。下面是一个示例代码: ```sql SELECT * FROM OPENQUERY(GE160, 'SELECT * FROM DAIMIN.JOBS') `...

    java 连接sqlserver数据库查询,并分页显示

    在Java编程中,连接SQL Server数据库并执行查询是常见的任务,尤其当涉及到大量数据时,分页显示就显得尤为重要。本篇文章将详细讲解如何使用Java连接SQL Server数据库,执行查询语句以及实现分页显示。 首先,我们...

    如何连接SQL数据库

    总之,连接SQL数据库或Access数据库是开发过程中的基础工作,理解其原理和操作方法对IT初学者至关重要。无论是SQL Server的JDBC连接,还是Access的VBA或ADODB连接,都需要根据项目需求和环境选择合适的方法。通过...

    oracle sqldeveloper连接mysql、SQLServer第三方dll

    解决oracle sqldeveloper无法连接mysql、SQLServer问题,sqlDeveloper是ORACLE数据库开发工具,自带的是无法连接MS SQL Server以及mysql的,想连接的话需要第三方工具。 使用方法: 解压出来后将2个jar放入jlib...

    VB实现SQL连接查询

    综上所述,"VB实现SQL连接查询"涉及的主要知识点包括VB的数据库操作基础、ADODB组件的使用、SQL语句的编写以及数据库连接的建立和关闭。通过这个小程序,你可以学习如何在VB环境中与SQL Server进行有效交互,实现...

    sqlserver连接oracle

    在使用连接服务器时,需要在 SQL Server 的查询分析器中使用具体的 SQL 语句来实现表记录的查看。更详细的使用方法这里不再赘述。 通过配置 Windows 的 ODBC 数据源和 SQL Server 2000 中的连接服务器,可以实现 ...

    sql连接查询

    sql查询基础,连接查询介绍及实例,简洁形象的描述了连接查询的原理。

    test_lesson07 SQL99语法连接查询.pdf

    在SQL99语法中,连接查询是数据库操作中不可或缺的一部分,它允许我们从多个表中检索数据,并将这些数据关联起来。在这个测试中,我们将探讨三个具体的查询需求,每个需求都涉及到了不同的连接类型和处理缺失值的...

    sql server客户端连接工具

    SQL Server客户端连接工具是数据库管理员和开发人员用来与Microsoft SQL Server进行交互的重要工具。它提供了图形用户界面(GUI)和命令行选项,使得用户能够轻松地执行查询、管理数据库对象以及进行其他数据库维护...

    SQL server 连接测试工具

    在SQL Server的使用过程中,确保能够正确、安全地连接到数据库至关重要。"SQL server 连接测试工具"就是为了满足这一需求而设计的,它帮助用户验证与SQL Server实例的连接,并在连接成功后将相关信息写入配置文件,...

Global site tag (gtag.js) - Google Analytics