数据库sql实战
SQL1 查找最晚入职员工的所有信息
SQL2 查找入职员工时间排名倒数第三的员工所有信息
SQL3 查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no
SQL4 查找所有已经分配部门的员工的last_name和first_name
SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no
SQL6 查找所有员工入职时候的薪水情况
SQL7 查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t
SQL61 对于employees表中,输出first_name排名(按first_name升序排序)为奇数的first_name
题目描述:
对于employees表中,输出first_name排名(按first_name升序排序)为奇数的first_name
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
));
如,输入为:
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(10005,‘1955-01-21’,‘Kyoichi’,‘Maliniak’,‘M’,‘1989-09-12’);
INSERT INTO employees VALUES(10006,‘1953-04-20’,‘Anneke’,‘Preusig’,‘F’,‘1989-06-02’);
输出格式:
fIrst_name |
---|
Georgi |
Anneke |
题解:
SELECT E1.first_name FROM EMPLOYEES E1
WHERE (
SELECT count(*) FROM EMPLOYEES E2
WHERE E2.first_name <= E1.first_name) % 2 =1
解题思路:
1.首先按照first_name字段进行升序排序,得到排序的序号
2.按照各自的first_name进行排序后的序号进行筛选出序号为奇数的记录行
疑难分析:
主要就是要理解清楚 E2.first_name <= E1.first_name条件语句,该语句的比较主要就是根据ASCII编码来进行大小比较的。
ex:‘a’ > ‘b’ ,表面上看不出谁大谁小,那怎么比较的呢?其实字符串内部是通过转换成 ascii 编码来进行大小比较的。
所以,回到本题,也是同样的比较方式。
图解分析:
补充说明:(额外的两种解法)
#### 解法2
SELECT t1.first_name FROM (SELECT @rownum:=@rownum + 1 AS rownum, first_name
FROM employees_61, (SELECT @rownum:=0 ) t
ORDER BY first_name) t1
WHERE MOD(t1.rownum,2) = 1
#### 解法3
SELECT e.first_name FROM employees e JOIN (
SELECT first_name, row_number() over (ORDER BY first_name) AS n
FROM employees) a
ON e.first_name=a.first_name
WHERE n%2=1