1. 程式人生 > >資料庫總結(常見筆面試題)

資料庫總結(常見筆面試題)

資料庫

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;