美文网首页
sql错题 聚合函数使用问题

sql错题 聚合函数使用问题

作者: yannanoo | 来源:发表于2021-08-07 11:54 被阅读0次

    描述

    有一个员工表employees简况如下:

    image

    有一个薪水表salaries简况如下:

    image

    请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:

    (温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)

    image

    示例1

    输入:

    <pre data-v-94fd4448="" style="margin: 0px 12px 0px 0px; padding: 0px; font-weight: 400; font-size: 14px; position: relative; border: none; background: initial; word-break: break-word; font-family: Courier, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: break-word;">drop table if exists employees ;
    drop table if exists salaries ;
    CREATE TABLE employees (
    emp_no int(11) NOT NULL,
    birth_date date NOT NULL,
    first_name varchar(14) NOT NULL,
    last_name varchar(16) NOT NULL,
    gender char(1) NOT NULL,
    hire_date date NOT NULL,
    PRIMARY KEY (emp_no));
    CREATE TABLE salaries (
    emp_no int(11) NOT NULL,
    salary int(11) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,from_date));
    INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
    INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
    INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
    INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');
    INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
    INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
    INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
    INSERT INTO salaries VALUES(10004,74057,'2001-11-27','9999-01-01');</pre>

    我的错误答案们

    one

    select s.emp_no,s.salary,e.last_name,e.first_name
    from salaries s
    inner join employees e
    on s.emp_no = e.emp_no
    where s.salary < max(s.salary) limit 1,1

    two

    select s.emp_no,max(s.salary),e.last_name,e.first_name
    from salaries s
    inner join employees e
    on s.emp_no = e.emp_no
    where s.salary < max(s.salary)

    three

    select s.emp_no,max(s.salary),e.last_name,e.first_name
    from salaries s
    inner join employees e
    on s.emp_no = e.emp_no
    where s.salary < (select max(s.salary) from salaries)

    问题:

    https://blog.csdn.net/win7system/article/details/77972577

    一般在书写sql的是时候很多时候会误将聚合函数放到where后面作为条件查询,事实证明这样是无法执行的,执行会报【此处不允许使用聚合函数】异常。为什么会报异常呢?其原因很简单:

    • where后不放聚合函数, where 子句的作用是在对查询结果进行分组[前],将不符合where条件的行去掉,即在分组之前过滤数据,[条件中不能包含聚组函数],使用where条件显示特定的行。
    • having后可以放聚合函数, having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

    聚合函数只能在以下位置作为表达式使用:

    [select 语句的选择列表(子查询或外部查询)];
    compute 或 compute by 子句;
    having 子句;

    正确答案:
    SELECT e.emp_no, s.salary, e.last_name, e.first_name
    FROM employees AS e
    INNER JOIN salaries AS s
    ON e.emp_no=s.emp_no
    WHERE salary=(SELECT max(salary)
    FROM salaries
    WHERE salary<(SELECT MAX(salary)
    FROM salaries));

    reference:
    https://www.nowcoder.com/practice/c1472daba75d4635b7f8540b837cc719?tpId=82&tags=&title=&difficulty=0&judgeStatus=0&rp=1

    相关文章

      网友评论

          本文标题:sql错题 聚合函数使用问题

          本文链接:https://www.haomeiwen.com/subject/kmgwvltx.html