SELECT machine_id, service_date FROM service ORDER BY technician_id, service_date;
A.458745
B.687523
C.785214
D.789874
E.980076
A B C D E
E
[解析] 这一题测试对ORDERBY子句的理解。根据有关ORDER BY子句的介绍,可以知道ORDERBY子句排序的默认顺序是升序,也就是由小到大。在以上的语句中ORDER BY子句首先是按technician_id由小到大的顺序排序的,但是这里有一个棘手的问题,那就是technician_id列有一个空值。实际上,Oracle在进行升序排序时,空值是放在最后的。虽然到目前为止还没有讲述这一点,但是可以通过下面的实验来验证这一点。 首先,启动SQL*Plus并以SCOTT用户登录Oracle数据库,之后运行如下的查询语句。 注意:一定要使用Order by comm子句,并将显示的结果按佣金(comm)的升序方式来排序。 SQL>SELECT ename, job, comm 2 FROM emp 3 Order by comm; ENAME JOB COM -------- ------------ --------- TURNER SALESMAN 0 ALLEN SALESMAN 300 WARD SALESMAN 500 MARTIN SALESMAN 1400 SCOTT ANALYST KING PRESIDENT ADAMS CLERK …… 以上查询语句的结果清楚地表明comm为空的数据行都排列在显示结果的最后。基于以上的讨论,可以断定technician_id列为空值的那一行记录将显示在结果的最后一行,而这一行的MACHINE_ID为980076,所以选项E是正确答案。
10. 见下表SERVICE,如果使用如下的查询语句,第一个显示的是哪一个值?
SELECT machine_id FROM service ORDER BY technician_id, service_date;
12. 学生(STUDENT)表包括了如下的列定义: ID NUMBER(9) PK LAST_NAME VARCHAR2(25) FIRST_NAME VARCHAR2(25) SUBJECT_ID NUMBER(9) 比较以下的两个SQL语句,其结果将有哪些不同? (1)SELECT DISTINCT subject_id, last_name, first_name FROM student ORDER BY 1; (2)SELECT id, last_name, first_name, subject_id FROM student ORDER BY subject_id;
A.第一个语句的结果将以字母顺序排序,而第二个语句则不是
B.第一个语句将限制重复的subject_id,而第二个语句则不是
C.第二个语句将从输出结果中去掉重复行,而第一个语句则不能
D.第一和第二个语句将显示学生(STUDENT)表中一些值的不同组合
A B C D
D
[解析] 这一题测试对DISTINCT、主键(primaiy key)和ORDER BY子句的理解。根据有关ORDER BY子句的介绍,可知第一个SQL语句中的“ORDER BY 1”子句是对SELECT列表中的第一列subject_id进行升序排序。 根据学生(STUDENT)表中subject_id的定义可知subject_id是数字类型,所以第一个语句只能以数字的顺序排序,而不可能以字母顺序排序,所以选项A肯定是错误的。 由于id是STUDENT表中的主键,按照关系数据库的理论,在关系表中主键必须唯一,所以第二个语句返回的结果中每一行肯定都是唯一的。而由于第一个语句的SELECT列表中使用了DISTINCT关键字,所以这一语句返回的结果的每一行肯定也是唯一的(不同的)。所以选项B和选项C都不可能正确,因为它们各有一个语句的结果不是唯一的。因此,在所有的四个选项中只有选项D才适用于这两个SQL语句。
33. 如果使用如下的SQL语句查询数据库: SELECT id_number "Part Number", SUM(price*quantity)TOTAL, description FROM inventory WHERE price>5.00 ORDER BY "Part Number", 3; 以下哪个子句将造成错误?
SELECT description, quantity, cost FROM product WHERE manufacturer_id LIKE 'NF10032' AND NVL(cost, 0)<5.00 ORDER BY quantity DESC, cost; 以上的查询语句将产生如下的哪个结果?
38. 使用如下的SQL语句查询数据库: SELECT bonus FROM salary WHERE bonus BETWEEN 1 AND 250 OR (bonus IN (190, 500, 600) AND bonus BETWEEN 250 AND 500); 请问这个SQL语句将返回如下的哪个值?
A.100
B.260
C.400
D.600
A B C D
A
[解析] 这一题是测试对逻辑操作符AND和OR以及运算符的优先级的理解。根据有关逻辑表达式和逻辑运算符的介绍和有关运算符优先级的介绍,可以知道逻辑与(AND)操作优先于逻辑或(OR)操作。接下来,详细解释一下这个SQL语句大致的执行流程: (1)根据运算符的优先级,该SQL语句将首先计算表达式bonus IN(190, 500, 600) AND bonus BETWEEN 250 AND 500,根据有关逻辑与的规则,可知只有当两个条件都为T时,AND逻辑表达式的结果才为T,所以这个表达式的返回值为500 (2)接下来,SQL语句将计算表达式(bonus BETWEEN 1 AND 250)OR 500。实际上,这个表达式结果是1~250(包括1和250)或500的全部值,在所给的选项中只有100满足这个条件,所以只有选项A正确。
39. 以下是教师(TEACHER)表中的数据:
TEACHER
ID
LAST_NAME
FIRST_NAME
SUBJECT_ID
88
Tsu
Ming
HST AMER
70
Smith
Ellen
HST INDIA
56
Jones
Karen
58
Hann
Jeff
HST CURR
63
Hopewell
Mary Elizabeth
HST_RELIG
请评估如下的SQL语句,当这个查询语句执行时将首先显示如下的哪条信息? SELECT last_name‖', '‖first_name FROM teacher WHERE subject_id!=NULL ORDER BY last_name;
42. 请评估如下的SQL语句: SELECT manufacturer_id, COUNT(*), order_date FROM inventory WHERE price>5.00 GROUP BY order_date, manufacturer_id HAVING COUNT(*)>10 ORDER BY order_date DESC; 在以上的查询语句中,指定从INVENTORY(库存)表中返回哪些行的子句是哪个?
如果使用如下的SQL语句,哪个子句将会产生错误? SELECT supplier_id,AVG(cost) FROM product WHERE AVG(list_price)>60.00 GROUP BY supplier_id ORDER BY AVG(cost)DESC;
A.FROM
B.WHERE
C.GROUP BY
D.ORDER BY
A B C D
B
[解析] 这一题是测试对HAVING子句的理解。根据有关HAVING子句的介绍,可知WHERE子句不能用于限制分组函数,在Oracle中应该使用HAVING子句来限制分组函数,所以可以确定WHERE AVG(list_price)>60.00子句是错误的,即选项B是正确的。 在本题的SQL语句中,子句FROM product、GROUP BY supplier_id和ORDER BY AVG(cost)DESC都是正确的,所以选项A、C和D都不是本题的答案。
46. 使用如下的SQL语句将完成哪一种类型的连接? SELECT i.id_number, m.manufacturer_id FROM inventory i, inventory m WHERE i.manufacturerl_id=m.region_id_number;
53. 以下是产品(PRODUCT)表和供应商(SUPPLIER)表的结构: PRODUCT ----------- PRODUCT_ID NUMBER PRODUCT_NAME VARCHAR2(25) SUPPLIER_ID NUMBER CATEGORY_ID NUMBER QTY_PER_UNIT NUMBER UNIT_PRICE NUMBER(7, 2) QTY_IN_STOCK NUMBER QTY_ON_ORDER NUMBER REORDER_LEVEL NUMBER SUPPLIER ------------ SUPPLIER_ID NUMBER SUPPLIER_NAME VARCHAR2(25) ADDRESS VARCHAR2(30) CITY VARCHAR2(25) REGION VARCHAR2(10) POSTAL_CODE VARCHAR2(11) 要求创建一个查询,这个查询将以字母顺序返回产品的清单,其中包括了每个产品的供应商。要求只有在产品表中有供应商的那些产品才可以包括在清单(报告)中。请问使用以下的哪两个查询能完成此项查询?
A.SELECT p.product_name, s.supplier_name FROM product p LEFT OUTER JOIN supplier s ON p.supplier_id=s.supplier_id ORDER BY p.product_name;
B.SELECT p.product_name, s.supplier_name FROM product P JOIN supplier s ON (supplier_id) ORDER BY p.product_name;
C.SELECT p.product_name, s.supplier_name FROM product p NATURAL JOIN supplier s ORDER BY p.product_name;
D.SELECT p.product_name, s.supplier_name FROM product p JOIN supplier s USING (p.supplier_id) ORDER BY p.product_name;
E.SELECT product_name, supplier_name FROM product JOIN supplier USING (supplier_id) ORDER BY p.product_name;
A.SELECT i.last_name, i.first_name, c.class_name FROM instructor i, class c;
B.SELECT i.last name, i.first_name,c.class_name FROM class c LEFT OUTER JOIN instructor I ON (i.instructor_id=c.instructor_id) ORDER BY i.instructor_id;
C.SELECT i.last_name, i.first_name, c.class_name FROM instructor i, class c WHERE i.instructor_id=c.instructor_id (+) ORDER BY i.instructor_id;
D.SELECT i.last_name, i.first_name, c.class_name FROM instructor i LEFT OUTER JOIN class c ON (i.instructor id=c.instructor_id) ORDER BY i.instructor_id;
E.SELECT i.last_name, i.first_name, c.class_name FROM instructor i, class c WHERE i.instructor_id (+)=c.instructor_id ORDER BY i.instructor_id;
F.SELECT i.last_name, i.first_name, c.class_name FROM instructor i NATURAL JOIN class c ON (i.instructor_id=c.instructor_id);
58. 以下是客户(CUSTOMER)表和客户_订单(CURR_ORDER)表的结构: CUSTOMER ------------------------------------ CUSTOMER_ID NUMBER(5) NAME VARCHAR2(25) CREDIT_LIMIT NUMBER(8, 2) ACCT_OPEN_DATE DATE CURR_ORDER ------------------------------------ ORDER_ID NUMBER(5) CUSTOMER_ID NUMBER(5) ORDER_DATE DATE TOTAL NUMBER(8, 2) 以下哪种情况下应该使用子查询来返回所需的结果?
A.需要显示今天下了订单的全部客户的名字
B.需要确定CUSTOMER_ID为30450的客户今年所下的订单数量
C.需要确定今年开了账号的所有客户的平均信用限额(CREDIT_LIMIT)
D.需要确定那些信用限额比CUSTOMER_ID为30450的客户的信用限额高(大)的客户
A B C D
D
[解析] 这一题比较复杂,该题测试对单行子查询的熟悉程度(在这一题中实际上是寻找最佳的答案)。根据有关WHERE子句中的单行子查询的介绍,可以确定选项D是正确的答案。选项D其查询语句可以如下: SELECT CUSTOMER_ID, name FROM CUSTOMER WHERE CREDIT_LIMIT> (SELECT CREDIT_LIMIT FROM CUSTOMER WHERE CUSTOMER_ID=30450); 因为今天下了订单的全部客户的名字的操作可以使用连接操作来完成,所以选项A可以排除,其查询语句可以如下: SELECT CUSTOMER_ID, name FROM CUSTOMER C, CURR_ORDER O WHERE C.CUSTOMER_ID=O.CUSTOMER_ID AND O.ORDER_DATE=SYSDATE; 因为确定CUSTOMER_ID为30450的客户今年所下的订单数量的操作根本就不需要子查询,所以选项B同样也可以排除。其查询语句可以如下: SELECT COUNT(TOTAL) FROM CURR_ORDER WHERE CUSTOMER_ID=30450 AND ORDER_DATE>=TRUNC(SYSDATE, 'YEAR'); 因为确定今年开了账号的所有客户的平均信用限额同样不需要子查询,所以选项C也可以排除。其查询语句可以如下: SELECT avg(CREDIT_IMIT) FROM CUSTOMER C, CURR_ORDER O WHERE C.CUSTOMER_ID=O.CUSTOMER_ID AND ORDER_DATE>=TRUNC(SYSDATE, 'YEAR');
[解析] 这一题是测试对单行子查询的熟悉程度。根据有关WHERE子句中的单行子查询的介绍,可以确定选项D是正确的。实际上,选项D是子查询与主查询使用了两个不同的表,其查询语句可以如下: SELECT patient_id FROM PATIENT WHERE admit_date> (SELECT hire_date FROM PHYSICIAN WHERE PHYSICIAN ID=某个理疗师的ID); 因为分组函数(SUM、AVG、MIN、MAX和COUNT)无法显示某个理疗师(physician)被雇佣之后所有注册的病人(patient),所以选项A肯定可以排除。因为HAVING子句是用来限制分组之后的数据行的,所以选项B也肯定可以排除。 MERGE语句并未介绍过,其实即使不了解MERGE语句也可以正确地回答这一问题。下面简单地介绍一下MERGE语句: MERGE语句是Oracle9i引入的一个DML语句,这个语句是为了将数据从一个表导入到另一表而设计的,其目的主要是支持数据仓库的操作。随着时间的流逝,在生产数据库中,一些大型表如订单表中的一些旧的订单在日常工作中已经很少使用,但是这些数据还可以用作商业智能的分析以帮助管理者快速地做出正确的决策,因此就需要将这些数据从生产表中转移到数据仓库表中。大型和超大型公司可能有许多DBA,因此在进行这类数据转移操作时,很难确定之前是否有其他的DBA已经完成了这样工作(也可能自己忘了)。在这种情况下,可以使用MERGE语句。 MERGE语句的操作是这样的。如果将数据导入目标表时,数据已经存在,则执行UPDATE(更新)操作,否则就执行INSERT(插入)操作,这样就不会出现一行数据被多次插入的现象。基于以上的介绍,可以肯定选项C不可能是正确的。
63. 请看如下的SQL语句,执行这个语句时将失败,请问怎样修改可以解决这一问题? SELECT c.customer_id, o.order_id, o.order_date, p.product_name FROM customer c, curr_order o, product p WHERE customer.customer_id=curr_order.customer_id AND oproduct_id=p.product_id ORDER BY o.ordei_amount;