关系数据库SQL数据查询

news2024/11/17 0:37:20

关系数据库SQL数据查询

数据查询

一、单表查询

1.查询仅涉及一个表,选择表中的若干列

[1]  查询全体学生的学号与姓名。
	SELECT Sno,Sname
	FROM Student; 

[2]  查询全体学生的姓名、学号、所在系。
	SELECT Sname,Sno,Sdept
	FROM Student;

查询全部列

  • 选出所有属性列:
  • 在SELECT关键字后面列出所有列名
  • 将<目标列表达式>指定为 *
	[3]  查询全体学生的详细记录
	SELECT  Sno,Sname,Ssex,Sage,Sdept 
	FROM Student;SELECT  *
	FROM Student; 

查询经过计算的值

  • SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
 [4]  查全体学生的姓名及其出生年份。
 SELECT Sname,2014-Sage          /*假设当时为2014年*/
 FROM Student;
 输出结果:
             Sname   2014-Sage
                李勇         1994
                刘晨         1995
                王敏         1996
                张立         1995 

使用列别名改变查询结果的列标题:

	     SELECT Sname NAME,'Year of Birth:'  BIRTH,
	       2014-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
		FROM Student;
	输出结果:
	    NAME      BIRTH         BIRTHDAY   DEPARTMENT
	   
	     李勇    Year of Birth:    1994             cs
	     刘晨    Year of Birth:    1995             cs
	     王敏    Year of Birth:    1996             ma
	     张立    Year of Birth:    1995             is

2.选择表中的若干元组

消除取值重复的行

如果没有指定DISTINCT关键词,则缺省为ALL

	[5]  查询选修了课程的学生学号。
	    SELECT Sno   FROM SC;
		等价于:
		SELECT ALL  Sno  FROM SC;
		执行上面的SELECT语句后,结果为: 
						    Sno
	
						201215121
						201215121
						201215121
						201215122
						201215122

指定DISTINCT关键词,去掉表中重复的行

	   SELECT DISTINCT Sno
	    FROM SC; 
	
	    执行结果:
						    Sno
	
						201215121
						201215122

常用的查询条件:

在这里插入图片描述

1. 比较大小:

	[6] 查询计算机科学系全体学生的名单。
	    SELECT Sname
	    FROM     Student
	    WHERE  Sdept=‘CS’; 
	[7]查询所有年龄在20岁以下的学生姓名及其年龄。
	     SELECT Sname,Sage 
	     FROM     Student    
	     WHERE  Sage < 20;
	[8]查询考试成绩有不及格的学生的学号。
	    SELECT DISTINCT Sn
	    FROM  SC
	    WHERE Grade<60; 

2. 确定范围:
谓词: BETWEEN … AND …

NOT BETWEEN … AND …

	[9] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
	     SELECT Sname, Sdept, Sage
	FROM     Student
	WHERE   Sage BETWEEN 20 AND 23; 
	
	[10]  查询年龄不在20~23岁之间的学生姓名、系别和年龄
		       SELECT Sname, Sdept, Sage
		       FROM    Student
		       WHERE Sage NOT BETWEEN 20 AND 23; 

3. 确定集合:
谓词:IN <值表>, NOT IN <值表>

	[11]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
		SELECT Sname, Ssex
		FROM  Student
		WHERE Sdept IN ('CS','MA’,'IS' );
	
	[例12]查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。
		SELECT Sname, Ssex
		FROM Student
		      WHERE Sdept NOT IN ('IS','MA’,'CS' );
  1. 字符匹配:
  • 谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]

  • <匹配串>可以是一个完整的字符串,也可以含有通配符%和 _

  • % (百分号) 代表任意长度(长度可以为0)的字符串

  • 例如a%b表示以a开头,以b结尾的任意长度的字符串
    _ (下横线) 代表任意单个字符。

  • 例如a_b表示以a开头,以b结尾的长度为3的任意字符串

 匹配串为固定字符串
 
 [13]  查询学号为201215121的学生的详细情况。
       SELECT *    
      FROM  Student  
      WHERE  Sno LIKE201215121';
 
 等价于: 
        SELECT  * 
       FROM  Student 
       WHERE Sno = ' 201215121 ';

 匹配串为含通配符的字符串
 [例14]  查询所有姓刘学生的姓名、学号和性别。
        SELECT Sname, Sno, Ssex
       FROM Student
       WHERE  Sname LIKE '%';
 
 [例15]  查询姓"欧阳"且全名为三个汉字的学生的姓名。
        SELECT Sname
       FROM   Student
       WHERE  Sname LIKE '欧阳__';

使用换码字符将通配符转义为普通字符

	 [16]  查询DB_Design课程的课程号和学分。
	      SELECT Cno,Ccredit
	      FROM     Course
	      WHERE  Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
	[17]  查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
	      SELECT  *
	      FROM    Course
	      WHERE  Cname LIKE  'DB\_%i_ _' ESCAPE '\ ' ;
		
		ESCAPE '\' 表示“ \” 为换码字符

5. 涉及空值的查询:
谓词: IS NULL 或 IS NOT NULL

  • “IS” 不能用 “=” 代替
 	[18]  某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
 	  SELECT Sno,Cno
       FROM    SC
       WHERE  Grade IS NULL
 [19]  查所有有成绩的学生学号和课程号。
       SELECT Sno,Cno
       FROM     SC
       WHERE  Grade IS NOT NULL;

6.多重条件查询

  • 逻辑运算符:AND和 OR来连接多个查询条件
    AND的优先级高于OR
  • 可以用括号改变优先级

[例20] 查询计算机系年龄在20岁以下的学生姓名。

SELECT Sname
FROM Student
WHERE Sdept= ‘CS’ AND Sage<20;

3.ORDER BY子句

ORDER BY子句

​ 可以按一个或多个属性列排序

​ 升序:ASC;降序:DESC;缺省值为升序

对于空值,排序时显示的次序由具体系统实现来决定

 [21]查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
         SELECT Sno, Grade
         FROM    SC
         WHERE  Cno= ' 3 '
         ORDER BY Grade DESC;
 
 [22]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
         SELECT  *
         FROM  Student
         ORDER BY Sdept, Sage DESC;  

4.聚集函数统计元组个数

COUNT(*)

  1. 统计一列中值的个数

    COUNT([DISTINCT|ALL] <列名>)

  2. 计算一列值的总和(此列必须为数值型)

    SUM([DISTINCT|ALL] <列名>)

  3. 计算一列值的平均值(此列必须为数值型)

    AVG([DISTINCT|ALL] <列名>)

  4. 求一列中的最大值和最小值

    MAX([DISTINCT|ALL] <列名>)

    MIN([DISTINCT|ALL] <列名>)

 	 [23]  查询学生总人数。
     	SELECT COUNT(*)
     	FROM  Student; 
      [24]  查询选修了课程的学生人数。
      SELECT COUNT(DISTINCT Sno)
      FROM SC;
      [25]  计算1号课程的学生平均成绩。
           SELECT AVG(Grade)
           FROM    SC
           WHERE Cno= ' 1 ';
  [26]  查询选修1号课程的学生最高分数。
    SELECT MAX(Grade)
    FROM SC
    WHERE Cno='1';
 
   [27 ] 查询学生201215012选修课程的总学分数。
     		  SELECT SUM(Ccredit)
               FROM  SC,Course
               WHERE Sno='201215012' AND SC.Cno=Course.Cno; 

5.GROUP BY子句

GROUP BY子句分组:
细化聚集函数的作用对象

  • 如果未对查询结果分组,聚集函数将作用于整个查询结果
  • 对查询结果分组后,聚集函数将分别作用于每个组
  • 按指定的一列或多列值分组,值相等的为一组
 [例28]  求各个课程号及相应的选课人数。
      SELECT Cno,COUNT(Sno)
      FROM    SC
      GROUP BY Cno; 
      查询结果可能为:
          Cno     COUNT(Sno)
  		1             22
     	   2             34
      	    3             44
   		 4             33
              5             48

HAVING短语与WHERE子句的区别:

  • 作用对象不同
  • WHERE子句作用于基表或视图,从中选择满足条件的元组
  • HAVING短语作用于组,从中选择满足条件的组。

二、连接查询

  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]中,由于一个学生只可能在一个系学习,则可以用 = 代替INSELECT 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的学生
在这里插入图片描述

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

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

相关文章

python代码实现生成二维码

二维码结构&#xff1a; 从图中我们可以看出二维码结构整体划分为功能图形和编码区两大部分&#xff0c;功能图形又细分为&#xff1a;空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形&#xff0c;而编码区细分为&#xff1a;格式信息、版本信息、数据和纠错码字…

Flutter进阶-List数组的深浅拷贝问题

浅拷贝&#xff1a;拷贝指针深拷贝&#xff1a;拷贝一份新的对象 浅拷贝出现的问题&#xff1a;操作一个数组另一个数组也发生改变 List list [1, 2, 3, 4, 5]; List copyList list; copyList[0] abc; print(list);///打印&#xff1a; [abc,2,3,4,5] print(copyList);///打…

机器学习——博客推荐系统

前言 在当今的信息时代&#xff0c;技术博客已成为知识、见解和娱乐的重要来源。随着博客内容的日益丰富&#xff0c;找到最相关和最引人入胜的文章对用户来说可能是一项艰巨的任务。为了应对这一挑战&#xff0c;我们需要一个全面的博客推荐系统&#xff0c;利用尖端技术和机…

RabbitMQ + SpringCloud使用及避坑(大章)

RabbitMQ 的开发语言是Erlang&#xff0c;它的源码阅读起来学习成本太高了&#xff0c;所以这里就不详细看了&#xff0c;本次主要是结合springCloud 的项目来真正使用RabbitMQ 的几种交换器&#xff0c;还有一些业务场景的模拟&#xff0c;最主要的还是避坑。 为什么说是避坑…

JavaSE进阶--玩转IO流

文章目录 前言一、File类介绍1、概念引入2、实际应用2.1 操作文件2.2 操作文件夹 二、IO流介绍三、字符流1、读文件1.1 一次读一个1.2 一次读多个&#xff0c;使用char数组去装 2、写文件2.1 一次写一个2.2 一次写完&#xff0c;使用字符数组 3、文件复制3.1 综合应用3.2 使用缓…

ESP32(MicroPython)LVGL输入字符显示到OLED屏幕

本程序用于输入字符显示到OLED屏幕&#xff08;按回车键输出字符到屏幕&#xff09;&#xff0c;依次输出六行字符&#xff0c;再按回车会清空屏幕并从第一行开始输出。 代码如下 import lvgl as lv import time from espidf import VSPI_HOST from ili9XXX import ili9341…

模拟随机验证码

网拷一篇中英文文本&#xff0c;去除标点空格作为验证码字符集。 (本笔记适合对 python 的随机模块有一定了解的的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&a…

如何在IDEA上实现JDBC编程

&#x1f495;人生在世&#xff0c;不如意事常八九&#xff0c;若把烦恼全都写在纸上&#xff0c;时间长了纸也会烦。所以&#xff0c;没事的时候给自己多一些微笑&#xff0c;少一些烦恼。&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f3…

【备战秋招】每日一题:4月23日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第二题-制作骰子 在线评测链接:P1246 题目内容 塔子哥是一个喜欢手工制作的人&#xff0c;他经常用各种材料制作一些有趣的物品。他最近想要制作一个骰子&#xff0c;但是…

Oracle11gRAC安装JVM组件

目录&#xff1a; 安装前检查&#xff1a;安装JVM组件&#xff1a;方式一&#xff08;图形化安装&#xff09;方式二&#xff08;执行脚本安装&#xff09; 检查DB JVM状态脚本 安装前检查&#xff1a; 检查角色&#xff1a; select * from dba_roles where ROLE in (JAVAIDP…

分布式安装配置spark-3.2.3

Spark是一个基于内存的大数据计算框架&#xff0c;可以与Hadoop集成&#xff0c;提供更快速的数据处理能力。本文将介绍如何在三个Ubuntu系统上搭建一个Spark集群。 主要步骤包括&#xff1a; 准备工作&#xff1a;下载安装包&#xff0c;设置环境变量&#xff0c;解压安装包…

基于Elasticsearch与Hbase组合框架的大数据搜索引擎

本项目为学校大数据工程实训项目&#xff0c;共开发4周&#xff0c;答辩成绩不错。代码仓库放文章尾&#xff0c;写的不好&#xff0c;代码仅供参考。 搜索 对于结构化数据&#xff0c;因为它们具有特定的结构&#xff0c;所以我们一般都是可以通过关系型数据库&#xff08;M…

【读书笔记】《房思琪的初恋乐园》- 林奕含

文章目录 第一章 乐园第二章 失乐园 第一章 乐园 钱爷爷说&#xff1a;“两个小美女有心事啊&#xff1f;”怡婷最恨人家叫她们两个小美女&#xff0c;她很这种算术上的好心。 在外人看来&#xff0c;女生无论长得漂亮还是长得不怎么样都是一种原罪。或者正如上野千鹤子所说那样…

pocketgl

pocketgl支持在自己的web页面集成类似 Shadertoy、 Threejs 等基于webGL 的渲染图形窗口&#xff0c; 并且拥有shader代码高亮编辑器支持实时修改和预览。 其自带的mesh包含两个Sphere 和 Teaport, 同时支持上床自定义的网格 和 背景天空盒。其既支持像Shadertoy 这种只包含fra…

[元带你学: eMMC协议详解 13] 数据读(Read) 写(Write) 详解

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 4700字&#xff0c; 主要内容 1. 数据读取 2. 块读取操作 3. 数据写 4.块写操作 参考 1. 数据读取 当没有数据传输时&#xff0c;DATO-D…

Python使用happybase写入HBase

HBase是一个分布式的、面向列的NoSQL数据库&#xff0c;可以存储大量的非结构化或半结构化的数据。tif是一种常见的影像文件格式&#xff0c;可以存储多波段的栅格数据。本文将介绍如何使用Python的happybase模块和gdal模块&#xff0c;从tif格式的影像文件中读取数据&#xff…

排序算法的奇妙冒险

排序算法的奇妙冒险 一.排序的概念1.1 排序的定义1.2 排序的稳定性1.3 排序的内排序和外排序 二.插入排序2.1 直接插入排序2.2 希尔排序 三.选择排序3.1直接选择排序3.2 堆排序 四.交换排序4.1 冒泡排序4.2 快速排序**选取基准值的方法**快速排序的优化非递归实现快速排序 五.归…

Web3简述MetaMask并演示谷歌安装MetaMask扩展程序方式

Web3到现在理论这段是说的有点太多了 那么 我们先来看个东西 叫 MetaMask 这个在我们项目开发过程中需要使用 其实 你如果去找MetaMask 可能会被一些关键字下到 可能会看到 虚假 诈骗等关键字 因为 这个东西本事就是一个开源的以太坊的一个钱包 那么 钱包肯定就是用来管理资产…

LoadDef python工具包学习一:计算love数

首先在github下载这个工具箱&#xff1a;https://github.com/hrmartens/LoadDef 下载完毕&#xff0c;解压缩进入如下的界面&#xff0c;点击进入working工作文件夹。在doc文件夹里面有帮助文档和教程&#xff0c;有需要的可以仔细阅读。 loaddef主要的功能模块包括&#xff1…

力扣日记1494

1. 题目 [LeetCode 1494. 并行课程 II]https://leetcode.cn/problems/parallel-courses-ii/) 1.1 题意 严格按照选课先修顺序选课&#xff0c;每个学期选课数有上限&#xff0c;求选完所有课程的最短学期数 1.2 分析 这道题的数据量很小&#xff0c;而且作为困难题&#xff…