关系数据库SQL数据查询(二)

简介: 关系数据库SQL数据查询

二、连接查询

  1. 连接查询:同时涉及两个以上的表的查询
  2. 连接条件或连接谓词:用来连接两个表的条件
    一般格式:

[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>

[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>

  1. 连接字段:连接谓词中的列名称

连接条件中的各连接字段类型必须是可比的,但名字不必相同

1.等值与非等值连接查询

等值连接:连接运算符为=

[例 29]  查询每个学生及其选修课程的情况
               SELECT  Student.*, SC.*
               FROM     Student, SC
               WHERE  Student.Sno = SC.Sno;

结果为

1)嵌套循环法(NESTED-LOOP)

  • 首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
  • 表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
  • 重复上述操作,直到表1中的全部元组都处理完毕

(2)排序合并法(SORT-MERGE)

  • 常用于=连接
  • 首先按连接属性对表1和表2排序
  • 对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续
  • 找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2
    中大于表1连接字段值的元组时,对表2的查询不再继续
  • 重复上述操作,直到表1或表2中的全部元组都处理完毕为止

(3)索引连接(INDEX-JOIN)

  • 对表2按连接字段建立索引
  • 对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组

自然连接

[例 30]  对[例 3.49]用自然连接完成。
   SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
   FROM     Student,SC
   WHERE  Student.Sno = SC.Sno;

2.自身连接

  • 自身连接:一个表与其自己进行连接
  • 需要给表起别名以示区别
  • 由于所有属性名都是同名属性,因此必须使用别名前缀
[例 32]查询每一门课的间接先修课(即先修课的先修课)
     SELECT  FIRST.Cno, SECOND.Cpno
      FROM  Course  FIRST, Course  SECOND
      WHERE FIRST.Cpno = SECOND.Cno;

3.外连接

外连接与普通连接的区别

  • 普通连接操作只输出满足连接条件的元组
  • 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
  • 左外连接

列出左边关系中所有的元组

  • 右外连接

列出右边关系中所有的元组

[例 33] 改写[例 29]
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUT JOIN SC ON
(Student.Sno=SC.Sno);

执行结果

三、嵌套查询

嵌套查询概述

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
SELECT Sname                             /*外层查询/父查询*/
  FROM Student
  WHERE Sno IN
                     ( SELECT Sno        /*内层查询/子查询*/
                       FROM SC
                       WHERE Cno= ' 2 ');
  • 上层的查询块称为外层查询或父查询
  • 下层查询块称为内层查询或子查询
  • SQL语言允许多层嵌套查询
  • 即一个子查询中还可以嵌套其他子查询
  • 子查询的限制
  • 不能使用ORDER BY子句

不相关子查询:

子查询的查询条件不依赖于父查询

  • 由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。

相关子查询:子查询的查询条件依赖于父查询

  • 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
  • 然后再取外层表的下一个元组
  • 重复这一过程,直至外层表全部检查完为止

1.带有IN谓词的子查询

[例 35]  查询与“刘晨”在同一个系学习的学生。
         此查询要求可以分步来完成
    ① 确定“刘晨”所在系名             
         SELECT  Sdept  
         FROM     Student                            
         WHERE  Sname= ' 刘晨 ';
        结果为: CS
        ② 查找所有在CS系学习的学生。    
    SELECT   Sno, Sname, Sdept     
    FROM      Student                 
    WHERE   Sdept= ' CS '; 

结果为:

2.带有比较运算符的子查询

当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。

在[例 36]中,由于一个学生只可能在一个系学习,则可以用 = 代替IN :
       SELECT Sno,Sname,Sdept
       FROM    Student
       WHERE Sdept   =
                     (SELECT Sdept
                      FROM    Student
                      WHERE Sname= '刘晨');
      [例 37 ]找出每个学生超过他选修课程平均成绩的课程号。
         SELECT Sno, Cno
          FROM    SC  x
          WHERE Grade >=(SELECT AVG(Grade) 
                                  FROM  SC y
                                         WHERE y.Sno=x.Sno);

3.带有ANY(SOME)或ALL谓词的子查询

使用ANY或ALL谓词时必须同时使用比较运算

语义为:

  • ANY 大于子查询结果中的某个值
  • ALL 大于子查询结果中的所有值
  • < ANY 小于子查询结果中的某个值
  • < ALL 小于子查询结果中的所有值
  • = ANY 大于等于子查询结果中的某个值
  • = ALL 大于等于子查询结果中的所有值
  • <= ANY 小于等于子查询结果中的某个值
  • <= ALL 小于等于子查询结果中的所有值
  • = ANY 等于子查询结果中的某个值
  • =ALL 等于子查询结果中的所有值(通常没有实际意义)
  • !=(或<>)ANY 不等于子查询结果中的某个值
  • !=(或<>)ALL 不等于子查询结果中的任何一个值
[例 38]  查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
     SELECT Sname,Sage
     FROM    Student
     WHERE Sage < ANY (SELECT  Sage
                                          FROM    Student
                                          WHERE Sdept= ' CS ')
      AND Sdept <> ‘CS ' ;           /*父查询块中的条件 */

结果:

执行过程:

(1)首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19)

(2)处理父查询,找所有不是CS系且年龄小于 20 或 19的学生

相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
目录
相关文章
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
151 3
|
6天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
6天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
7天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
|
18天前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
16 2
|
23天前
|
SQL JSON Java
没有数据库也能用 SQL
SPL(Structured Process Language)是一款开源软件,允许用户直接对CSV、XLS等文件进行SQL查询,无需将数据导入数据库。它提供了标准的JDBC驱动,支持复杂的SQL操作,如JOIN、子查询和WITH语句,还能处理非标准格式的文件和JSON数据。SPL不仅简化了数据查询,还提供了强大的计算能力和友好的IDE,适用于多种数据源的混合计算。
|
7天前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
20 0
|
29天前
|
SQL 数据管理 数据库
SQL语句实例教程:掌握数据查询、更新与管理的关键技巧
SQL(Structured Query Language,结构化查询语言)是数据库管理和操作的核心工具
|
1月前
|
SQL 监控 数据库
慢SQL对数据库写入性能的影响及优化技巧
在数据库管理系统中,慢SQL(即执行缓慢的SQL语句)不仅会影响查询性能,还可能对数据库的写入性能产生显著的不利影响
|
1月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具