Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中,使用某种for循环进行选择是错误的方法吗?_Mysql_Sql - Fatal编程技术网

Mysql 在SQL中,使用某种for循环进行选择是错误的方法吗?

Mysql 在SQL中,使用某种for循环进行选择是错误的方法吗?,mysql,sql,Mysql,Sql,对于每个部门,我试图找到一个部门中所有讲师的最高工资,然后返回一个表,其中包含工资最高的讲师的姓名、他们的工资以及每个部门的部门名称。每个部门至少应有一名讲师 到目前为止,我所做的是: SELECT name, salary, dept_name FROM instructor WHERE salary in (SELECT MAX(salary) FROM dept_name); 这是错误的,但我不知道如何纠正它。我是SQL新手,但如果这是另一种编程语言,我可能会这样做: for

对于每个部门,我试图找到一个部门中所有讲师的最高工资,然后返回一个表,其中包含工资最高的讲师的姓名、他们的工资以及每个部门的部门名称。每个部门至少应有一名讲师

到目前为止,我所做的是:

SELECT name, salary, dept_name FROM instructor WHERE salary in 
    (SELECT MAX(salary) FROM dept_name);
这是错误的,但我不知道如何纠正它。我是SQL新手,但如果这是另一种编程语言,我可能会这样做:

for each department:
   for each instructor in the department:
       return max salary
但我不确定这是否正确

以下是我所有的mysql代码:

CREATE TABLE department(
    dept_name VARCHAR(100) NOT NULL,
    building VARCHAR(100) NOT NULL,
    budget DECIMAL(10, 2) UNSIGNED,
    PRIMARY KEY(dept_name)
    );

CREATE TABLE instructor(
    ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    dept_name VARCHAR(100) NOT NULL,
    salary DECIMAL(10, 2) UNSIGNED NOT NULL,
    PRIMARY KEY (ID),
    FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );

insert into instructor values ('10101', 'Srinivasan', 'Comp. Sci.', '65000');
insert into instructor values ('12121', 'Wu', 'Finance', '90000');
insert into instructor values ('15151', 'Mozart', 'Music', '40000');
insert into instructor values ('22222', 'Einstein', 'Physics', '95000');
insert into instructor values ('32343', 'El Said', 'History', '60000');
insert into instructor values ('33456', 'Gold', 'Physics', '87000');
insert into instructor values ('45565', 'Katz', 'Comp. Sci.', '75000');
insert into instructor values ('58583', 'Califieri', 'History', '62000');
insert into instructor values ('76543', 'Singh', 'Finance', '80000');
insert into instructor values ('76766', 'Crick', 'Biology', '72000');
insert into instructor values ('83821', 'Brandt', 'Comp. Sci.', '92000');
insert into instructor values ('98345', 'Kim', 'Elec. Eng.', '80000');

insert into department values ('Biology', 'Watson', '90000');
insert into department values ('Comp. Sci.', 'Taylor', '100000');
insert into department values ('Elec. Eng.', 'Taylor', '85000');
insert into department values ('Finance', 'Painter', '120000');
insert into department values ('History', 'Painter', '50000');
insert into department values ('Music', 'Packard', '80000');
insert into department values ('Physics', 'Watson', '70000');
这是使用SQL 5.6版,cte作为选择名称, 薪水 部门名称, 按部门划分的排名\u按薪资说明排序 来自讲师 选择名称、薪资、部门名称 来自cte 其中rnk=1; 如果不止一位讲师在部门内拥有相同的最高工资,则所有讲师都将被退回。如果您需要其中一个,请使用ROW_编号。如果您还需要一个确定-更新排序表达式


你能解释一下你是怎么做到的吗

秩函数按降薪顺序分别枚举每个部门内的行,即薪资最高的行获得数字1,如果某些行具有相同的薪资,则它们获得相同的数字。在主查询中,仅选择编号为1的行

对于MySQL 5.x,您可以使用

选择t1.name、t1.salary、t1.dept\u name 来自t1讲师 加入选择MAXsalary薪资,部门名称 来自讲师 使用薪资、部门名称按部门名称t2分组;
一般来说,某种循环可能是解决MySQL问题的错误方法

对于MySQL的旧版本,使用Akina的小提琴


顺便说一句,这是这个标签下最常见的问题。还有很多正确答案。

你能解释一下你是怎么做到的吗?而且,这似乎不适用于mySQL的旧版本。有没有一种方法可以用语法来表示这个问题,这样它也可以与旧版本兼容?请不要编辑这个问题来添加不必要的信息。您已经说过,每个部门至少有一名讲师,因此在本例中,部门表是冗余的。因此,在本例中,部门表是冗余的。讲师表已FK到部门。OP似乎害怕删除FK和不必要的表。。
SELECT a.* 
  FROM instructor a
  JOIN 
     ( SELECT MAX(salary) salary
            , dept_name
         FROM instructor
        GROUP
           BY dept_name
     ) b
    ON b.salary = a.salary
   AND b.dept_name = a.dept_name;