当前位置: 首页 > news >正文

SQL语言---数据的查询

文章目录

  • 前言
  • 一、SQL语言的数据查询
    • 1.SELECT语句格式
      • (1)定义格式
      • (2)WHERE子句中条件表达式F的语法申明
      • (3)SELECT语句的语法格式
    • 2.单表查询
      • (1)什么是单表查询?
      • (2)举例说明语法
        • 例子1:简单查询
        • 例子2:在例子1的基础上使用别名
        • 例子3:DISTINCT关键词
        • 例子4:取范围内的值
        • 例子5:确定集合中的值
        • 例子6:字符匹配
        • 例子7:ORDER BY子句
        • 例子8:聚合函数
        • 例子9:GROUP BY子句
        • 例子10:HAVING 语句
    • 3.连接查询
      • (1)什么是连接查询?
      • (2)举例讲解
        • 例子1:等值连接
        • 例子2:内连接
        • 例子3:自然连接
        • 例子4:自身连接
        • 例子5:外连接
    • 4.嵌套查询
      • (1)什么是嵌套查询?
      • (2)分类:
        • 按照求解方法
        • 按照查询结果
      • (3)子查询使用规则
      • (4)子查询易犯的错误
      • (5)举例讲解
        • 例子1:带有IN谓词的子查询
        • 例子2:带有比较运算符的子查询
        • 例子3:带有ANY(SOME)或ALL谓词的子查询
        • 例子4:带有EXISTS谓词的子查询
    • 5.集合查询
      • (1)什么是集合查询?
      • (2)举例讲解
        • 例子1:并操作UNION
        • 例子2:交操作INTERSECT
        • 例子3:差操作MINUS
  • 总结


前言

本文主要讲解了SQL语言的数据查询的相关语法,并且给出了详实的例子供读者参考


一、SQL语言的数据查询

1.SELECT语句格式

(1)定义格式

SQL设计了 S E L E C T − F R O M − W H E R E SELECT-FROM-WHERE SELECTFROMWHERE的句型结构:
S E L E C T   A 1 , . . . , A n F R O M   R 1 , . . . , R m W H E R E   F 这里 R 1 . . . 是关系, F 是公式, A 1 , . . . 是属性 SELECT \ A_1,...,A_n\\ FROM \ R_1,...,R_m\\ WHERE \ F\\ 这里R_1...是关系,F是公式,A_1,...是属性\\ SELECT A1,...,AnFROM R1,...,RmWHERE F这里R1...是关系,F是公式,A1,...是属性
简单的理解

  • A代表你要查询的信息
  • R代表这些信息来自于哪些关系型数据表
  • F代表得到这些数据需要的集合操作的数学描述

(2)WHERE子句中条件表达式F的语法申明

在WHERE子句的条件表达式F中可使用下列运算符

  • 算术比较运算符:<、 <= 、 > 、 >= 、 <> 、 !=
  • 逻辑运算符:AND、OR、NOT
  • 集合成员资格运算符:IN、NOT IN
  • 谓词:EXISTS、ALL、SOME、UNIQUE
  • 聚合函数:AVG、MIN、MAX、SUM、COUNT
  • F中运算对象还可以是另一个SELECT语句,即SELECT句型可以嵌套
    在这里插入图片描述

(3)SELECT语句的语法格式

完整语法如下:

SELECT 目标表的列名或列表达式序列
FROM 基本表名和(或)视图序列
[WHERE 行条件表达式]
[GROUP BY 列名序列[HAVING 组条件表达式]]
[ORDER BY 列名[ASC|DESC],...]

简单的可以理解为:

  • SELECT子句:指定要显示的属性列
  • FROM子句:指定查询对象(基本表或视图)
  • WHERE子句:指定查询条件
  • GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
  • HAVING短语:只有满足指定条件的组才予以输出
  • ORDER BY子句:对查询结果表按指定列值的升序或降序排序

2.单表查询

(1)什么是单表查询?

单表查询仅涉及一个表,是一种最简单的查询操作。
它有如下的诸多用途:

1.选择表中的若干列
2.选择表中的若干元组
3.对查询结果排序
4.使用聚合函数
5.对查询结果分组 

(2)举例说明语法

例子1:简单查询

查询每个人需要交税的金额,假设800以上薪水需要交税,税率为10%
在这里插入图片描述
代码:

SELECT ENAME,(SAL-800)*0.1 FROM EMP; 

结果:
在这里插入图片描述

例子2:在例子1的基础上使用别名

在这里插入图片描述
代码:

SELECT ENAME 姓名,SAL 薪水(SAL-800)*0.1 税金 FROM EMP;

在这里插入图片描述

例子3:DISTINCT关键词

使用DISTINCT关键词可以达到取消重复的行的效果

SELECT DEPTNO FROM EMP;

缺省时默认为ALL

SELECT ALL DEPTNO FROM EMP;

在这里插入图片描述

SELECT DISTINCT DEPTNO FROM EMP;

在这里插入图片描述

例子4:取范围内的值

SELECT ENAME ,SAL FROM EMP WHERE SAL BETWEEN 1500 AND 2000; 
``````sql
SELECT ENAME ,SAL FROM EMP WHERE SAL>=1500 AND SAL<=2000;

两个代码的效果一样,即BETWEEN AND等价于>=AND<=。
在这里插入图片描述

例子5:确定集合中的值

下面提供了两种方法,都是可以找出特定集合元素的值
其中 * 表示全部列都显示,是一种缺省

SELECT * FROM EMP WHERE JOB IN('SALESMAN','CLERK');

在这里插入图片描述

SELECT * FROM EMP WHERE JOB='SALESMAN' OR JOB='CLERK';

在这里插入图片描述

例子6:字符匹配

谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>可以是一个完整的字符串,也可以含有通配符%和 _

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

查询名字以S开头,第三个字母是O的员工姓名

SELECT ENAME FROM EMP WHERE ENAME LIKE 'S_O%';

在这里插入图片描述

例子7:ORDER BY子句

可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序

当排序列含空值时

  ASC:排序列为空值的元组最后显示
  DESC:排序列为空值的元组最先显示
SELECT * FROM EMP ORDER BY COMM ASC;

在这里插入图片描述

SELECT * FROM EMP ORDER BY COMM DESC;

在这里插入图片描述

例子8:聚合函数

聚合函数是涉及整个关系的另一类运算操作,通过聚合函数,可以把某一列中的值形成单个值。
5类主要聚合函数:

  • 计数
    COUNT([DISTINCT|ALL] *)
    COUNT([DISTINCT|ALL] <列名>)
  • 计算总和
    SUM([DISTINCT|ALL] <列名>)
  • 计算平均
    AVG([DISTINCT|ALL] <列名>)
  • 求最大值
    MAX([DISTINCT|ALL] <列名>)
  • 求最小值
    MIN([DISTINCT|ALL] <列名>)
SELECT count(*) FROM EMP;

在这里插入图片描述

SELECT SUM(SAL) FROM EMP;

在这里插入图片描述

SELECT AVG(SAL) FROM EMP;

在这里插入图片描述

SELECT MAX(SAL) FROM EMP;

在这里插入图片描述

SELECT MIN(SAL) FROM EMP;

在这里插入图片描述

例子9:GROUP BY子句

细化集函数的作用对象

  • 未对查询结果分组,聚合函数将作用于整个查询结果
  • 对查询结果分组后,聚合函数将分别作用于每个组
SELECT DEPTNO,AVG(SAL) AS 平均工资 FROM EMP GROUP BY DEPTNO;

在这里插入图片描述

例子10:HAVING 语句

注意:
WHERE子句中是不能用聚集函数作为条件表达式,因此需要用HAVING短语

只有满足HAVING短语指定条件的组才输出。
HAVING短语与WHERE子句的区别:作用对象不同

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

查平均工资大于2200元的部门

SELECT DEPTNO ,AVG(SAL) AS 员工工资 FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2200;

在这里插入图片描述

3.连接查询

(1)什么是连接查询?

连接查询:同时涉及两个以上的表的查询
连接条件或连接谓词:用来连接两个表的条件
一般格式:
[<表 名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
连接字段:连接谓词中的列名称
连接条件中的各连接字段类型必须是可比的,但名字不必相同

(2)举例讲解

例子1:等值连接

根据医生的薪水,查看医生和其对应的职称
(DOCTOR_INFORMATION)
在这里插入图片描述

(DOCTOR_LEVEL)
在这里插入图片描述

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION,DOCTOR_LEVEL
WHERE DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL;

结果:
在这里插入图片描述

例子2:内连接

根据医生的薪水,查看医生和其对应的职称
(DOCTOR_INFORMATION)
在这里插入图片描述

(DOCTOR_LEVEL)
在这里插入图片描述

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
INSERT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

例子3:自然连接

自然连接是指在检索多个表时,Oracle会将第一个表中的列与第二个表中具有相同名称的列进行自动连接。在自然连接中,用户不需要明确指定进行连接的列,这个任务由Oracle系统自动完成,自然连接使用**“NATURAL JOIN”关键字。**

在emp表中检索工资(sal字段)大于2000的记录,并实现emp表与dept表的自然连接。

emp:
在这里插入图片描述

dept:
在这里插入图片描述

SELECT EMPNO,ENAME,JOB,DNAME
FROM EMP NATURAL JOIN DEPT
WHERE SAL>2000;

在这里插入图片描述

例子4:自身连接

自身连接:一个表与其自己进行连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀

查看每个职称的上级职称
在这里插入图片描述

SELECT FIRST.DLEVELID,FIRST.DLEVELNAME,FIRST.FATHERLEVEL,
SECOND.DLEVELID,SECOND.DLEVELNAME
FROM DOCTOR_LEVEL FIRST,DOCTOR_LEVEL SECOND
WHERE FIRST.FATHERLEVEL=SECOND.DLEVELID

结果:
在这里插入图片描述

例子5:外连接

外连接与普通连接的区别

1.普通连接操作只输出满足连接条件的元组
2.外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
3.左外连接:列出左边关系中所有的元组 
4.右外连接:列出右边关系中所有的元组 

外连接通常有以下三种:

  • 左外连接:关键字为LEFT OUTER JOIN或LEFT JOIN。
  • 右外连接:关键字为RIGHT OUTER JOIN 或RIGHT JOIN。
  • 完全外连接:关键字为FULL OUTER JOIN或FULL JOIN。

DOCTOR_INFORMATION
在这里插入图片描述

DOCTOR_LEVEL
在这里插入图片描述

  • 左外连接:左外连接的查询结果中不仅包含了满足连接条件的数据行,而且还包含左表中不满足连接条件的数据行。
SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
LEFT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

结果:
在这里插入图片描述

  • 右外连接:右外连接的查询结果中不仅包含了满足连接条件的数据行,而且还包含右表中不满足连接条件的数据行。
SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
RIGHT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

结果:
在这里插入图片描述

  • 完全外连接:在执行完全外连接时,Oracle会执行一个完整的左外连接和右外连接查询,然后将查询结果合并,并消除重复的记录行。
SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
FULL JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

结果:
在这里插入图片描述

4.嵌套查询

(1)什么是嵌套查询?

一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询

SELECT select_list
FROM tablename
WHERE expr_operator
      (SELECT select_list
        FROM table);

  • 上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询
  • SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询

(2)分类:

按照求解方法

  • 不相关子查询:子查询的查询条件不依赖于父查询,由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件
  • 相关子查询:子查询的查询条件依赖于父查询。首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表,然后再取外层表的下一个元组。重复这一过程,直至外层表全部检查完为止。

按照查询结果

  • 单行子查询:内部SELECT命令返回一条记录
  • 多行子查询:内部SELECT命令返回多条记录
  • 多列子查询:内部SELECT命令返回多个数据列

(3)子查询使用规则

  • 子查询要用括号括起来
  • 将子查询放在比较运算符的右边
  • 子查询中不要加 ORDER BY子句
  • 对单行子查询使用单行运算符(如=,>,<),也可以使用多行运算符
  • 对多行子查询使用多行运算符,IN,ANY,ALL属于多行运算符

(4)子查询易犯的错误

  • 用单行操作符,但是子查询返回多行
  • 内层查询中没有返回记录

(5)举例讲解

例子1:带有IN谓词的子查询

SELECT ENAME,DEPTNO,SAL 
FROM EMP 
WHERE SAL IN (
	SELECT MAX(SAL) 
	FROM EMP 
	GROUP BY DEPTNO);

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

SELECT ENAME,SAL 
FROM EMP 
WHERE SAL>(
	SELECT SAL 
	FROM EMP 
	WHERE ENAME='JONES');

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

语义为:

1.> ANY	大于子查询结果中的某个值       
2.> ALL	大于子查询结果中的所有值
3.< ANY	小于子查询结果中的某个值    
4.< ALL	小于子查询结果中的所有值
5.>= ANY	大于等于子查询结果中的某个值    
6.>= ALL	大于等于子查询结果中的所有值
7.<= ANY	小于等于子查询结果中的某个值    
8.<= ALL	小于等于子查询结果中的所有值
9.= ANY	等于子查询结果中的某个值        
10.=ALL	等于子查询结果中的所有值(通常没有实际意义)
11.!=(或<>)ANY	不等于子查询结果中的某个值
12.!=(或<>)ALL	不等于子查询结果中的任何一个值

总结:
在这里插入图片描述

例:查找工资低于任何工种为‘CLERK’,且不是‘CLERK’的员工姓名
已知有如下查询结果:
在这里插入图片描述
在这里插入图片描述

SELECT ENAME ,DEPTNO, JOB,SAL
FROM EMP
WHERE SAL< ANY (
	SELECT SAL 
	FROM EMP
	WHERE JOB ='CLERK')
AND JOB<>'CLERK';

结果为:
在这里插入图片描述

例子4:带有EXISTS谓词的子查询

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

  • 若内层查询结果非空,则外层的WHERE子句返回真值
  • 若内层查询结果为空,则外层的WHERE子句返回假值

由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义

NOT EXISTS谓词

  • 若内层查询结果非空,则外层的WHERE子句返回假值
  • 若内层查询结果为空,则外层的WHERE子句返回真值

查询所有有职称的医生

SELECT DOCTORNAME,DOCTORSEX,DOCTORSAL
FROM DOCTOR_INFORMATION
WHERE EXITS(
	SELECT *
	FROM DOCTOR_LEVEL
	WHERE DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

结果:
在这里插入图片描述

5.集合查询

(1)什么是集合查询?

集合操作的种类

  • 并操作UNION
  • 交操作INTERSECT
  • 差操作MINUS

参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同

(2)举例讲解

先有如下已经得到的查询结果:
在这里插入图片描述
在这里插入图片描述

例子1:并操作UNION

SELECT *
FROM EMP 
WHERE JOB='MANAGER'
UNION
SELECT * 
FROM EMP
WHERE DEPTNO='30';

在这里插入图片描述

例子2:交操作INTERSECT

SELECT *
FROM EMP 
WHERE JOB='MANAGER'
INTERSECT
SELECT * 
FROM EMP
WHERE DEPTNO='30';

在这里插入图片描述

例子3:差操作MINUS

SELECT *
FROM EMP 
WHERE JOB='MANAGER'
MINUS
SELECT * 
FROM EMP
WHERE DEPTNO='30';

在这里插入图片描述


总结

文章不妥之处请大家包涵指正
对于基础概念想要了解的读者,以下文章可以供大家参考:
SQL语言概述与SQL语言的数据定义

相关文章:

  • 建模杂谈系列162 APIFunc: 可靠的复杂函数开发3
  • nslookup命令的常见用法
  • 如果你也想在linux中删除指定行
  • 掩码和反掩码的使用场景
  • QT案例实战1 - 从零开始编写一个OCR工具软件 (3)创建项目
  • FFmpeg入门详解之68:FFmpeg4.3的开发环境搭建
  • CSS 单位解析
  • 【Windows无法修复问题】“启动修复”无法修复你的电脑解决方法
  • 短信验证码接口风险分析
  • SpringBoot 自定义注解异步记录复杂日志
  • 组件component二次开发属性暴露,跟渲染元素属性暴露类似,但主要是canvas画笔来绘制组件图形
  • 工作四年,分享50个让你代码更好的小建议
  • 商业智能BI的后端建模和前端建模有什么区别和联系?
  • 古中国的超级计算机——领跑全人类
  • Redis不同数据类型下的基础查询命令
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 4. 路由到控制器 - Laravel从零开始教程
  • Docker 笔记(2):Dockerfile
  • DOM的那些事
  • ESLint简单操作
  • iOS编译提示和导航提示
  • java中具有继承关系的类及其对象初始化顺序
  • JS基础之数据类型、对象、原型、原型链、继承
  • nodejs实现webservice问题总结
  • Python实现BT种子转化为磁力链接【实战】
  • Vue2.0 实现互斥
  • yii2权限控制rbac之rule详细讲解
  • 软件开发学习的5大技巧,你知道吗?
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​520就是要宠粉,你的心头书我买单
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $.ajax()方法详解
  • %check_box% in rails :coditions={:has_many , :through}
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)事件处理——(7)简单事件(Simple events)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (理论篇)httpmoudle和httphandler一览
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十八)SpringBoot之发送QQ邮件
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (原)Matlab的svmtrain和svmclassify
  • (原)本想说脏话,奈何已放下
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .NET 4.0中的泛型协变和反变
  • .net Application的目录
  • .NET CLR基本术语
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net core使用RPC方式进行高效的HTTP服务访问