oracle(4)

一、 單選題

1.顧客表(customers)中有一存儲顧客姓名的字段(customerName),現在想顯示"歡迎customerName光臨小店"的字樣,下列SQL語句能夠滿足該需求的是()

A:

SELECT "歡迎"||customerName||"光臨小店" FROM customers;

B:

SELECT '歡迎'||customerName||'光臨小店' FROM customers;

C:

SELECT '歡迎'|customerName|'光臨小店' FROM customers;

D:

SELECT "歡迎"|customerName|"光臨小店'"FROM customers;

參考答案:B

解析:
在select中顯示的字符用單引號引起來,字符之間的連接用||

2.需要創建一個訂單(ORDERS)表,該表包含如下4列
1.an ORDER_ID column of number data type
2.a CUSTOMER_ID column of number data type
3.an ORDER_STATUS column that contains a character data type
4.a DATE_ORDERED column to contain the date the order was placed
要求:當一行插入到表中時,如果沒有提供任何值,則應使用今天的日期。
下列選項符合要求的是()

A:

  CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE = SYSDATE);

B:

  CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE DEFAULT SYSDATE);

C:

  CREATE OR REPLACE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE DEFAULT SYSDATE);

D:

  CREATE OR REPLACE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status VARCHAR2 (10),
  date_ordered DATE = SYSDATE);

E:

   CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status NUMBER (10),
  date_ordered DATE = SYSDATE);

F:

  CREATE TABLE orders (
  order_id NUMBER(10),
  customer_id NUMBER(8),
  order_status NUMBER (10),
  date_ordered DATE DEFAULT SYSDATE);

參考答案:B

解析:
1、oracle數據庫可以用create or replace的對象有:functions,procedures, packages, types, synonyms, trigger and views,就是沒有table,也沒有sequence。據此排除C、D選項。
2、添加默認值的方式是在字段的數據類型之後用“default”,而不是用“=”。據此排除A、E。
3、選項F是ORDER_STATUS 字段的數據類型錯誤。

3.觀察customers表的表結構
在這裏插入圖片描述
其中CUSTOMER_ID是表的主鍵。下列哪個選項能夠查詢出“Los Angeles”和“San Francisco”的城市地址(city_address),以及每個城市裏顧客的數量()

A:

  SELECT city_address, COUNT(*)
  FROM customers
  WHERE city_address IN ('Los Angeles', 'San Francisco');

B:

  SELECT city_address, COUNT(*)
  FROM customers
  WHERE city_address IN ('Los Angeles', 'San Francisco')
  GROUP BY city_address;

C:

  SELECT city_address, COUNT(customer_id)
  FROM customers
  WHERE city_address IN ('Los Angeles', 'San Francisco')
  GROUP BY city_address, customer_id;

D:

  SELECT city_address, COUNT(customer_id)
  FROM customers
  GROUP BY city_address IN ('Los Angeles', 'San Francisco');

參考答案:B

解析:
若要查詢出這兩個城市的顧客數量,必須先按城市分組,再統計數量

4.觀察orders表和customers表,哪個SQL語句能夠檢索出與Martin同一天下訂單的訂單ID,客戶ID和訂單總額?
在這裏插入圖片描述
A:

  SELECT ord_id, cust_id, ord_total
  FROM orders, customers
  WHERE cust_name='Martin'
  AND ord_date IN ('18-JUL-2000','21-JUL-2000');

B:

  SELECT ord_id, cust_id, ord_total
  FROM orders
  WHERE ord_date IN (SELECT ord_date
  FROM orders
  WHERE cust_name ='Martin')

C:

  SELECT ord_id, cust_id, ord_total
  FROM orders
  WHERE ord_date IN (SELECT ord_date
  FROM orders, customers
  WHERE cust_name ='Martin');

D:

  SELECT ord_id, cust_id, ord_total
  FROM orders
  WHERE cust_id IN (SELECT cust_id
  FROM customers
  WHERE cust_name = 'Martin');

參考答案:B

解析:
訂單(orders)表中沒有cust_name ,所以要通過子查詢查出cust_name ='Martin’的顧客的ID(cust_id ),然後在orders表中查詢出該顧客在那天下過訂單,最後查詢出在這一天下的訂單的訂單ID,客戶ID和訂單總額

5.觀察EMPLOYEES表,其中在EMPLOYEES表上,EMPLOYEE_ID是主鍵。 MGR_ID是經理的ID,並引用EMPLOYEE_ID。JOB_ID列是一個NOT NULL列。
在這裏插入圖片描述
下面的DELETE語句爲何刪除失敗

  DELETE employee_id, salary, job_id
  FROM employees
  WHERE dept_id = 90;

A:在EMPLOYEES 表中沒有dept_id 爲90的行
B:不能刪除JOB_ID 列,因爲該列不能爲空
C:不能在刪除語句的DELETE子句中指定列名
D:不能刪除EMPLOYEE_ID列,因爲它是表的主鍵。

參考答案:C

解析:
刪除語句只能用於整行刪除,不能再delete子句中指定列名。

6.觀察下表(EMP)
在這裏插入圖片描述
需要查詢出獎金(COMM)爲空,正確的SQL語句是()

A:

SELECT * FROM EMP WHERE COMM = NULL;

B:

SELECT * FROM EMP WHERE COMM = 0;

C:

 SELECT * FROM EMP WHERE COMM IS NULL;

D:

SELECT * FROM EMP WHERE COMM IS 0;

參考答案:C

解析:
判斷某列的值爲空用IS null

7.觀察下表ORDERS和CUSTOMERS
在這裏插入圖片描述
下面SQL語句的執行結果是()

  SELECT *
  FROM orders
  WHERE cust_id = (SELECT cust_id
  FROM customers
  WHERE cust_name = 'Smith');

A:
在這裏插入圖片描述
B:
在這裏插入圖片描述
C:
在這裏插入圖片描述
D:查詢失敗,因爲子查詢的返回結果不止一行
E:查詢失敗,因爲子查詢和主查詢用的不是同一張表

參考答案:D

解析:
主查詢的where子句的運算符爲“=”,所以其後面的值不能是多個,但是在customers表中Smith有兩個,所以查詢失敗。

8.關於drop關鍵字下面說法錯誤的是:
A:刪除某個用戶是需要此關鍵字
B:刪除表中的某個字段時需要此關鍵字
C:刪除某張表時需要此關鍵字
D:刪除表中的某條數據時需要此關鍵字

參考答案:D

解析:
刪除表中數據使用delete關鍵字

9.下面關於Oracle的說法正確的是
A: Oracle的默認的SID是ORCL
B: Oracle的測試用戶scott的默認密碼是123456
C: Oracle的測試用戶hr的密碼是123456
D: Oracle的默認端口號是1520

參考答案:A

解析:
Oracle的測試用戶是scott,默認密碼是tiger。 Oracle的默認端口號是1521

10.使用哪個SELECT語句從系統日期中提取年份並以“1998”格式顯示?
A:

 SELECT TO_CHAR(SYSDATE,'yyyy') FROM dual;

B:

SELECT TO_DATE(SYSDATE,'yyyy') FROM dual;

C:

SELECT DECODE(SUBSTR(SYSDATE, 8), 'YYYY') FROM dual;

D:

SELECT DECODE(SUBSTR(SYSDATE, 8), 'year') FROM dual;

E:

SELECT TO_CHAR(SUBSTR(SYSDATE, 8,2),'yyyy') FROM dual;

參考答案:A

解析:
日期轉換用TO_CHAR(date,fmt)函數,date是將被轉換的日期,fmt指定轉換後的格式。

11.下列哪項不屬於關係型數據庫?
A:Oracle
B:SQL Server
C:HBase
D:MySql

參考答案:C

解析:
常見關係型數據庫有:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
HBase是列式非關係型數據庫

12.觀察employees表的表結構
在這裏插入圖片描述
選項中哪個update語句是有效的()
A:

  UPDATE employees
  SET first_name = 'John'
  SET last_name ='Smith'
  WHERE employee_id = 180;

B:

  UPDATE employees
  SET first_name = 'John',
  SET last_name ='Smith'
  WHERE employee_id = 180;

C:

  UPDATE employees
  SET first_name = 'John'
  AND last_name ='Smith'
  WHERE employee_id = 180;

D:

  UPDATE employees
  SET first_name = 'John', last_name ='Smith'
  WHERE employee_id = 180;

參考答案:D

解析:
一個update語句中只需寫一個SET子句,多個被更新的字段用逗號隔開。

13.觀察表EMPLOYEES 和NEW_EMPLOYEES的表結構
在這裏插入圖片描述

選項中哪個更新操作是有效的()
A:

  UPDATE new_employees SET name = (SELECT last_name||
  first_name
  FROM employees
  WHERE employee_id
  =180)
  WHERE employee_id =180;

B:

  UPDATE new_employees SET name = (SELECT
  last_name||first_name
  FROM employees )
  WHERE employee_id =180;

C:

  UPDATE new_employees SET name = (SELECT last_name ||
  first_name
  FROM employees
  WHERE employee_id
  =180)
  WHERE employee_id =(SELECT employee_id
  FROM new_employees);

D:

UPDATE new_employees SET name = (SELECT last_name||
  first_name
  FROM employees
  WHERE employee_id =
  (SELECT employee_id
  FROM new_employees))
  WHERE employee_id
  =180;

參考答案:A

解析:
B.子查詢查出了多行數據;
C.第二個子查詢得到了多行數據,但是where子句的運算符“=”只能指定一個值;
D.選項錯誤同上。

14.觀察下面employees表的表結構
在這裏插入圖片描述
執行下面SQL語句的結果爲:DELETE employees;
A:由於主鍵違規而出現錯誤。
B:EMPLOYEES表的數據和結構將被刪除。
C:EMPLOYEES表中的數據被刪除,但表結構依然存在。
D:因爲語句在語法上不正確而出錯。

參考答案:C

解析:
truncate tablename或 delete tablename:不刪除表的結構,只是刪除表中的數據;drop tablename:刪除表的表結構和數據。

15.您需要更改現有表的定義:
更改COMMERCIALS表的DESCRIPTION列以保存不超過1000字節的變長字符,該列當前每個值可以保存500個字節。 表包含20000行。
哪個SQL語句能夠完成該需求()

A:

ALTER TABLE commercials MODIFY (description CHAR2(1000));

B:

ALTER TABLE commercials CHANGE (description CHAR2(1000));

C:

ALTER TABLE commercials CHANGE (description VARCHAR2(1000));

D:

ALTER TABLE commercials MODIFY (description VARCHAR2(1000));

E:如果該列有數據,你不可以增加字段的長多。

參考答案:D

解析:
修改表結構的固定語法:
ALTER TABLE table_name MODIFY (column_name data_type);

16.觀察STUDENT_GRADES 表的表結構
在這裏插入圖片描述
一個學期有多個GPA,下列哪個語句能找到每個學期最高的GPA?

A:

SELECT MAX(gpa) FROM student_grades WHERE gpa IS NOT NULL;

B:

  SELECT (gpa)
  FROM student_grades
  GROUP BY semester_end
  WHERE gpa IS NOT NULL;

C:

  SELECT MAX(gpa)
  FROM student_grades
  WHERE gpa IS NOT NULL
  GROUP BY semester_end;

D:

  SELECT MAX(gpa)
  GROUP BY semester_end
  WHERE gpa IS NOT NULL
  FROM student_grades;

E:

  SELECT MAX(gpa)
  FROM student_grades
  GROUP BY semester_end
  WHERE gpa IS NOT NULL;

參考答案:C

解析:
在使用聚合函數時一定要考慮null值的情況。
想要查詢每學期的最高的GPA,必須要以學期(SEMESTER_END)分組,此時要考慮有些學生可能沒有參加考試(即GPA爲null)的情況,GPA爲null,oracle系統就會使某組的max(gpa)結果爲null,顯然這種情況是不符合要求的,要排除這種情況,就必須對null做處理,要麼將null用0代替,要麼直接去除null的情況,在這裏是求最大值,直接去除null不會影響最大值的情況,而且提前排除null,後續的計算量也會下降,所以此時選擇直接去除null,SQL語句的性能更高。

二、 多選題

1.關於where和having子句說法正確的有?(請選出兩項)
A:WHERE子句可用於限制行和組。
B:WHERE子句只能用於限制行。
C:HAVING子句可用於限制行和組。
D:HAVING子句只能用於限制組。
E:如果查詢使用HAVING子句,則不能在查詢中使用WHERE子句。
F:HAVING子句不能在子查詢中使用。

參考答案:BD

解析:
where只能用於行數據的篩選;having只能用於組數據的篩選。

2.下列關於視圖的說法,正確的有?(選出正確的三項)
A:視圖可以防止未經許可的用戶訪問敏感數據
B:創建視圖時,可以將列名改爲有意義的名稱,使用戶更容易理解列所代表的內容
C:定義的視圖中可以包含ORDER BY子句
D:不能爲視圖建立索引

參考答案:ABC

解析:
視圖上也可以建立索引,以便快速查詢

3.關於下面的SQL刪除語句,說法正確的是?(請選出四項)

DROP TABLE DEPT; 

A:無法回滾此語句。
B:所有待處理的事務都已提交。
C:基於DEPT表的所有視圖都將被刪除。
D:將刪除基於DEPT表的所有索引。
E:將刪除表中的所有數據,並刪除表結構。
F:將刪除表中的所有數據,但保留表的結構。

參考答案:ABDE

解析:
AB.DROP是DDL,會被隱式提交,所以無法回滾(只能回滾未提交的DML),其上的操作也被一併提交;
C.表被刪除,基於表的視圖不會被刪除,只是執行查詢操作的時候會報錯;
DEF.刪除表,基於表的索引、表結構都會被刪除。

4.下列查詢姓張的學生的語句不正確的是?(選出正確的三項)
A: select * from 表名 where 姓名 = ‘%張%’
B: select * from 表名 where 姓名 like ‘張’
C: select * from 表名 where 姓名 like ‘張%’
D: select * from 表名 where 姓名 = ‘張’

參考答案:ABD

解析:
LIKE 模糊查詢字符匹配操作可以使用通配符 “%” 和 “”:%:表示任意個字符,包括零個;:表示一個任意字符;題目要求查詢姓張的,所以需要張開頭的姓名。所以c是正確的.

5.我們需要在employee數據表中查出工號emp_no爲29346,24323的記錄,可以使用的SQL語句有?(選出正確的兩項)

A:SELECT * FROM employee WHERE emp_no=29346 OR emp_no=24323;
B:SELECT * FROM employee WHERE emp_no IN(29346,24323);
C:SELECT * FROM employee WHERE emp_no=29346 AND emp_no=24323;
D:SELECT * FROM employee WHERE emp_no NOT IN(29346,24323)=‘dl’);

參考答案:AB

6.觀察下表EMP
在這裏插入圖片描述
下列能夠查詢工號EMPNO在7300——7500之間的員工的姓名的SQL語句是?(請選出兩項)

A:

SELECT ENAME FROM EMP WHERE EMPNO IN(7300,7500);

B:

SELECT ENAME FROM EMP WHERE EMPNO BETWEEN 7300 AND 7500;

C:

SELECT ENAME FROM EMP WHERE EMPNO>7300 OR EMPNO<7500;

D:

SELECT ENAME FROM EMP WHERE EMPNO>7300 AND EMPNO<7500;

參考答案:BD

解析:
between and 的作用和> and <的作用相同

7.觀察下面employees表的表結構
在這裏插入圖片描述
您創建了一個名爲EMP_ID_SEQ的序列,以填充EMPLOYEES表的EMPLOYEE_ID列的序列值。 哪兩個語句關於EMP_ID_SEQ序列是正確的?(請選出兩項)

A:您不能使用EMP_ID_SEQ序列填充JOB_ID列。
B:修改EMPLOYEE_ID列時,EMP_ID_SEQ序列無效。
C:EMP_ID_SEQ序列本身不受對EMPLOYEES表的修改的影響。
D:架構中任何其他NUMBER數據類型的列都可以使用EMP_ID_SEQ序列。
E:刪除EMPLOYEES表時,將自動刪除EMP_ID_SEQ序列。
F:刪除EMPLOYEE_ID列時,將自動刪除EMP_ID_SEQ序列。

參考答案:CD

解析:
序列不屬於任何一張表,表可以用序列輔助插入一些數據,但是對錶的處理不會影響序列

8.觀察下面創建訂單(order)表的SQL語句
在這裏插入圖片描述

當你執行上面的SQL語句時候哪些列會自動創建索引(index)?(請選出兩項)
A:SER_NO
B:ORDER_ID
C:STATUS
D:PROD_ID
E:ORD_TOTAL
F:基於ORDER_ID and ORDER_DATE創建複合索引

參考答案:AF

解析:
oracle數據庫會在唯一約束和主鍵約束上自動創建索引

三、 綜合題

1.有一個學生成績單,要建立數據表把數據存儲此表中:需要包括的字段爲:
在這裏插入圖片描述
1.寫出創建表的語法,表名自定
2.查詢出生時間在1990-01-01後的學生所有課程成績
3.查詢學生總數
4.查詢該班學生Java基礎(課程編號爲000101)的平均成績

參考答案:
1、

CREATE TABLE STUDENT (
stuName VARCHAR2(60),
stuID VARCHAR(100),
stuBirthday DATE,
classID NUMBER(8),
stuScore NUMBER(5,2),
stuRemark VARCHAR2(400)
);
SELECT stuName,stuScore 
FROM STUDENT 
WHERE stuBirthday > TO_DATE('1990-01-01','yyyy-mm-dd');
SELECT count(DISTINCT(STUNAME)) "學生總數" FROM STUDENT;
SELECT AVG(stuScore) FROM STUDENT WHERE classID=000101

解析:
1、此處需要注意,oracle數據庫裏字符的概念是對英文來說的,但是一個漢字佔兩個字符,所以題目中要求插入n個漢字,在創建表時,字符的數量要寫2n。
2、這裏一定要注意字符到日期的轉換,我們輸入的‘1990-01-01’在系統看來是字符,當然字符跟日期是沒有辦法比較的(數據類型不同嘛),所以在比較之前一定要先將字符類型的‘1990-01-01’轉換成日期類型。
3、在學生成績表中查詢出所有學生,然後去除重複再計數,即得出學生總數
4、此題看似簡單,實則暗藏殺機,首先要想到一點,有些學生可能缺考,此時他的Java基礎的分數就爲null,但是系統對null會自動忽略,然後人數就會減少(少了Java基礎得分爲null的同學),顯然這種情況得出的平均分是不正確的(不信的話,假如系統不處理null的情況,老師爲了好看的平均分會讓成績差的同學缺考~~)。扯遠了,處理null可以用NVL(stuScore,0);假如stuScore爲null,就當成0來計算。

2.根據下面創建表的語句完成SQL查詢

Create table org_organization(
Organization_id        NUMBER(10)        not null,--組織結構ID(主鍵)
Parent_organization_id  NUMBER(10)        null,--從屬的上級組織結構ID
Organization_name     varchar(60)   not null,--組織機構名稱
Organization_desc      varchar(240)  null,--組織機構說
Organization_type      NUMBER(1)       not  null,--組織類型:1=智能型;2=業務型
Primary key(organization_id)
);

1.查詢組織結構ID大於“100”的所有組織機構的信息?
2.查詢“組織機構名稱”中包含“北京”的所有組織機構的信息?
3.查詢組織機構ID等於“1000”的組織機構的信息以及從屬的上級組織機構的信息?
4.統計“職能型”和“業務型”的組織機構,各有多少個?(注:用一條sql語句實現)

參考答案:
1.

SELECT*FROM org_organization WHERE Organization_id>100;
SELECT*FROM org_organization WHERE Organization_name LIKE '%北京%';
   SELECT ORG1.*,ORG2.* FROM org_organization org1 
   LEFT JOIN org_organization org2 
   ON ORG1.Parent_organization_id=ORG2.Organization_id
   WHERE Organization_id=1000;
 SELECT Organization_type,count(Organization_id) 
 FROM org_organization 
 GROUP BY Organization_type;

解析:
2、模糊查詢需要用like關鍵字,%是正則表達式的概念裏的通配符,代表0或多個字符,_代表1個字符。正則表達式在各種程序設計技術裏用到的都特別多,有興趣、學有餘力的同學可以到網上自學一下。
3、此題是簡單的連接查詢,由於組織機構和直接從屬上級機構在同一張表裏,所以需要將一張表以別名的形式當成兩張表來連接查詢,連接條件是ORG1.Parent_organization_id=ORG2.Organization_id,需要在結果裏篩選出Organization_id=1000的組織機構。
4、很明顯要使用分組查詢,分組的依據是Organization_type,然後統計出每組裏的Organization_id的數量即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章