SQL入门教程(十):高级查询之子查询

SQL入门教程(十):子查询

  • 前言
    • 数据准备
  • 子查询概念
    • 定义
  • 子查询类别及使用
    • 子查询按结果集分类及使用位置
    • 子查询中常用操作符与关键字
    • 子查询的使用
      • 标量子查询
        • 案例1
        • 案例2
        • 案例3
      • 列子查询
        • 案例
      • 行子查询
        • 案例

前言

关系型数据库管理系统:MySQL8.0

数据库管理工具:Navicat Premium 12

数据准备

下面,为了更好后续范例操作,我们先自己构建几个数据表。

提前声明一下,表设计可能不太合理,见谅,便于理解用法就好。

--创建英雄表
CREATE TABLE HERO_TBL(
ID VARCHAR(10) NOT NULL,
H_NAME VARCHAR(15) NOT NULL,
POSITION VARCHAR(10) NULL,
WIN_RATE FLOAT(4,2) NULL,
CONSTRAINT H_PK PRIMARY KEY(ID)
);

--创建英雄信息表
CREATE TABLE HERO_INFO_TBL(
ID VARCHAR(10) NOT NULL,
H_CE INT(10) NULL,
OUT_MODE VARCHAR(10) NULL,
DIFFICULT VARCHAR(10) NULL,
CONSTRAINT INFO_PK PRIMARY KEY(ID)
);

--向英雄表中插入数据
INSERT INTO HERO_TBL 
VALUES('001','韩信','刺客',49.24);
INSERT INTO HERO_TBL 
VALUES('002','公孙离','射手',43.44);
INSERT INTO HERO_TBL 
VALUES('003','张飞','辅助',49.99);
INSERT INTO HERO_TBL 
VALUES('004','鲁班大师','辅助',49.22);
INSERT INTO HERO_TBL 
VALUES('005','露娜','刺客',48.09);
INSERT INTO HERO_TBL 
VALUES('006','后羿','射手',53.69);
INSERT INTO HERO_TBL 
VALUES('007','王昭君','法师',51.82);
INSERT INTO HERO_TBL 
VALUES('008','武则天','法师',53.13);
INSERT INTO HERO_TBL 
VALUES('009','黄忠','射手',52.10);

--向英雄信息表中插入数据
INSERT INTO HERO_INFO_TBL
VALUES('001',3500,'物理','9');
INSERT INTO HERO_INFO_TBL
VALUES('002',5000,'物理','10');
INSERT INTO HERO_INFO_TBL
VALUES('003',2000,'物理','3');
INSERT INTO HERO_INFO_TBL
VALUES('004',2500,'物理','8');
INSERT INTO HERO_INFO_TBL 
VALUES('005',4200,'魔法','8');
INSERT INTO HERO_INFO_TBL 
VALUES('006',3800,'物理','4');
INSERT INTO HERO_INFO_TBL
VALUES('007',4000,'魔法','5');
INSERT INTO HERO_INFO_TBL 
VALUES('008',4100,'魔法','6');
INSERT INTO HERO_INFO_TBL 
VALUES('009',4800,'物理','7');

表格如下:
SQL入门教程(十):高级查询之子查询_第1张图片

子查询概念

定义

子查询:和套娃有点类似,子查询看作是一个字段或者一个临时表嵌套在查询中,就是嵌套在查询中的查询,执行顺序由内到外,一层一层执行。

结合下图理解嵌套查询:
SQL入门教程(十):高级查询之子查询_第2张图片

子查询类别及使用

子查询按结果集分类及使用位置

子查询类型 结果集 使用位置
标量子查询 一行一列(一个数据) SELECT 或 WHERE 后面
列子查询 一列多行(一列数据) WHERE 后面
行子查询 一行多列(一行多个字段对应数据) WHERE 后面

子查询中常用操作符与关键字

操作符包括: >、<、>=、<=、=、<>、!=

关键字 作用
(NOT)IN 查询某个范围内的数据
ANY 或SOME 和任意一个数据比较
ALL 和所有数据比较

操作符号可以搭配 ANY 或者ALL 使用,比如,> ANY()指的是大于范围任意一个值即可;< ALL()指的是小于范围内所有值。

子查询的使用

在了解子查询分类和关键字后再结合实例对子查询进行更深入的认识。

标量子查询

概念:将返回的一个数据 (一行一列)作为判断条件进行查询。

--基本语法
SELECT * FROMWHERE 判断条件 (标量子查询);
SELECT 字段名,(标量子查询) FROMWHERE 判断条件 ;

案例1

  • 查询出比’韩信’胜率高的英雄的信息。
--第一步,首先查询出韩信的胜率(作为子查询)。
SELECT WIN_RATE FROM HERO_TBL
WHERE H_NAME = '韩信';

--第二步,查询比韩信的胜率高的英雄信息信息(按胜率排序)
SELECT * FROM HERO_TBL
WHERE WIN_RATE > (
	 SELECT WIN_RATE FROM HERO_TBL     -- 这里的条件就是第一步中的查询。
	 WHERE H_NAME = '韩信'
)
ORDER BY WIN_RATE;   -- 按胜率排序

查询结果如下:

SQL入门教程(十):高级查询之子查询_第3张图片

案例2

  • 查询出比’韩信’胜率高的且定位为射手的英雄的信息。
SELECT * FROM HERO_TBL
WHERE WIN_RATE > 
	 (SELECT WIN_RATE FROM HERO_TBL     
	 WHERE H_NAME = '韩信') 
AND POSITION = '射手';

案例3

  • 查询出战斗力最高英雄的信息。
-- 第一步查询最高的战斗力
SELECT MAX(H_CE) FROM HERO_INFO_TBL;

-- 第二部查询最高战力的ID
SELECT ID FROM HERO_INFO_TBL
WHERE H_CE = (
	SELECT MAX(H_CE) FROM HERO_INFO_TBL
	);
	
-- 第三步查询该ID的英雄信息
SELECT * FROM HERO_TBL
WHERE ID = (
	SELECT ID FROM HERO_INFO_TBL
		WHERE H_CE = (
			SELECT MAX(H_CE) FROM HERO_INFO_TBL
	));

返回结果如下:
在这里插入图片描述

列子查询

概念:将返回的一列数据 (一列多行)作为判断条件进行查询。

--基本语法 判断条件为 IN 、操作符+关键字
SELECT * FROMWHERE 判断条件 (列子查询);

案例

  • 查询战斗力为3800或4000的英雄的信息
-- 第一步查询战斗力为3800或4000的ID
SELECT ID FROM HERO_INFO_TBL
WHERE H_CE IN (3800,4000);

--第二步查询该ID的英雄信息
SELECT * FROM HERO_TBL
WHERE ID IN (
	SELECT ID FROM HERO_INFO_TBL
		WHERE H_CE IN (3800,4000)
)

返回结果如下:
在这里插入图片描述

行子查询

概念:将返回的一行指定字段的数据 (一行多列)作为判断条件进行查询。

SELECT * FROMWHERE (构造行)= (行子查询);

案例

  • 查询定位为射手且胜率最高英雄的信息
SELECT * FROM HERO_TBL
WHERE (WIN_RATE,POSITION)=(             --构建行元素
    SELECT MAX(WIN_RATE),'射手'
    FROM HERO_TBL);

--下面是另外一种形式(属于列子查询)
SELECT * FROM HERO_TBL
WHERE WIN_RATE = (
	SELECT MAX(WIN_RATE) FROM HERO_TBL)
AND
	POSITION = '射手';
	
-- 两种形式返回结果相同。

你可能感兴趣的:(SQL入门教程系列,mysql,sql,数据库)