@(一只心中无码的程序员)专栏程序员
- ~
题目描述
对于employees表中,给出奇数行的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
));函数
首先题目的叙述有问题,致使理解有误,输出的数据与参考答案不一样。先给出正确的题目叙述:【对于employees表,在对first_name进行排名后,选出奇数排名对应的first_name】。 一、本题用到了三层 SELECT 查询,为了便于理解,采用缩进方式分层,且最外层对应e1,最内层对应e3; 二、在e3层中,采用 COUNT() 函数对 e2.first_name 进行排名标号,即在给定 e2.first_name的状况下,不大于 e2.first_name 的 e3.first_name 的个数有多少,该个数恰好与 e2.first_name 的排名标号匹配,且将该值命名为 rowid; /*注意:排名标号后并未排序,即[Bob, Carter, Amy]的排名是[2,3,1],选取奇数排名后输出[Carter, Amy],因此可见参考答案中的first_name并未按字母大小排序*/ 三、在e1层中,直接在限定条件 e1.rowid % 2 = 1 下,表明奇数行的 rowid,选取对应的 e1.first_name; 四、e2层则至关于链接e1层(选取表示层)与e3层(标号层)的桥梁。 SELECT e1.first_name FROM (SELECT e2.first_name, (SELECT COUNT(*) FROM employees AS e3 WHERE e3.first_name <= e2.first_name) AS rowid FROM employees AS e2) AS e1 WHERE e1.rowid % 2 = 1