关系数据库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的学生

相关实践学习
MySQL数据库快速部署实践
本场景主要介绍如何在一台配置了CentOS 7.7版本的ECS实例(云服务器)上安装mysql,执行mysql的常用操作,学习基本的SQL语句。
目录
相关文章
|
5月前
|
SQL 机器学习/深度学习 人工智能
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
|
4月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
893 152
|
4月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
467 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
3月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
234 6
|
4月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
4月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
367 8
|
5月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
633 8
|
7月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
562 62
|
5月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
315 5
|
5月前
|
SQL 容灾 安全
云时代SQL Server的终极答案:阿里云 RDS SQL Server如何用异地容灾重构系统可靠性
在数字化转型的浪潮中,数据库的高可用性已成为系统稳定性的生命线。作为经历过多次生产事故的资深开发者,肯定深知传统自建SQL Server架构的脆弱性——直到遇见阿里云 RDS SQL Server,其革命性的异地容灾架构彻底改写了游戏规则。