[SQL] select LAST_NAME,JOB_ID,SALARY, case JOB_ID when 'IT_PROG' then SALARY*1.1 when 'ST_CLERK' then SALARY*1.15 when 'SA_REP' then SALARY*1.2 from employees; [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from employees' at line 7
时间: 2024-01-30 21:04:04 浏览: 26
在这个 SQL 语句中,case 表达式需要一个 else 子句来处理除了 IT_PROG、ST_CLERK 和 SA_REP 之外的 JOB_ID 值。如果没有 else 子句,那么当 JOB_ID 不等于这三个值时,就会出现语法错误。以下是修改后的 SQL 语句:
```
SELECT LAST_NAME, JOB_ID, SALARY,
CASE JOB_ID
WHEN 'IT_PROG' THEN SALARY * 1.1
WHEN 'ST_CLERK' THEN SALARY * 1.15
WHEN 'SA_REP' THEN SALARY * 1.2
ELSE SALARY
END
FROM employees;
```
这个 SQL 语句会根据 JOB_ID 的值,计算对应的工资涨幅,如果 JOB_ID 不是 IT_PROG、ST_CLERK 或 SA_REP,则工资不变。注意,case 表达式的语法是:
```
CASE expression
WHEN value_1 THEN result_1
WHEN value_2 THEN result_2
...
[ELSE result_default]
END
```
其中,expression 是一个表达式,value_1、value_2 等是要比较的值,result_1、result_2 等是对应的结果,ELSE 语句是可选的,用于处理未匹配到任何值的情况。
相关问题
选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary
以下是查询语句:
```
SELECT last_name, job_id, salary
FROM employees
WHERE salary > (SELECT MAX(salary) FROM employees WHERE job_id = 'SA_MAN')
```
这个查询语句中,外层的 SELECT 语句选择了员工的 last_name、job_id 和 salary,其中 salary 大于 JOB_ID 为 SA_MAN 的员工中最高工资的员工的工资。内层的 SELECT 语句选择了 JOB_ID 为 SA_MAN 的员工中工资最高的员工的工资。
select *, row_number()over(partition by id order by salary desc) ranking
这是一个使用`row_number()`函数和`over()`子句的SQL查询语句,用于在每个id分组中按照salary降序排列,并为每个分组中的行分配一个排名。下面是两个例子:
引用的例子:
```sql
with t as (
select *, row_number() over(partition by id order by salary desc) ranking
from tmp_learning_mary
)
select * from t where ranking = 1;
```
这个例子使用了一个公共表表达式(CTE)`t`,在其中使用`row_number()`函数为每个id分组中的行分配了一个排名。然后,查询选择了排名为1的行,即每个分组中的最高薪水行。
引用的例子:
```sql
select * from (
select *, row_number() over(partition by id order by rand()) ranking
from tmp_learning_mary
) t where t.ranking = 1;
```
这个例子与引用的例子类似,只是在`order by`子句中使用了`rand()`函数,它会随机排序每个分组中的行。然后,查询选择了排名为1的行,即每个分组中的随机行。