天天看點

【Oracle】和【Mysql】常問面試題

主鍵自增差別:

【Oracle】

create table mytable
(
    id int primary key,   -- 主鍵,唯一,不能重複,必填,不能不填寫
	name varchar(20),
	money float
);
-- 使用序列讓主鍵自增
-- 建立序列
create sequence myseq;  --從0開始 每次加1
--使用序列
insert into mytable(id,name,money) values(myseq.nextval,'jack',10);
           

【Mysql】

                 設定自動遞增     ----  AUTO_INCREMENT

分組語句差別:

【Oracle】

-- 工資最高  當聚合函數與真實列同時存在時,必須對真實列進行分組
SELECT ENAME, MAX(SAL) FROM EMP
GROUP BY ENAME;  --分組
-- 工資最低  當聚合函數與真實列同時存在時,必須對真實列進行分組
SELECT ENAME,MIN(SAL) FROM EMP
GROUP BY ENAME;

-- 每種職位的最高薪資是多少
SELECT DISTINCT JOB,MAX(SAL) 最高薪資 FROM EMP
WHERE JOB IS NOT NULL
GROUP BY JOB;

-- 每種職位的人數
SELECT JOB,COUNT(EMPNO) FROM EMP
GROUP BY JOB;


GROUP BY注意事項: 
1、當聚合函數與真實列同時存在時,必須對真實列進行分組
2、GROUP BY後面寫的的列的名字必須和查詢真實列的名字,一模一樣
3、除了查詢的列,還可以寫其他真實列
4、會将GROUP BY後面寫的列的内容組合在一起進行判斷,如果内容一樣則判定為同組,如果不一樣分組
5、GROUP BY 寫在WHERE後面



having
--  每個部門員勞工數  超過5  HAVING 即可對真實列進行條件篩選,也可以對僞列進行篩選
SELECT DEPTNO ,COUNT(*) C FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*) > 5  AND DEPTNO = 30;
           

【Mysql】

                MySQL沒有此限制,會自動取第一行。

分頁的差別:

【Oracle】

oracle使用rownum僞列
    -- 優化後的SQL語句

	SELECT * FROM (SELECT E.*,ROWNUM RW FROM EMP E WHERE ROWNUM <= 10) MYEMP
	WHERE  MYEMP.RW >= 5 

	 注意rownum不能使用> >= =;
           

【Mysql】

Mysql使用limit關鍵字

    select * from table limit 5;--擷取前5條資料
    select * from table limit index,psize;--index 頁數  psize--每頁顯示條數
           

MyBatis動态sql中#和$的差別

1.#和$兩者含義不同

(1)#會把傳入的資料都當成一個字元串來處理,會在傳入的資料上面加一個雙引号來處理。

(2)$則是把傳入的資料直接顯示在sql語句中,不會添加雙引号。

2.兩者的實作方式不同

(1) $作用相等于是字元串拼接

(2) #作用相當于變量值替換

3、#和$使用場景不同

(1) 在sql語句中,如果要接收傳遞過來的變量的值的話,必須使用#。因為使用#是通過PreparedStement接口來操作,可以防止sql注入,并且在多次執行sql語句時可以提高效率。

(2) $隻是簡單的字元串拼接而已,是以要特别小心sql注入問題。對于sql語句中非變量部分,那就可以使用$,比如$方式一般用于傳入資料庫對象(如傳入表名)。