我能知道相关子查询是什么意思吗?
Can I know what correlated sub-queries mean?
我有一个名为 sql_hr
的数据库,其中有一个 table employees
。
下面是一个 .sql 文件的内容,该文件创建 sql_hr
数据库,其中包含 table employees
:
DROP DATABASE IF EXISTS `sql_hr`;
CREATE DATABASE `sql_hr`;
USE `sql_hr`;
CREATE TABLE `employees` (
`employee_id` int(11) NOT NULL,
`first_name` varchar(50) NOT NULL,
`last_name` varchar(50) NOT NULL,
`job_title` varchar(50) NOT NULL,
`salary` int(11) NOT NULL,
`reports_to` int(11) DEFAULT NULL,
`office_id` int(11) NOT NULL,
PRIMARY KEY (`employee_id`),
KEY `fk_employees_offices_idx` (`office_id`),
KEY `fk_employees_employees_idx` (`reports_to`),
CONSTRAINT `fk_employees_managers` FOREIGN KEY (`reports_to`) REFERENCES `employees` (`employee_id`),
CONSTRAINT `fk_employees_offices` FOREIGN KEY (`office_id`) REFERENCES `offices` (`office_id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `employees` VALUES (37270,'Yovonnda','Magrannell','Executive Secretary',63996,NULL,10);
INSERT INTO `employees` VALUES (33391,'D\'arcy','Nortunen','Account Executive',62871,37270,1);
INSERT INTO `employees` VALUES (37851,'Sayer','Matterson','Statistician III',98926,37270,1);
INSERT INTO `employees` VALUES (40448,'Mindy','Crissil','Staff Scientist',94860,37270,1);
INSERT INTO `employees` VALUES (56274,'Keriann','Alloisi','VP Marketing',110150,37270,1);
INSERT INTO `employees` VALUES (63196,'Alaster','Scutchin','Assistant Professor',32179,37270,2);
INSERT INTO `employees` VALUES (67009,'North','de Clerc','VP Product Management',114257,37270,2);
INSERT INTO `employees` VALUES (67370,'Elladine','Rising','Social Worker',96767,37270,2);
INSERT INTO `employees` VALUES (68249,'Nisse','Voysey','Financial Advisor',52832,37270,2);
INSERT INTO `employees` VALUES (72540,'Guthrey','Iacopetti','Office Assistant I',117690,37270,3);
INSERT INTO `employees` VALUES (72913,'Kass','Hefferan','Computer Systems Analyst IV',96401,37270,3);
INSERT INTO `employees` VALUES (75900,'Virge','Goodrum','Information Systems Manager',54578,37270,3);
INSERT INTO `employees` VALUES (76196,'Mirilla','Janowski','Cost Accountant',119241,37270,3);
INSERT INTO `employees` VALUES (80529,'Lynde','Aronson','Junior Executive',77182,37270,4);
INSERT INTO `employees` VALUES (80679,'Mildrid','Sokale','Geologist II',67987,37270,4);
INSERT INTO `employees` VALUES (84791,'Hazel','Tarbert','General Manager',93760,37270,4);
INSERT INTO `employees` VALUES (95213,'Cole','Kesterton','Pharmacist',86119,37270,4);
INSERT INTO `employees` VALUES (96513,'Theresa','Binney','Food Chemist',47354,37270,5);
INSERT INTO `employees` VALUES (98374,'Estrellita','Daleman','Staff Accountant IV',70187,37270,5);
INSERT INTO `employees` VALUES (115357,'Ivy','Fearey','Structural Engineer',92710,37270,5);
好的,现在显示 table employees
:
USE sql_hr;
SELECT * FROM employees;
我想向 return 仅针对具有相同 office_id
的每组员工中的一些客户编写查询,基于这些客户的标准应该比所有员工的平均工资多 salary
具有特定 office_id.
的客户
现在,我想分享两个查询 (1) 和 (2),其中输出已在查询后显示:
(1):
SELECT
employee_id,
first_name,
salary
FROM employees e
WHERE salary> (
SELECT AVG(salary)
FROM employees
WHERE office_id= e.office_id);
(2):
SELECT
employee_id,
first_name,
salary
FROM employees
WHERE salary> ALL(
SELECT AVG(salary)
FROM employees
GROUP BY office_id);
我认为以上两个查询的意思相同。但事实证明,查询(1)根据问题是正确的,但不是(2)。为什么查询 (2) 与查询 (1) 不同?
第一个查询 returns 工资高于其所属 office_id
平均工资的员工。
这是此条件的作用:
WHERE salary> (
SELECT AVG(salary)
FROM employees
WHERE office_id= e.office_id);
第二个查询returns薪水大于所有平均薪水的员工意思:薪水大于最大平均的员工office_id
s.
这是条件:
WHERE salary> ALL(
SELECT AVG(salary)
FROM employees
GROUP BY office_id);
子查询:
SELECT AVG(salary)
FROM employees
GROUP BY office_id
returns 所有 office_id
的所有平均值。
因此,当您希望薪水大于所有薪水时,您的意思是 大于所有薪水的最大值 .
我有一个名为 sql_hr
的数据库,其中有一个 table employees
。
下面是一个 .sql 文件的内容,该文件创建 sql_hr
数据库,其中包含 table employees
:
DROP DATABASE IF EXISTS `sql_hr`;
CREATE DATABASE `sql_hr`;
USE `sql_hr`;
CREATE TABLE `employees` (
`employee_id` int(11) NOT NULL,
`first_name` varchar(50) NOT NULL,
`last_name` varchar(50) NOT NULL,
`job_title` varchar(50) NOT NULL,
`salary` int(11) NOT NULL,
`reports_to` int(11) DEFAULT NULL,
`office_id` int(11) NOT NULL,
PRIMARY KEY (`employee_id`),
KEY `fk_employees_offices_idx` (`office_id`),
KEY `fk_employees_employees_idx` (`reports_to`),
CONSTRAINT `fk_employees_managers` FOREIGN KEY (`reports_to`) REFERENCES `employees` (`employee_id`),
CONSTRAINT `fk_employees_offices` FOREIGN KEY (`office_id`) REFERENCES `offices` (`office_id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `employees` VALUES (37270,'Yovonnda','Magrannell','Executive Secretary',63996,NULL,10);
INSERT INTO `employees` VALUES (33391,'D\'arcy','Nortunen','Account Executive',62871,37270,1);
INSERT INTO `employees` VALUES (37851,'Sayer','Matterson','Statistician III',98926,37270,1);
INSERT INTO `employees` VALUES (40448,'Mindy','Crissil','Staff Scientist',94860,37270,1);
INSERT INTO `employees` VALUES (56274,'Keriann','Alloisi','VP Marketing',110150,37270,1);
INSERT INTO `employees` VALUES (63196,'Alaster','Scutchin','Assistant Professor',32179,37270,2);
INSERT INTO `employees` VALUES (67009,'North','de Clerc','VP Product Management',114257,37270,2);
INSERT INTO `employees` VALUES (67370,'Elladine','Rising','Social Worker',96767,37270,2);
INSERT INTO `employees` VALUES (68249,'Nisse','Voysey','Financial Advisor',52832,37270,2);
INSERT INTO `employees` VALUES (72540,'Guthrey','Iacopetti','Office Assistant I',117690,37270,3);
INSERT INTO `employees` VALUES (72913,'Kass','Hefferan','Computer Systems Analyst IV',96401,37270,3);
INSERT INTO `employees` VALUES (75900,'Virge','Goodrum','Information Systems Manager',54578,37270,3);
INSERT INTO `employees` VALUES (76196,'Mirilla','Janowski','Cost Accountant',119241,37270,3);
INSERT INTO `employees` VALUES (80529,'Lynde','Aronson','Junior Executive',77182,37270,4);
INSERT INTO `employees` VALUES (80679,'Mildrid','Sokale','Geologist II',67987,37270,4);
INSERT INTO `employees` VALUES (84791,'Hazel','Tarbert','General Manager',93760,37270,4);
INSERT INTO `employees` VALUES (95213,'Cole','Kesterton','Pharmacist',86119,37270,4);
INSERT INTO `employees` VALUES (96513,'Theresa','Binney','Food Chemist',47354,37270,5);
INSERT INTO `employees` VALUES (98374,'Estrellita','Daleman','Staff Accountant IV',70187,37270,5);
INSERT INTO `employees` VALUES (115357,'Ivy','Fearey','Structural Engineer',92710,37270,5);
好的,现在显示 table employees
:
USE sql_hr;
SELECT * FROM employees;
我想向 return 仅针对具有相同 office_id
的每组员工中的一些客户编写查询,基于这些客户的标准应该比所有员工的平均工资多 salary
具有特定 office_id.
的客户
现在,我想分享两个查询 (1) 和 (2),其中输出已在查询后显示:
(1):
SELECT
employee_id,
first_name,
salary
FROM employees e
WHERE salary> (
SELECT AVG(salary)
FROM employees
WHERE office_id= e.office_id);
(2):
SELECT
employee_id,
first_name,
salary
FROM employees
WHERE salary> ALL(
SELECT AVG(salary)
FROM employees
GROUP BY office_id);
我认为以上两个查询的意思相同。但事实证明,查询(1)根据问题是正确的,但不是(2)。为什么查询 (2) 与查询 (1) 不同?
第一个查询 returns 工资高于其所属 office_id
平均工资的员工。
这是此条件的作用:
WHERE salary> (
SELECT AVG(salary)
FROM employees
WHERE office_id= e.office_id);
第二个查询returns薪水大于所有平均薪水的员工意思:薪水大于最大平均的员工office_id
s.
这是条件:
WHERE salary> ALL(
SELECT AVG(salary)
FROM employees
GROUP BY office_id);
子查询:
SELECT AVG(salary)
FROM employees
GROUP BY office_id
returns 所有 office_id
的所有平均值。
因此,当您希望薪水大于所有薪水时,您的意思是 大于所有薪水的最大值 .