• SQL语言---数据的查询



    前言

    本文主要讲解了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语言的数据定义

  • 相关阅读:
    torch.sum()——dim参数
    易基因|TSD物种全基因组DNA甲基化模式对孵育性别和过去孵育温度的响应 | 性别决定
    简易版的进程池
    使用分层实现业务处理
    这几个Python装逼神器一定要收藏好
    由于网络问题,导致Git Bash中输入命令:git push origin master,屡屡报出各种错误。
    Docker+jenkinsPipeline运行实现python自动化测试(超详细)
    Redis分布式锁
    Nodejs教程之让我们用 typescript 创建你的第一个 expressjs 应用程序
    Bug记录
  • 原文地址:https://blog.csdn.net/weixin_52042488/article/details/127095812