資料庫總結(常見筆面試題)
資料庫
1.SQL *Plus 使用命令
sqlplus 使用者名稱 密碼 登入
sql /as sysdba 登入管理員
2.Orcle 預設埠1521 MySql 3306
3.三類sql語句
(1)ddl:資料定義語言 資料庫表的建立、刪除、修改
(2)dml:資料操作語言 資料庫的表資料增刪改查
(3)dcl:資料控制語言 使用者
4.簡單查詢
--虛表 SELECT (10+2)*3 FROM dual; --查詢系統時間 SELECT sysdate FROM dual;
5.空值的處理
NVL(comm,0) 將comm如果為空值,作0處理
6.別名(AS)
(1)也可以省略不寫
(2)中文用雙引號
(3)大小寫區分 使用雙引號
7.拼接(|| 或者 CONCAT(X1,X2))
8.去重(DISTINCT)
SELECT DISTINCT depno FROM emp;
SELECT DINTINCT depno,sal FROM emp;
9.過濾(WHERE)
10.日期、字串 (需要使用單引號)
11.模糊查詢:LIKE % 代表0個或多個字元 _代表一個字元
12.排序:ORDER BY (ASC 升序,DESC 降序)
可以按照 列名,別名,那一列(如2),多列進行排序
分組:GROUP BY
13. 空值在排序時按照最大值
14.單行函式:
(1)大小寫轉換 UPPER LOWER
(2)字串拼接 CONCAT(X1,X2)
(3)擷取
SELECT SUBSTR('hello world',2,20) FROM dual;
SELECT TIRM('H' FROM 'HELLO WORLD') FROM dual;
(4)獲得長度
SELECT LENGTH('Hello world') FROM dual;
(5)補齊函式
SELECT LPAD(sal,10,'0') FROM emp;
SELECT RPAD(sal,10,'0') FROM emp;
(6)替換
SELECT REPLACE('hello','o','a') FROM dual;
15.日期相關
兩月相差月數 MONTHS_BETWEEN
向指定日期加上若干月數 ADD_MONTHS
指定日期的下一天 NEXT_DAY
本月最後一天 LAST_DAY
日期四捨五入 ROUND
16.資料型別
字串:CHAR VARCHAR VARCHAR2
CHAR(10) 固定長度,VARCHAR(10)長度可變,VARCHAR2 Orale特有
數字型別:NUMBER(5),NUMBER(7,2)
17.型別轉換
隱式轉換:
SELECT '92'+2 FROM dual; --字串轉化為數字
SELECT '95'||2 FROM dual; --數字轉換為字串
顯示轉換:
SELECT TO_CHAR(sysdate,'yyyy-mm-dd') FROM dual;
SELECT * FROM emp
WHERE hiredate < TO_DATE('1981-04-02','yyyy-mm-dd');
18.單行函式和多行函式區別
單行函式:作用於一行資料,返回一個值
多行函式:作用於多行資料,返回一個值
19.多行函式:
最大最小值:MAX(),MIN()
平均值:AVG
計算和:SUM
統計數量:COUNT (空值不作計數)
20. WHERE和HAVING的區別
WHERE:先過濾後分組
SELECT deptno,COUNT(empno) FROM emp
WHERE deptno != 10
GROUP BY deptno;
HAVING:先分組後過濾
SELECT deptno,COUNT(empno) FROM emp
GROUP BY deptno
HAVING deptno != 10;
21.單行子查詢和多行子查詢的操作符
單行子查詢操作符:> < <> != = >=
多行子查詢操作符:IN(列表中的任何一個)
ANY(子查詢的任意一個)
ALL(子查詢的所有值)
22.集合:
並集:UNION/UNION ALL
交集:INTERSECT
差集:MINUS
23.多表查詢:
Oracle 標準:
(1)等值連線
--等值連線(可以加上別名,但是有了別名就不能有真名)
SELECT ename ,sal, e.deptno, dname,loc FROM emp e, dept d
WHERE e.deptno = d.deptno;
(2)非等值連線
--查詢大於所在部門平均薪水的員工
-- 薪水大於平均薪水 員工的部門編號 = 平均薪水的部門
SELECT * FROM emp e1,(SELECT deptno, AVG(sal) avg_sal FROM emp GROUP BY deptno) e2
WHERE e1.sal > e2.avg_sal AND e1.deptno = e2.deptno;
(3)外連線:想要那邊顯示的全,在那邊加上 +
(4)自連線
--多表查詢-自連線
SELECT e1.* FROM emp e1,emp e2
WHERE e1.deptno = e2.deptno AND e2.ename = 'SMITH';
SQL99標準:
(1)自然連線:
使用自然連線,自動匹配列名相同的 NATUARL JOIN
SELECT ename,dname FROM emp
NATURAL JOIN dept;
USING指明比較列名
SELECT ename,dname FROM emp
JION demp
USING (depno);
使用ON
SELECT ename,dname FROM emp
JOIN dept
ON (emp.deptno = dept.deptno AND dept.deptno != 20);
(2)外連線(OUTER 關鍵字可以省略)
SELETE ename,dname from emp
LEFT OUTER JOIN dept --左LEFT 右RIGHT 滿FULL
ON dept.deptno = emp.deptno;
24.Oracle不會自動提交事務,MySql會自動提交事務
25.新增資料:INSERT
INSERT INTO my_emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES(1000,'李四','測試',1100,sysdate,5000,2000,30);
COMMIT;
26.修改資料:UPDATE
UPDATE my_emp;
SET ename = '小明'
WHERE empno= 1002
COMMIT;
27.刪除:DELETE
DELETE FROM my_emp
WHERE empno = 1003;
COMMIT;
28.建立表
CREATE TABLE student
(s_id NUMBER(2),
s_name VARCHAR2(100));
29.設定預設值 :DEFAULT
s_age NUMBER(2) DEFAULT 18
30.刪除表
DROP TABLE student; -- 表資料結構都被刪除
DELETE TABLE student; -- 刪除表資料
TRUNCATE TABLE student; --刪除表資料
31.TRUNCATE 和 DELETE的區別
TRUNCATE:不能回滾,不能加過濾條件
DELETE:能回滾,能加過濾條件
32.修改表
(1)新增列 ADD
ALERT TABLE student
ADD(email VARCHAR2(100));
(2)修改列 MODIFY
ALERT TABLE student
MODIFY(email VARCHAR2(100) NOT NULL);
(3)刪除列 DROP
ALERT TABLE student
DROP email ;
(4)列重新命名 RENAME
ALERT TABLE student
RENAME email TO s_email ;
33.修改表名稱
RENAME TABLE emp TO emps;
34.約束型別
主鍵:PRIMARYKEY 非空約束+唯一性約束
外來鍵:FOREIGNKEY 用於表之間建立關係
非空:NULL
唯一:UNIQUE
檢查:CHECK
CREATE TABLE person
(
p_id NUMBER(4) PRIMARY KEY, --主鍵
p_name VARCHAR2(4) NOT NULL,--非空約束
email VARCHAR2(11) UNIQUE ,--唯一性約束
age NUMBER(2) CHECK (age >= 18)--檢查約束
);
35.外來鍵約束 CONSTRAINT card_id REFERENCES id_card(card_id)
36.賦許可權 grant creat view scott; 賦建立檢視許可權
37.檢視
檢視是基於一個表或多個表或檢視的虛表,簡單來說,可以將檢視理解為,已經儲存起來的SELECT語句
38.檢視的優點:
(1)簡化複雜查詢
(2)限制資料訪問
(3)同樣的資料,可以有不同的顯示方式
39.建立檢視
CREATE OR REPLACE VIEW emp_view
AS deptno, AVG(sal) avg_sal,MAX(sal) max_sal,MIN(sal) min_sal FROM emp
GROUP BY deptno;
WITH READ ONLY; --只讀檢視
40.檢視檢視
SELECT * FROM emp_view;
41.刪除檢視
DROP VIEW emp_view;
42.序列
序列:供多個使用者用來產生唯一數值的資料庫物件,主要用來實現主鍵自增
MySql 可以設定主鍵自增,Oracle不行,需要通過序列來實現
45.建立序列
--建立一個產生學生主鍵的序列
CREATE SEQUENCE s_sequence ;
INSERT INTO student
VALUES(s_sequence.nextval,'張'||s_sequence.currval,18+s_sequence.currval);
.nextval --下一個序列值 .currval 當前序列值
44.索引:加快查詢速度
45.建立索引
(1) 單個索引
CREATE INDEX id_index
ON student(s_id);
(2)聯合索引
CREATE INDEX id_age_index
ON student (s_id,s_age));
46.DDL語句
(1)建立一個使用者
create user guigu identfided by guigui
(2)登入
sqlplus guigu/guigu
47.事務的四大特性 ACID
原子性:一個事務必須視為一個不可分割的最小單元,整個事務中,要麼都提交完成 ,要麼全部回滾。
一致性:事務前後,資料總額相等
隔離性:所有操作在提交前,其他事務是不可見的
永續性:一旦事務提交,對資料的改變是永久性的
48.隔離級別
隔離級別 |
髒讀 |
不可重複讀 |
幻讀 |
未提交讀 |
是 |
是 |
是 |
已提交讀 |
否 |
是 |
是 |
可重複(MySql預設) |
否 |
否 |
是 |
序列化 |
否 |
否 |
否 |
髒讀:事務A讀取了事務B還未提交的資料
不可重複讀:兩次的讀的資料不一致
幻讀:事務A和B都修改了資料,在事務A看來,修改的不一樣
49. MYISAM 和 INNODB的區別
MYISAM:不支援事務,不支援外來鍵,查詢總行數時,不需要全表掃描
INNODB:支援外來鍵和事務,查詢總行數時需要進行全表掃描
50.索引的優缺點,什麼情況下使用
優點:提高查詢效率
缺點:更新資料時效率低,因為要同時更新索引
如果資料要進行頻繁地查詢時建立索引,如果頻繁修改資料,不建議使用索引
51.Sql語句的優化
(1)儘量使用索引進行查詢
(2)儘量用UNION ALL 而不是UNION
(3)用WHERE替代HAVING
(4)減少 * 號的使用
(5)可以過濾掉最大數量記錄的條件必須寫在WHERE子句的之右
(6)用TRUNCATE替代DELETE
(7)用 >= 替代 >
52.在定義主鍵和唯一性約束時,會自動建立索引
53.樂觀鎖和悲觀鎖
悲觀鎖:假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作
實現方式:資料庫鎖機制
樂觀鎖:假設不會發生併發衝突,只在提交時檢查是否違反資料完整性
實現方式:使用Version版本或者時間戳
54. 寫出一條Sql語句:取出表A中第31到第40記錄 (Mysql)
SELECT * FROM A LIMIT 30,10;
55. 寫出一條Sql語句:取出表A中第31到第40記錄 (Oracle)
SELETE * FROM(SELETE t.*,rownum RN FROM (SELECT * FROM A) t) WHERE RN BETWEEN 31 AND 40;
補充
1.Sql語句的SELETE語句完整的執行順序
(1)FROM子句
(2)WHERE
(3)GROUP BY
(4)使用HAVING 進行過濾
(5)計算所有的表示式
(6)SELECT欄位
(7)ORDER BY
FROM(生成笛卡爾積)->JOIN ON(篩選)->WHERE(過濾)->GROUP BY(進行分組)-> HAVING(過濾)->SELECT(處理SELECT語句)->DINTINCT(去重)->ORDER BY(排序)
2.儲存過程以及使用的好處
儲存過程是一組為了完成特定功能的SQL語句集,經過編譯儲存在資料庫中,來供使用者使用。
優點:SQL程式碼封裝和執行效率的提高(因為SQL語句要進行分析和編譯、優化等)
3.在千萬級的資料庫查詢中,如何提高效率
儘量避免全域性掃描和WHERE子句對NULL值的判斷(會導致搜尋引擎放棄索引)
4.如果只有一個返回值,用儲存函式;否則,就用儲存過程
5.PL/SQL
(1)“Hello World!” 入門程式
declare
說明部分 (變數說明,游標申明,例外說明 )
begin
語句序列
dbms_output.put_line(‘hello world’);
exception
例外處理語句
end;
(2)賦值是使用冒號等號“:=”(中間不能有空格)
(3)說明變數 (char, varchar2, date, number, boolean, long)
(4)為變數傳值
declare
vname varchar(30);
vsal number(10);
begin
select ename, sal into vname, vsal from emp where empno = &empno;
dbms_output.put_line(vname || vsal);
end;