SQL 数据查询

news2024/9/24 3:27:56

文章目录

        • 3.4.1 单表查询
          • 定义
          • 特点
          • 单表无条件查询
          • 单表带条件查询
          • 对查询结果进行排序
          • 限制查询结果数量
        • 3.4.2 分组查询
          • 定义
          • 特点:
          • 聚集函数
          • GROUP BY短语
          • HAVING子句
          • 分组查询小结
        • 3.4.3 连接查询
          • 定义
          • 特点:
          • 等值连接与非等值连接查询
          • 自然连接(内连接)查询
          • 外连接查询
          • 自身连接查询
        • 3.4.4 嵌套查询
          • 定义
          • 特点:
          • 嵌套查询的分类
          • 嵌套查询的执行过程
          • 带比较运算符的子查询
          • 带IN(或NOT IN)谓词的子查询
          • 带ANY/ALL谓词的子查询
          • 带EXISTS(或NOT EXISTS)谓词的子查询
          • 用存在量词实现全称量词
          • 用存在量词实现蕴涵逻辑
        • 3.4.5 集合查询
          • 定义
          • 特点:
          • 并运算
          • 交运算
          • 差运算
        • 3.4.6 多表查询的等价形式
          • 定义
          • 多表查询的肯定形式
          • 多表查询的否定形式
      • 总结

3.4.1 单表查询
  1. 定义
    1. 单表查询是指从单个基本表中选择满足条件的字段和元组。
  2. 特点
    1. 无条件查询:从表中选择所有字段或部分字段,不加条件。
    2. 带条件查询:根据特定条件筛选满足条件的字段和元组。
    3. 查询结果排序:使用ORDER BY短语对查询结果进行排序。
    4. 限制查询结果数量:使用LIMIT短语限制查询结果的行数。
  3. 单表无条件查询
    • 查询所有字段:

      SELECT * FROM Department;
      

      image

    • 查询部分字段:

      SELECT dno, dname FROM Department;
      

      image

    • 查询没有重复行数据的字段:

      SELECT DISTINCT dno FROM Student;
      

      image

    • 查询含有表达式的字段:

      SELECT sname 姓名, YEAR(CURRENT_DATE()) - YEAR(birth) 年龄 FROM Student;
      

      image

  4. 单表带条件查询
    • 比较判断:

      SELECT sname, birth FROM Student WHERE dno = 'D1';
      SELECT sno, cno FROM SC WHERE score < 60;
      SELECT sno, sname FROM Student WHERE dno <> 'D2';
      
    • 确定范围:

      SELECT * FROM SC WHERE score BETWEEN 60 AND 90;
      SELECT * FROM SC WHERE score NOT BETWEEN 60 AND 90;
      
    • 确定集合:

      SELECT sno, sname, sex, birth, dno FROM Student WHERE dno IN ('D1', 'D2');
      SELECT sno, sname, sex, birth, dno FROM Student WHERE dno NOT IN ('D1', 'D2');
      
    • 空值查询:

      SELECT * FROM SC WHERE score IS NULL;
      SELECT * FROM SC WHERE score IS NOT NULL;
      
    • 多重条件查询:

      SELECT * FROM SC WHERE score >= 60 AND score <= 90;
      SELECT * FROM SC WHERE score < 60 OR score > 90;
      
    • 字符匹配:

      SELECT * FROM Course WHERE cname LIKE '数据库';
      SELECT * FROM Course WHERE cname LIKE '%数据库%';
      
  5. 对查询结果进行排序
    • 按单个字段排序:

      SELECT sno, score FROM SC WHERE cno = 'C1' ORDER BY score DESC;
      

      image

    • 按多个字段排序:

      SELECT sno, sname, sex, birth, dno FROM Student ORDER BY dno, birth DESC;
      
  6. 限制查询结果数量
    • 限制查询结果数量:

      SELECT sno, sname, dno FROM Student LIMIT 1, 3;
      SELECT * FROM SC ORDER BY score DESC LIMIT 5;
      

      image

    • image

3.4.2 分组查询
  1. 定义
    1. 分组查询是将基本表中满足条件的元组按指定字段的值分成若干组,每组返回一个结果。
  2. 特点:
    • 聚集函数:COUNT、SUM、AVG、MAX、MIN等,用于对每组数据进行汇总和统计。
    • GROUP BY短语:根据指定字段的值对查询结果中的元组进行分组。
    • HAVING子句:对分组后的查询结果再进一步选择满足条件的分组。
  3. 聚集函数
    • 定义:COUNT、SUM、AVG、MAX、MIN等,用于对每组数据进行汇总和统计。

    • 常用聚集函数:

      • | 聚集函数 | 功能 |
        | --------------------------- | ------------------------------------------ |
        | COUNT() | 统计元组的个数,包括值为NULL 的元组 |
        | COUNT([DISTINCTALL] 字段名) | 统计某一字段值的个数,忽略NULL 值 |
        | SUM([DISTINCTALL] 字段名) | 计算某一字段值的总和(此列必须是数值型) |
        | AVG([DISTINCTALL] 字段名) | 计算某一字段值的平均值(此列必须是数值型) |
        | MAX([DISTINCTALL] 字段名) | 返回某一字段值中的最大值 |
        | MIN([DISTINCTALL] 字段名) | 返回某一字段值中的最小值 |

      • 统计学生总人数:SELECT COUNT(*) 学生总人数 FROM Student;

        • image
      • 统计学生来自几个学院:SELECT COUNT(DISTINCT dno) 学院数 FROM Student;

        • image
      • 计算所有学生的平均成绩、最高分和最低分:SELECT ROUND(AVG(score), 2) 平均成绩, MAX(score) 最高分, MIN(score) 最低分 FROM SC;

        • image
      • 按学院分组查询每名学生的学号及其成绩的最高分和最低分:SELECT sno 学号, MAX(score) 最高分, MIN(score) 最低分 FROM SC GROUP BY sno;

        • image
  4. GROUP BY短语
    • 定义:根据指定字段的值对查询结果中的元组进行分组。

    • 按单字段分组:

      SELECT sno 学号, MAX(score) 最高分, MIN(score) 最低分 FROM SC GROUP BY sno;
      

      image

    • 按多字段分组:

      SELECT dno 学院编号, YEAR(CURRENT_DATE()) - YEAR(birth) 年龄, COUNT(*) 人数 FROM Student GROUP BY dno, YEAR(CURRENT_DATE()) - YEAR(birth) ORDER BY dno;
      

      image

  5. HAVING子句
    • 定义:对分组后的查询结果再进一步选择满足条件的分组。

    • 筛选分组:

      SELECT sno FROM SC GROUP BY sno HAVING COUNT(*) > 3;
      

      image

  6. 分组查询小结
    • 完整的分组查询语法:

      SELECT 分组字段, 聚集函数表达式 FROM 表名 [WHERE 查询条件] [GROUP BY 字段名1, 字段名2..] [HAVING 分组条件表达式] [ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC],..];
      
3.4.3 连接查询
  1. 定义
    1. 连接查询是指对两个或两个以上的基本表或视图进行的查询,包括等值连接查询、非等值连接查询、自然连接(内连接)查询、外连接查询和自身连接查询。
  2. 特点:
    • 等值连接与非等值连接:根据两个表中的字段值进行比较,确定当前的两条元组是否可以连接。
    • 自然连接(内连接):去掉重复列的等值连接。
    • 外连接:包括左外连接、右外连接和全外连接,确保某个表的所有元组都出现在结果中。
    • 自身连接:一个表与其自身进行连接。
  3. 等值连接与非等值连接查询
    • 等值连接查询:

      SELECT Student.sno, sname, sex, birth, dno, SC.cno, score FROM Student, SC WHERE Student.sno = SC.sno;
      
    • 非等值连接查询:

      SELECT sno, score, grade FROM SC, SG WHERE score BETWEEN minscore AND maxscore;
      
  4. 自然连接(内连接)查询
    • 显式内连接查询:

      SELECT sname, score FROM Student INNER JOIN SC ON Student.sno = SC.sno WHERE sex = '男';
      
    • 隐式内连接查询:

      SELECT sname, score FROM Student, SC WHERE Student.sno = SC.sno AND sex = '男';
      
  5. 外连接查询
    • 左外连接查询:

      SELECT dname, tname FROM Department LEFT JOIN Teacher ON Department.dno = Teacher.dno;
      
    • 右外连接查询:

      SELECT dname, tname FROM Department RIGHT JOIN Teacher ON Teacher.dno = Department.dno;
      
    • 全外连接查询:

      SELECT dname, tname FROM Department LEFT JOIN Teacher ON Department.dno = Teacher.dno UNION SELECT dname, tname FROM Department RIGHT JOIN Teacher ON Teacher.dno = Department.dno;
      
  6. 自身连接查询
    • 自身连接查询:

      SELECT First.cno, Second.cpno FROM Course First INNER JOIN Course Second ON First.cpno = Second.cno;
      
3.4.4 嵌套查询
  1. 定义
    1. 嵌套查询是将一个查询块嵌套在另一个查询块的WHERE子句或HAVING子句的条件中的查询。
  2. 特点:
    • 单行子查询和多行子查询:根据子查询返回的行数分类。
    • 相关子查询和不相关子查询:根据子查询的查询条件是否依赖于父查询分类。
    • 带比较运算符的子查询:父查询与子查询之间用比较运算符进行连接。
    • 带IN/NOT IN谓词的子查询:用谓词IN/NOT IN引出子查询。
    • 带ANY/ALL谓词的子查询:用谓词ANY/ALL引出子查询。
    • 带EXISTS/NOT EXISTS谓词的子查询:用谓词EXISTS/NOT EXISTS引出子查询。
  3. 嵌套查询的分类
    • 按子查询返回元组的行数:单行子查询、多行子查询
    • 按子查询的查询条件是否依赖于父查询:相关子查询、不相关子查询
    • 按引出子查询的谓词的不同:由比较运算符引出的子查询、由IN/NOTIN谓词引出的子查询、由ANY/ALL谓词引出的子查询、由EXISTS/NOT EXISTS谓词引出的子查询
  4. 嵌套查询的执行过程
    • 不相关子查询的执行过程:从内向外依次执行
    • 相关子查询的执行过程:循环往返执行
  5. 带比较运算符的子查询
    • 比较运算符引出的子查询:

      SELECT sno, sname FROM Student WHERE dno = (SELECT dno FROM Student WHERE sname = '贾哲');
      

      image

  6. 带IN(或NOT IN)谓词的子查询
    • IN谓词引出的子查询:

      SELECT sname FROM Student WHERE sno IN (SELECT sno FROM SC WHERE cno = 'C3');
      

      image

    • NOT IN谓词引出的子查询:

      SELECT sname FROM Student WHERE sno NOT IN (SELECT sno FROM SC WHERE cno = 'C3');
      

      image

  7. 带ANY/ALL谓词的子查询
    • ANY谓词引出的子查询:

      SELECT sname, birth FROM Student WHERE birth > ANY (SELECT birth FROM Student WHERE dno = 'D3') AND dno <> 'D3';
      

      image

    • ALL谓词引出的子查询:

      SELECT sname, birth FROM Student WHERE birth > ALL (SELECT birth FROM Student WHERE dno = 'D3') AND dno <> 'D3';
      
  8. 带EXISTS(或NOT EXISTS)谓词的子查询
    • EXISTS谓词引出的子查询:

      SELECT sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE cno = 'C3' AND sno = Student.sno);
      
    • NOT EXISTS谓词引出的子查询:

      SELECT sname FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE cno = 'C3' AND sno = Student.sno);
      
  9. 用存在量词实现全称量词
    • 全称量词的表达:

      SELECT sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE sno = Student.sno AND cno = Course.cno));
      

      image

  10. 用存在量词实现蕴涵逻辑
    • 蕴涵逻辑的表达:

      SELECT DISTINCT sno FROM SC SCX WHERE SCX.sno <> 'S3' AND NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.sno = 'S3' AND NOT EXISTS (SELECT * FROM SC SCZ WHERE SCZ.sno = SCX.sno AND SCZ.cno = SCY.cno));
      

      image

3.4.5 集合查询
  1. 定义
    1. 集合查询是对两个或多个SELECT查询结果的集合进行并、交、差等集合运算。
  2. 特点:
    • 并运算:包括两个查询语句结果的所有元组。
    • 交运算:包括两个查询结果中共有的元组。
    • 差运算:包括属于第一个结果集但不属于第二个结果集中的元组。
  3. 并运算
    • 并运算:

      SELECT sno FROM SC WHERE cno = 'C1' UNION SELECT sno FROM SC WHERE cno = 'C3';
      

      image

  4. 交运算
    • 交运算:

      SELECT sno FROM SC WHERE cno = 'C1' AND sno IN (SELECT sno FROM SC WHERE cno = 'C3');
      

      image

  5. 差运算
    • 差运算:

      SELECT sno FROM SC WHERE cno = 'C1' AND sno NOT IN (SELECT sno FROM SC WHERE cno = 'C3');
      

      image

3.4.6 多表查询的等价形式
  1. 定义
    1. 多表查询的等价形式指的是通过不同的查询方法实现相同的查询结果。常见的等价形式包括自然连接、带有IN谓词的子查询、带有比较运算符的子查询、ANY/ALL引出的子查询、EXISTS/NOT EXISTS引出的子查询以及多种混合形式。
  2. 多表查询的肯定形式
    • 自然连接(显式内连接和隐式内连接)

      • 显式

        • SELECT sno, sname
          FROM Student
          INNER JOIN SC ON Student.sno = SC.sno
          INNER JOIN Course ON Course.cno = SC.cno
          WHERE score < 60 AND cname = '数据库';
          
      • 隐式

        • SELECT Student.sno, sname
          FROM Student, SC, Course
          WHERE Student.sno = SC.sno 
          AND Course.cno = SC.cno 
          AND score < 60 
          AND cname = '数据库';
          
    • IN嵌套

      • SELECT sno, sname
        FROM Student
        WHERE sno IN (
            SELECT sno
            FROM SC
            WHERE score < 60
            AND cno IN (
                SELECT cno
                FROM Course
                WHERE cname = '数据库'
            )
        );
        
    • ANY/ALL嵌套及其等价的表达

      • SELECT sno, sname
        FROM Student
        WHERE sno = ANY (
            SELECT sno
            FROM SC
            WHERE score < 60
            AND cno = ANY (
                SELECT cno
                FROM Course
                WHERE cname = '数据库'
            )
        );
        
    • EXISTS嵌套

      • SELECT sno, sname
        FROM Student
        WHERE EXISTS (
            SELECT *
            FROM SC
            WHERE score < 60
            AND SC.sno = Student.sno 
            AND EXISTS (
                SELECT *
                FROM Course
                WHERE cname = '数据库'
                AND Course.cno = SC.cno
            )
        );
        
    • 多种混合形式

      • SELECT sno, sname
        FROM Student
        WHERE sno IN (
            SELECT sno
            FROM SC, Course
            WHERE SC.cno = Course.cno 
            AND score < 60 
            AND cname = '数据库'
        );
        
  3. 多表查询的否定形式
    • NOT IN嵌套

      • SELECT cno, cname
        FROM Course
        WHERE cno NOT IN (
            SELECT cno
            FROM SC
            WHERE sno IN (
                SELECT sno
                FROM Student
                WHERE sname = '陈茹'
            )
        );
        
    • <>ALL嵌套

      • SELECT cno, cname
        FROM Course
        WHERE cno <> ALL (
            SELECT cno
            FROM SC
            WHERE sno IN (
                SELECT sno
                FROM Student
                WHERE sname = '陈茹'
            )
        );
        
    • NOT EXISTS嵌套

      • SELECT cno, cname
        FROM Course
        WHERE NOT EXISTS (
            SELECT *
            FROM SC
            WHERE EXISTS (
                SELECT *
                FROM Student
                WHERE sname = '陈茹'
                AND sno = SC.sno
                AND SC.cno = Course.cno
            )
        );
        

总结

SQL数据查询功能强大,能完成各种复杂的查询操作。通过单表查询、分组查询、连接查询、嵌套查询和集合查询,可以实现对数据库的全面查询和分析。不同类型的查询可以通过多种等价形式表示,选择合适的查询方式可以提高查询效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2099653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全局安装react

1、首先安装react脚手架 npm install -g create-react-app2、创建react项目 create-react-app my-app3、 PS D:\桌面\papers\subject> create-react-app my-react-appCreating a new React app in D:\桌面\papers\subject\my-react-app.Installing packages. This might …

基于vue框架的超市订单管理系统16uob(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;员工,商品分类,商品信息,供货商,入库订单,销售订单,货架信息,盈利信息 开题报告内容 基于Vue框架的超市订单管理系统开题报告 一、研究背景与意义 随着信息技术的飞速发展和电子商务的普及&#xff0c;传统超市管理模式正面临前所未有…

wsl2 安装qt5

sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator -ysudo apt-get install build-essential libfontconfig1 mesa-common-dev -y "qt5-default"从Ubuntu 21.04 存储库中就缺少了该软件包&#xff0c;后续会不会添加暂时未知。 在…

SpringBoot日志使用:Slf4j与Logback

步骤一&#xff1a;引入lombok即可&#xff0c;lombok自带Slf4j注解&#xff08;网上说不用引入api的依赖&#xff0c;若报错可添加&#xff09; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version&…

数据访问:JPA

文章目录 JPA的由来JPA是什么Spring Data JPA快速上手 JPA的由来 ORM框架能够将Java对象映射到关系型数据库中&#xff0c;能够直接持久化复杂的 Java对象。ORM框架的出现&#xff0c;可以让开发者从数据库编程中解脱出来&#xff0c;把更多的精力放在业务模型与业务逻辑上。目…

Open3D 计算投影的点云的尺寸

目录 一、概述 1.1实现步骤 1.2应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2投影后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 在 Open3D 中&…

electron-vite打包出错

问题&#xff1a;1 electron-vite 安装&#xff0c; 打包下载资源失败&#xff0c;设置国内镜像 由于electron默认打包会从github上下载相关二进制包&#xff0c;众所周知&#xff0c;国内GitHub访问是相当慢的&#xff0c;所以经常会出现下载失败导致打包不成功&#xff0c;…

中兴-ZSRV2路由器-任意文件读取

中兴-ZSRV2路由器-任意文件读取 文章目录 中兴-ZSRV2路由器-任意文件读取免责声明漏洞描述搜索语法漏洞复现修复建议 免责声明 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连…

upload-labs闯关攻略

pass-1 提前准备好的一个PHP木马&#xff0c;然后将后缀名改为jpg上传 然后在上传的过程中利用抓包&#xff0c;将抓取到的包里面的后缀jpg改为php如图所示&#xff0c;然后放行 接着我们去访问上传的图片信息&#xff0c;如下图所示就为成功 pass-2 提前准备好的一个PHP木马…

线程池相关知识点

线程池是什么相信大家都是知道的&#xff0c;所以这里就不做解释了&#xff0c;直接看相关知识点吧。 初始化线程池方法 继承ThreadPool 实现Runnable 实现Callable 接口 FutureTask &#xff08;可以拿到返回结果&#xff0c;可以处理异常&#xff09; 核心参数 corePoo…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-23 VTC视频时序控制器设计

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

Javascript LeeCode选题(汉诺塔求解)

LeeCode选题 汉诺塔递归求解move移动函数hanoi函数main方法测试代码&#xff1a;代码实现 汉诺塔递归求解 汉诺塔介绍&#xff1a; 汉诺塔的的图形&#xff08;从上到下1&#xff0c;2&#xff0c;3个&#xff09;实现&#xff1a; 这里我们可以看到因为必须要将第n个移动到…

数据结构与算法 第7天(树和森林)

树 树的存储结构 双亲表示法 找双亲容易&#xff0c;找孩子不容易 孩子链表法 把每个结点的孩子节点排列起来&#xff0c;看成一个线性表&#xff0c;用单链表存 找孩子容易&#xff0c;找双亲难 带双亲孩子链表法 给孩子链表加一个参数&#xff0c;存双亲的下标 孩子兄…

系统思考—盲点

突‮盲破‬点&#xff0c;解‮合锁‬作潜能——JSTO 的‮能高‬碰撞&#xff01; 在今天的JSTO会议中&#xff0c;我们在Check In环‮分节‬享了近1-2周‮实的‬践和反思。这‮环个‬节不仅‮助帮‬大家‮享共‬了更多的‮息信‬和资源&#xff0c;还‮效有‬促进了彼‮间此‬…

jenv 一款macos下的开源JAVA多版本环境安装管理切换工具

一个用于macos/linux下的多版本JAVA环境管理工具 -- jenv, 这款工具和 pyenv 类似,都是基于shell脚本开发的. 可以方便的管理 多个java环境版本. jenv安装 git clone https://gitee.com/tekintian/jenv.git ~/.jenv jenv环境配置 将下面的代码加入都你的 ~/.bash_profil…

堆垛机知识介绍:附图

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是关于堆垛机的介绍&#xff0c;内容包括堆垛机的概念、分类、工作原理、结构…

Vue(九) 全局事件总线、Todo案例应用全局事件总线、消息订阅与发布、Todo案例应用消息订阅、编辑Item、$nextTick

文章目录 一、全局事件总线 (GlobalEventBus)1. 总线前言2. 安装全局事件总线3. 使用总线事件4. 解绑总线事件 二、Todo案例应用全局事件总线三、消息订阅与发布1. 前言2. 使用步骤 四、Todo案例应用消息订阅五、Todo案例编辑Item六、$nextTick修改后的Todo完整代码 一、全局事…

【负载均衡】LoadBalance场景演示

服务端⾼并发分布式结构演进之路-CSDN博客文章浏览阅读976次&#xff0c;点赞11次&#xff0c;收藏9次。在进行技术学习过程中&#xff0c;由于大部分读者没有经历过一些中大型系统的实际经验&#xff0c;导致无法从服务端⾼并发分布式结构演进之路-----在进行技术学习过程中&a…

低代码技术:简化应用开发,推动数字化转型

在当今快速变化的技术环境中&#xff0c;企业面临着巨大的压力&#xff0c;需要快速响应市场需求并持续推动数字化转型。传统的应用开发方式往往复杂且耗时&#xff0c;开发周期长且需要大量的编程工作。为了应对这些挑战&#xff0c;低代码技术应运而生&#xff0c;为企业提供…

谈谈人工智能在中国:现状与未来展望

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动全球经济和社会发展的关键力量。作为全球科技创新的重要参与者&#xff0c;中国在AI领域取得了令人瞩目的进展&#xff0c;并展现出强大的未来发展潜力。本文将深入分析中国AI的现状&#xff0c;…