Oracle 复杂查询(1)
一、复杂查询
1、 列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。
1、确定所需要的数据表:
emp表:可以查询出员工的数量;
dept表:部门名称;
emp表:统计信息;
2、确定已知的关联字段:
emp.deptno=dept.deptno;
第一步:找出至少有一个员工的部门编号
SELECT deptno,COUNT(empno)FROM empGROUP BY deptnoHAVING COUNT(empno)>1;
第二步:找到部门名称,肯定使用部门表,因为现在的数据量较小,所以可以将之前的emp表和dept表两个进行连接,统一采用多字段分组的方式查询;
SELECT d.deptno,d.dname,COUNT(e.empno)FROM emp e,dept dWHERE e.deptno=d.deptno(+)GROUP BY d.deptno,d.dnameHAVING COUNT(e.empno)>1;
第三步:依然需要继续统计
SELECT d.deptno,d.dname,COUNT(e.empno),AVG(sal),MIN(sal),MAX(sal)FROM emp e,dept dWHERE e.deptno=d.deptno(+)GROUP BY d.deptno,d.dnameHAVING COUNT(e.empno)>1;
2、 列出薪金比“SMITH”或“ALLEN”多的所有员工的编号、姓名、部门名称、其领导姓名。
1、确定所需要的数据表:
emp表:查询出“SMITH”或“ALLEN”工资;
emp表:最终的显示需要编号、姓名;
emp表:领导的姓名,自身关联;
dept表:部门名称;
2、确定已知的关联字段:
雇员和领导:emp.mgr=memp.empno;
雇员和部门:emp.deptno=dept.deptno;
第一步:找出“SMITH”或“ALLEN”的工资
SELECT sal FROM emp WHERE ename IN('SMITH','ALLEN');
第二步:以上的查询返回的多行单列的记录,按照子查询的要求在WHERE子句中写合适,所以这个时候将上面的查询作为一个子查询出现,继续查询符合此要求的员工的编号、姓名。 SELECT e.empno,e.enameFROM emp eWHERE e.sal>ALL( SELECT sal FROM emp WHERE ename IN('SMITH','ALLEN')); 第三步:查询出部门的名称,引入部门表,同时增加消除笛卡尔积的条件 SELECT e.empno,e.ename,d.dnameFROM emp e,dept dWHERE e.sal>ALL( SELECT sal FROM emp WHERE ename IN('SMITH','ALLEN')) AND e.deptno=d.deptno; 第四步:领导的信息需要emp表自身关联 SELECT e.empno,e.ename,d.dname,m.enameFROM emp e,dept d,emp mWHERE e.sal>ALL( SELECT sal FROM emp WHERE ename IN('SMITH','ALLEN')) AND e.deptno=d.deptno AND e.mgr=m.empno(+); 3、 列出所有员工的编号、姓名及其直接上级的编号、姓名,显示的结果按领导年工资的降序排列。
1、确定所需要的数据表:
emp表:员工的编号、姓名;
emp表:领导的编号、姓名、计算年薪;
2、确定已知的关联字段:emp.mgr=memp.empno;
SELECT e.empno,e.ename,m.empno,m.ename,(m.sal+NVL(m.comm,0))*12 incomeFROM emp e,emp mWHERE e.mgr=m.empno(+)ORDER BY income DESC;
4、列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数。
1、确定所需要的数据表:
emp表:雇员的编号、姓名;
emp表:求出领导的工作日期;
dept表:部门名称、位置;
emp表:统计部门人数;
2、确定已知的关联字段:
雇员和部门:emp.deptno=dept.deptno;
雇员和领导:emp.mgr=memp.empno;
第一步:列出受雇日期早于其直接上级的所有员工的编号、姓名 —— 自身关联emp表。
SELECT e.empno,e.enameFROM emp e,emp mWHERE e.mgr=m.empno(+) AND e.hiredate<m.hiredate;
第二步:加入部门信息,继续引入部门表
SELECT e.empno,e.ename,d.dname,d.locFROM emp e,emp m,dept dWHERE e.mgr=m.empno(+) AND e.hiredate<m.hiredateAND e.deptno=d.deptno;
额外提问,此时的笛卡尔积:emp表的14条 * emp表的14条 * dept表的4条;
第三步:统计部门人数,此时由于要使用统计函数,而且以上的查询也无法再直接出现统计函数,所以使用子查询完成 SELECT e.empno,e.ename,d.dname,d.loc,temp.countFROM emp e,emp m,dept d,( SELECT deptno dno,COUNT(empno) count
FROM emp GROUP BY deptno) tempWHERE e.mgr=m.empno(+) AND e.hiredate<m.hiredate AND e.deptno=d.deptno AND e.deptno=temp.dno; 当查询显示的时候需要统计信息,但是又不能直接使用统计函数查询的话,通过子查询在FROM子句之后进行统计。
5、列出部门名称和这些部门的员工信息(数量、平均工资),同时列出那些没有员工的部门。
1、确定所需要的数据表:
dept表:部门的信息;
emp表:求出所有的统计信息;
2、确定已知的关联字段:emp.deptno=dept.deptno;
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal)FROM emp e,dept dWHERE e.deptno(+)=d.deptnoGROUP BY d.deptno,d.dname,d.loc;
6、列出所有“CLERK”(办事员)的姓名及其部门名称,部门的人数,工资等级。
1、确定所需要的数据表:
emp表:找到办事员的姓名;
dept表:部门名称;
emp表:统计求出部门的人数;
salgrade表:查询工资等级;
2、确定已知的关联字段:
emp表和dept表:emp.deptno=dept.deptno;
emp表和salgrade表:emp.sal BETWEEN salgrade.losal AND salgrade.hisal;
第一步:找到所有办事员的姓名
SELECT e.enameFROM emp eWHERE job='CLERK';
第二步:找到部门信息,引入dept表,同时增加消除笛卡尔积的条件
SELECT e.ename,d.dnameFROM emp e,dept dWHERE job='CLERK' AND e.deptno=d.deptno;
第三步:部门人数需要额外的统计,但是本程序的查询里面已经不可能继续使用COUNT()函数,所以写子查询统计 SELECT e.ename,d.dname,temp.countFROM emp e,dept d,( SELECT deptno dno,COUNT(empno) count
FROM emp GROUP BY deptno) tempWHERE e.job='CLERK' AND e.deptno=d.deptno AND d.deptno=temp.dno; 第四步:雇员的工资等级,继续引入salgrade表 SELECT e.ename,d.dname,temp.count,s.gradeFROM emp e,dept d,( SELECT deptno dno,COUNT(empno) count
FROM emp GROUP BY deptno) temp,salgrade sWHERE e.job='CLERK' AND e.deptno=d.deptno AND d.deptno=temp.dno AND e.sal BETWEEN s.losal AND s.hisal; 7、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数及所在部门名称、位置、平均工资。
1、确定所需要的数据表:
emp表:最低薪金大于1500的工作肯定需要使用emp表统计求出,以及可以求出雇员人数;
dept表:求出些雇员所在的部门信息;
emp表:统计求出部门的平均工资;
2、确定已知的关联字段:emp.deptno=dept.deptno;
第一步:使用emp表按照job分组,统计最低工资(HAVING)和人数
SELECT e.job,COUNT(e.empno)FROM emp eGROUP BY e.jobHAVING MIN(e.sal)>1500;
第二步:要查询出雇员所在的部门信息,但是以上的查询能跟dept表有关联吗?
以上的查询和dept表之间并没有关联字段,那么如果没有关联字段,一定会有笛卡尔积产生,但是多表查询必须要消除笛卡尔积,所以必须联系;
以上的查询可以和emp表的job字段关联;
要引入的dept表也可以和emp表的deptno字段关联; SELECT temp.job,temp.count,d.dname,e.enameFROM dept d,( SELECT e.job job,COUNT(e.empno) count
FROM emp e GROUP BY e.job HAVING MIN(e.sal)>1500) temp,
emp eWHERE e.deptno=d.deptno AND e.job=temp.job; 第三步:求出一个部门的平均工资,使用emp表在子查询中统计 SELECT temp.job,temp.count,d.dname,e.ename,res.avgFROM dept d,( SELECT e.job job,COUNT(e.empno) count
FROM emp e GROUP BY e.job HAVING MIN(e.sal)>1500) temp,
emp e,( SELECT deptno dno,AVG(sal) avg
FROM emp GROUP BY deptno) resWHERE e.deptno=d.deptno AND e.job=temp.job AND e.deptno=res.dno; 本题目之所以出的如此之复杂,目的是训练大家寻找关联字段的能力,但是本题目没有任何的意义,知道就行了。
8、列出在部门“SALES”(销售部)工作的员工姓名、基本工资、雇佣日期、部门名称、假定不知道销售部的部门编号。
1、确定所需要的数据表:
emp表:员工姓名、基本工资、雇佣日期;
dept表:找到销售部的部门编号、部门名称;
2、确定已知的关联字段:emp.deptno=dept.deptno;
SELECT e.ename,e.sal,e.hiredate,d.dnameFROM emp e,dept dWHERE e.deptno=d.deptnoAND d.dname='SALES';
9、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级。
1、确定所需要的数据表:
emp表:可以求出公司的平均薪金;
emp表:员工的信息;
dept表:部门的信息;
emp表:领导的信息;
salgrade表:工资等级;
2、确定已知的关联字段:
雇员和部门:emp.deptno=dept.deptno;
雇员和领导:emp.mgr=memp.empno;
雇员和工资等级:emp.sal BETWEEN salgrade.losal AND salgrade.hisal;
第一步:求出公司的平均薪金
SELECT AVG(sal) FROM emp;
第二步:将以上的子查询放在WHERE子句之中,作为一个查询条件,求出满足此条件的雇员信息。
SELECT e.empno,e.ename,e.job,e.salFROM emp eWHERE e.sal>( SELECT AVG(sal) FROM emp);
第三步:找到部门的名称
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.locFROM emp e,dept dWHERE e.sal>( SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno;
第四步:找到领导的信息 SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc,m.enameFROM emp e,dept d,emp mWHERE e.sal>( SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno AND e.mgr=m.empno(+); 第五步:找到工资等级 SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc,m.ename,s.gradeFROM emp e,dept d,emp m,salgrade sWHERE e.sal>( SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno AND e.mgr=m.empno(+) AND e.sal BETWEEN s.losal AND s.hisal; 10、列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。
1、确定所需要的数据表:
emp表:找到SCOTT的工作;
emp表:员工的信息;
dept表:部门名称;
emp表:部门人数;
2、确定已知的关联字段:emp.deptno=dept.deptno;
第一步:找到SCOTT的工作
SELECT job FROM emp WHERE ename='SCOTT';
第二步:以上的子查询返回单行单列的数据,所以可以在WHERE子句中出现,以这个条件查找满足要求的雇员信息 SELECT e.empno,e.ename,e.jobFROM emp eWHERE e.job=( SELECT job FROM emp WHERE ename='SCOTT') AND e.ename<>'SCOTT'; 第三步:找到部门名称 SELECT e.empno,e.ename,e.job,d.dnameFROM emp e,dept dWHERE e.job=( SELECT job FROM emp WHERE ename='SCOTT') AND e.ename<>'SCOTT'
AND e.deptno=d.deptno; 第四步:找到部门人数,需要统计,所以在FROM子句之中编写 SELECT e.empno,e.ename,e.job,d.dname,temp.countFROM emp e,dept d,( SELECT deptno dno,COUNT(empno) count
FROM emp GROUP BY deptno) tempWHERE e.job=( SELECT job FROM emp WHERE ename='SCOTT') AND e.ename<>'SCOTT' AND e.deptno=d.deptno AND temp.dno=e.deptno; 11、列出公司各个工资等级雇员的数量、平均工资。
1、确定所需要的数据表:
emp表:统计出数据;
salgrade表:得出工资等级;
2、确定已知的关联字段:emp.sal BETWEEN salgrade.losal AND s.hisal;
本程序实际上就是一个多字段分组而已,唯一不同的是,将分组条件设置为salgrade表中的字段;
SELECT s.grade,s.losal,s.hisal,COUNT(e.empno),AVG(e.sal)FROM emp e,salgrade sWHERE e.sal BETWEEN s.losal AND s.hisalGROUP BY s.grade,s.losal,s.hisal;
12、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。
1、确定所需要的数据表:
emp表:找出所有在30部门工作的雇员的工资;
emp表:最终显示的雇员姓名;
dept表:找到部门名称;
2、确定已知的关联字段:emp.deptno=dept.deptno;
第一步:找到30部门工作的雇员的工资
SELECT sal FROM emp WHERE deptno=30;
第二步:高于30部门,使用ALL操作符,引入emp表,查询姓名和薪金
SELECT e.empno,e.enameFROM emp eWHERE sal>ALL( SELECT sal FROM emp WHERE deptno=30) AND e.deptno=d.deptno;
13、列出在每个部门工作的员工数量、平均工资和平均服务期限。
1、确定所需要的数据表:
dept表:找到部门信息;
emp表:统计出数量、平均工资、平均服务年限;
2、确定已知的关联字段:emp.deptno=dept.deptno;
直接将dept和emp表关联,使用多字段分组即可,但是对于服务年限需要一个计算过程。
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal),AVG(MONTHS_BWTWEEN(SYSDATE,e.hiredate)/12) yearFROM emp e,dept dWHERE e.deptno(+)=d.deptnoGROUP BY d.deptno,d.dname,d.loc;
14、列出所有员工的姓名、部门名称和工资。
1、确定所需要的数据表:
emp表:找到员工姓名;
dept表:部门名称;
2、确定已知的关联字段:emp.deptno=dept.deptno;
SELECT e.ename,d.dname,e.salFROM emp e,dept dWHERE e.deptno=d.deptno;
15、列出所有部门的详细信息和部门人数。
1、确定所需要的数据表:
emp表:统计信息;
dept表:查询部门信息;
2、确定已知的关联字段:emp.deptno=dept.deptno;
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno)FROM emp e,dept dWHERE e.deptno(+)=d.deptnoGROUP BY d.deptno,d.dname,d.loc;
16、列出各种工作的最低工资及从事此工作的雇员姓名。
1、确定所需要的数据表:
emp表:统计出各个工作的最低工资;
emp表:查找出雇员姓名;
第一步:按照职位统计各个职位的最低工资
SELECT job,MIN(sal) FROM empGROUP BY job;
第二步:将以上的查询和emp表关联
SELECT e.ename,e.job,e.salFROM emp e,( SELECT job,MIN(sal) FROM emp GROUP BY job) tempWHERE e.job=temp.job AND e.sal=temp.min;
17、列出各个部门的MANAGER(经理)的最低薪金、姓名、部门名称、部门人数。
1、确定所需要的数据表:
emp表:找到经理的薪金、姓名;
dept表:部门名称;
emp表:统计部门人数;
2、确定已知的关联字段:emp.deptno=dept.deptno;
第一步:找到所有部门的经理
SELECT deptno,MIN(sal)FROM empWHERE job='MANAGER'GROUP BY deptno;
第二步:找到姓名,但是以上的子查询,不能再出现其他的字段 SELECT e.ename,e.salFROM emp e,( SELECT deptno dno,MIN(sal) sal FROM emp WHERE job=’MANAGER’ GROUP BY deptno) tempWHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER'; 第三步:加入部门的名称信息 SELECT e.ename,e.sal,d.dnameFROM emp e,( SELECT deptno dno,MIN(sal) sal FROM emp WHERE job='MANAGER'
GROUP BY deptno) temp,dept dWHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER'
AND e.deptno=d.deptno; 第四步:统计部门人数 SELECT e.ename,e.sal,d.dname,res.countFROM emp e,( SELECT deptno dno,MIN(sal) sal FROM emp WHERE job=’MANAGER’ GROUP BY deptno) temp,dept d,( SELECT deptno dno,COUNT(empno) count
FROM emp GROUP BY deptno) resWHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER' AND e.deptno=d.deptno AND res.dno=d.deptno; 18、列出所有员工的年工资,所在部门名称,按年薪从低到高排序。
1、确定所需要的数据表:
emp表:统计年工资;
dept表:部门名称;
2、确定已知的关联字段:emp.deptno=dept.deptno;
SELECT e.ename,e.sal*12 income,d.dnameFROM emp e,dept dWHERE e.deptno=d.deptnoORDER BY income;
19、查出某个员工的上级主管及所在部门名称,并要求出这些主管中的薪水超过3000。
1、确定所需要的数据表:
emp表:员工的信息;
emp表:领导的信息;
dept表:部门名称;
2、确定已知的关联字段:
雇员和部门:emp.deptno=dept.deptno;
雇员和领导:emp.mgr=memp.empno;
SELECT DISTINCT m.ename,d.dname,m.salFROM emp e,emp m,dept dWHERE e.mgr=m.empno AND m.deptno=d.deptno AND m.sal>3000;
20、求出部门名称中,带‘S’字符的部门员工的工资合计、部门人数。
1、确定所需要的数据表:
emp表:进行统计信息;
dept表:部门名称;
2、确定已知的关联字段:emp.deptno=dept.deptno;
SELECT d.dname,SUM(e.sal),COUNT(e.empno)FROM emp e,dept dWHERE e.deptno(+)=d.deptno AND d.dname LIKE ‘%S%’GROUP BY d.dname;
21、给任职日期超过30年或者在87年雇佣的雇员加薪,加薪原则:10部门增长10%,20部门增长20%,30部门增长30%,依次类推。
UPDATE emp SET
sal=(1 + deptno/100)*salWHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>30
OR TO_CHAR(hiredate,’yyyy’)=1987;
以上的所有题目作为DML操作的总结,这些题目结果都不重要,关键是解决问题的思路,这些只能通过代码的不断练习。
二、总结
1、 多表查询:在进行查询语句编写的时候,一定要确定所需要关联的数据表,而且只要是表的关联查询,就一定会存在笛卡尔积的问题,使用关联字段消除此问题。
在使用多表查询的时候要考虑到左右连接的问题,Oracle之外的数据库可以使用SQL:1999语法控制左右连接;
2、 所有的统计函数是用于进行数据统计操作的,而统计要在分组中进行(或者是单独使用),分组使用GROUP BY子句,是在某一列上存在重复数据的时候才会使用分组操作,而分组后的过滤使用HAVING子句完成,所有的分组函数可以嵌套,但是嵌套之后的分组函数 之中不能再有其他的查询字段,包括分组字段;
3、 子查询:结合限定查询、多表查询、分组统计查询完成各个复杂查询的操作,子查询一般在WHERE和FROM之后出现较多;
4、 数据库的更新操作一定要受到事务的控制,事务的两个命令:COMMIT、ROLLBACK,每一个连接到数据库上的用户都使用一个SESSION表示;
5、 数据表的分页查询显示依靠ROWNUM伪列,以后在开发之中必定100%要使用。
Oracle 复杂查询(1)的更多相关文章
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- 【SQL】Oracle分页查询的三种方法
[SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...
- 关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)
关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其... 方法一:使用to_char的fm格式,即: to_char(round(data.amount,2),'FM9999 ...
- Oracle参数化查询
Oracle参数化查询默认是根据顺序绑定的 select * from table where name=:p1 and (select id from table2 where name=:p1); ...
- mysql和oracle 分页查询(转)
最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...
- Oracle分页查询语句的写法(转)
Oracle分页查询语句的写法(转) 分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的 ...
- Oracle生成查询包括对应于所有数据表记录语句中指定的字段名
应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 d ...
- 各种oracle参数查询语句
各种oracle参数查询语句 1.show parameter:--显示各个系统参数配置 2.select * from v$parameter;--显示各个系统参数配置 2.show paramet ...
- oracle高级查询(实例基于scott用户四张表)
oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...
- oracle分页查询及原理分析(总结)
oracle分页查询及原理分析(总结) oracle分页查询是开发总为常用的语句之一,一般情况下公司框架会提供只需套用,对于增删改查而言,查是其中最为关键也是最为难的一块,其中就有使用率最高的分页查询 ...
随机推荐
- 使用Selenium通过浏览器对网站进行自动化测试和相关问题
使用Selenium通过浏览器对网站进行自动化测试 自动化测试概念: 一般是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件. 广义上来讲 ...
- 基于mysql的全文索引
支持引擎:mysql的MyISAM存储引擎和Innodb存储引擎(5.6及其以上)支持. 适用类型:char.varchar和text. 新建方法:ALTER TABLE article ADD F ...
- Struts06---通配符的使用
01.创建对应的login.jsp页面 <%@ page language="java" import="java.util.*" pageEncodin ...
- springboot项目执行controller方法时进入慢的问题
今天在部署springboot项目到阿里云时,出现登录方法执行特别慢的问题.刚开始以为是卡死了,等了3,4分钟才进去,最后会出现如下信息: 2018-01-28 15:38:36.958 INFO 4 ...
- AutoLayout 使用详细
1.实际应用中,这Compact,Any,Regular如何运用呢? w:Any h:Any 是我们刚建立工程时候默认选择的,算是一切描述的父类.其他的种类描述都是在此基础上变化的,比如:如果weig ...
- Python基础学习(第5天)
第3课 模块 1.模块(module) Python中一个.py文件就是一个模块,可以调用其它文件中的程序. 例:first.py def laugh(): print '哈哈哈哈哈' second ...
- 一些初学shell自己写的一些练习题脚本
1斐波拉契数列前10个 #!/binbash#declare A=0declare B=1for ((i=1;i<6;i++)); do let A+=B printf " ...
- SVN的详细简单操作
SVN服务器搭建和使用(一) http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html SVN服务器搭建和使用(二) ht ...
- [置顶]
【机器学习PAI实践六】金融贷款发放预测
一.背景 很多农民因为缺乏资金,在每年耕种前会向相关机构申请贷款来购买种地需要的物资,等丰收之后偿还.农业贷款发放问题是一个典型的数据挖掘问题.贷款发放人通过往年的数据,包括贷款人的年收入.种植的作物 ...
- Reinforcement Learning Q-learning 算法学习-3
//Q-learning 源码分析. import java.util.Random; public class QLearning1 { private static final int Q_SIZ ...