概述
1、平台和版本
- DB2 11.5
- Oracle Database 19c
- PostgreSQL 12
- SQL Server 2017
- MySQL 8.0
2、使用的表
emp表:
sql
CREATE TABLE `emp` (
EMPNO INT(10) PRIMARY KEY,
ENAME VARCHAR(20) NOT NULL,
JOB VARCHAR(20) NOT NULL,
MGR INT(10),
HIREDATE VARCHAR(20) NOT NULL,
SAL INT(10),
COMM INT(10),
DEPTNO INT(10)
);
INSERT INTO `emp` VALUES
(7369, 'SMITH', 'CLERK', 7902, '17-DEC-2005', 800, NULL, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-FEB-2006', 1600, 300, 30),
(7521, 'WARD', 'SALESMAN', 7698, '22-FEB-2006', 1250, 500, 30),
(7566, 'JONES', 'MANAGER', 7839, '02-APR-2006', 2975, NULL, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-SEP-2006', 1250, 1400, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '01-MAY-2006', 2850, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '09-JUN-2006', 2450, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-2007', 3000, NULL, 20),
(7839, 'KING', 'PRESIDENT', NULL, '17-NOV-2006', 5000, NULL, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '08-SEP-2006', 1500, 0, 30),
(7876, 'ADAMS', 'CLERK', 7788, '12-JAN-2008', 1100, NULL, 20),
(7900, 'JAMES', 'CLERK', 7698, '03-DEC-2006', 950, NULL, 30),
(7902, 'FORD', 'ANALYST', 7566, '03-DEC-2006', 3000, NULL, 20),
(7934, 'MILLER', 'CLERK', 7782, '23-JAN-2007', 1300, NULL, 10);
dept表:
sql
CREATE TABLE `dept`(
DEPTNO INT(10) PRIMARY KEY,
DNAME VARCHAR(20) NOT NULL,
LOC VARCHAR(20) NOT NULL
);
INSERT INTO `dept` VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(40, 'OPERATIONS', 'BOSTON');
还使用了 4 张透视表(pivot table),即 T1、T10、T100 和 T500。由于这些表只用于简化转置工作,因此本书并未给它们指定意义深远的名称。在每张透视表的名称中,T 后面的数字指出了表中包含的行数。
sql
CREATE TABLE `t1` (
ID INT(10) PRIMARY KEY
);
CREATE TABLE `t10` (
ID INT(10) PRIMARY KEY
);
CREATE TABLE `t100` (
ID INT(10) PRIMARY KEY
);
CREATE TABLE `t500` (
ID INT(10) PRIMARY KEY
);
DROP PROCEDURE IF EXISTS insert_id;
DELIMITER $$
CREATE PROCEDURE insert_id (
IN max_id INT
)
BEGIN
DECLARE v_current INT;
SELECT 1 INTO v_current;
WHILE v_current <= max_id DO
INSERT INTO t500 (ID) VALUES (v_current);
SET v_current = v_current + 1;
END WHILE;
END
$$
DELIMITER ;
CALL insert_id(500);
在你需要创建一系列行以简化查询编写工作时,透视表提供了极大的便利。
另外,有些厂商支持不完整的 SELECT 语句,例如,你可以编写不包含 FROM 子句的 SELECT 语句。在本书有些地方,为清晰起见,会使用只包含一行数据的支持表T1,而不使用不完整的查询。T1 表的用途与 Oracle 的DUAL 表类似,但 T1 表可以让解决方案标准化。