一、 單選題
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的數量即可。