关系型数据库管理系统: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');
子查询:和套娃有点类似,子查询看作是一个字段或者一个临时表嵌套在查询中,就是嵌套在查询中的查询,执行顺序由内到外,一层一层执行。
子查询类型 | 结果集 | 使用位置 |
---|---|---|
标量子查询 | 一行一列(一个数据) | SELECT 或 WHERE 后面 |
列子查询 | 一列多行(一列数据) | WHERE 后面 |
行子查询 | 一行多列(一行多个字段对应数据) | WHERE 后面 |
操作符包括: >、<、>=、<=、=、<>、!=
关键字 | 作用 |
---|---|
(NOT)IN | 查询某个范围内的数据 |
ANY 或SOME | 和任意一个数据比较 |
ALL | 和所有数据比较 |
操作符号可以搭配 ANY 或者ALL 使用,比如,> ANY()指的是大于范围任意一个值即可;< ALL()指的是小于范围内所有值。
在了解子查询分类和关键字后再结合实例对子查询进行更深入的认识。
概念:将返回的一个数据 (一行一列)作为判断条件进行查询。
--基本语法
SELECT * FROM 表 WHERE 判断条件 (标量子查询);
SELECT 字段名,(标量子查询) FROM 表 WHERE 判断条件 ;
--第一步,首先查询出韩信的胜率(作为子查询)。
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; -- 按胜率排序
查询结果如下:
SELECT * FROM HERO_TBL
WHERE WIN_RATE >
(SELECT WIN_RATE FROM HERO_TBL
WHERE H_NAME = '韩信')
AND POSITION = '射手';
-- 第一步查询最高的战斗力
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 * FROM 表 WHERE 判断条件 (列子查询);
-- 第一步查询战斗力为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 * FROM 表 WHERE (构造行)= (行子查询);
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 = '射手';
-- 两种形式返回结果相同。