Java常见面试题之SQL基础
生活随笔
收集整理的這篇文章主要介紹了
Java常见面试题之SQL基础
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
SQL?基礎考核1、數據庫三大范式
2、varchar?和char?的區別?
3、drop、delete、truncate?區別?
4、UNION和?UNIONALL?的區別?
5、SOL語句執行的很慢的原因是什么?
6、SOL之連接查詢
7、SOL之聚合函數
8、SQL?Select?語句完整的執行順序:
9、數據庫鎖
10、MySQL?常用?SQL?查詢語句優化方法【必問】
SQL?基礎考核
1、數據庫三大范式
**第一范式**:確保每列保持原子性,數據表中的所有字段值都是不可分解的原子值。這是第一范式只有一張表 ,七個字段在業務中不可再拆分:| 訂單 id | 商品 id | 用戶 id | 商品名稱 | 商品數量 | 用戶地址 | 用戶電話 |
| ------- | ------- | ------- | -------- | -------- | -------- | -------- |
| 1 | 1 | 1 | Java | 1 | 杭州 | 110 |
| 1 | 2 | 2 | C++ | 1 | 上海 | 120 |
| 2 | 2 | 3 | C++ | 1 | 北京 | 114 |**第二范式**:確保表中的每列都和主鍵相關。第二范式分成 2 表 訂單明細表和用戶表 ,一張表只描述一個事件,第一范式中有兩件事,一個用戶,一個訂單。| 訂單 id | 商品 id | 用戶 id | 商品名稱 | 商品數量 |
| ------- | ------- | ------- | -------- | -------- |
| 1 | 1 | 1 | Java | 1 |
| 1 | 2 | 2 | C++ | 1 |
| 2 | 2 | 3 | C++ | 1 || 用戶 id | 用戶地址 | 用戶電話 |
| ------- | -------- | -------- |
| 1 | 杭州 | 110 |
| 2 | 上海 | 120 |
| 3 | 北京 | 114 |第三范式:確保每列都和主鍵列直接相關而不是間接相關。第三范式分成 3 表 繼續拆分訂單明細表,添加商品表,一張表中非主鍵字段只依賴主鍵,不傳遞依賴,商品名稱只依賴商品 ID,不依賴訂單 ID。| 訂單 id | 商品 id | 用戶 id | 商品數量 |
| ------- | ------- | ------- | -------- |
| 1 | 1 | 1 | 1 |
| 1 | 2 | 2 | 1 |
| 2 | 2 | 3 | 1 || 商品 id | 商品名稱 |
| ------- | -------- |
| 1 | C++ |
| 2 | C++ |
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |最后提下,三大范式在實際中也不是必須嚴格遵循的,根據業務可以靈活調整,并不是一成不變的。
2、varchar?和char?的區別?
1. varchar 表示**變長**,char 表示長度**固定**。 2. 存儲容量不同,對于 char 來說,最多能存放的字符個數為 255。對于 varchar,最多能存放的字符個數是 65535。 3. 存儲速度不同,char 長度固定,存儲速度會比 varchar 快一些,但在空間上會占用額外的空間,屬于一種空間換時間的策略。而 varchar 空間利用率會高些,但存儲速度慢,屬于一種時間換空間的策略。3、drop、delete、truncate?區別?
? drop:刪除表、不可恢復、速度快? delete:刪除表的數據、可恢復、速度慢? truncate:刪除表結構和數據、表還存在、不可恢復、速度較快4、UNION和?UNIONALL?的區別?
1. 相同點:union 和 union all 的作用都是將**兩個結果集合并到一起**。 2. 不同點:**union** 會對結果**去重并排序**,union all 直接直接返回合并后的結果,**不去重也不進行排序**。union all 的性能比 union 性能好。5、SOL語句執行的很慢的原因是什么?
1. 如果 SQL 語句只是偶爾執行很慢,可能是執行的時候遇到了鎖,也可能是 redo log 日志寫滿了,要將 redo log 中的數據同步到磁盤中去。 2. 如果 SQL 語句一直都很慢,可能是字段上沒有索引或者字段有索引但是沒用上索引。6、SOL之連接查詢
1. 左連接(左外連接)以**左表為基準**進行查詢,左表數據會全部顯示出 來, 右表 如果和左表匹配 的數據則顯示相應字段的數據,如果不匹配,則顯示為NULL;2. 右連接(右外連接)以**右表為基準**進行查詢,右表數據會全部顯示出 來, 右表 如果和左表匹配的數據則顯示相應字段的數據,如果不匹配,則顯示為NULL;3. 全連接就是**兩表為基準**先以左表進行左外連接,然后以右表進行右外連接。4. 內連接:顯示表之間有連接匹配的所有行。內連接(交集)、外連接(并集)7、SOL之聚合函數
? 聚合函數是對一組值進行計算并返回單一的值的函數,它經常與 select語句中的 group by 子句一同使用。1. avg():返回的是指定組中的平均值,空值被忽略。 2. count():返回的是指定組中的項目個數。 3. max():返回指定數據中的最大值。 4. min():返回指定數據中的最小值。 5. sum():返回指定數據的和,只能用于數字列,空值忽略。8、SQL?Select?語句完整的執行順序:
select * from student where 班級=1班 group by sex having sex>'男'order by id? 查詢中用到的關鍵詞主要包含六個, 并且他們的順序依次為select--from--where--group by--having--order by其中 select 和 from 是必須的,其他關鍵詞是可選的, 這六個關鍵詞的執行順序如下:? from: 需要從哪個數據表檢索數據? where: 過濾表中數據的條件? group by: 如何將上面過濾出的數據分組算結果? having:和group by配合使用、分組后篩選? order by : 按照什么樣的順序來查看返回的數據9、數據庫鎖
1. 行鎖:粒度最小的鎖,表示只針對當前操作的行進行加鎖; 2. 表鎖:粒度最大的鎖,表示當前的操作對整張表加鎖; 3. 頁鎖:粒度介于行級鎖和表級鎖中間的一種鎖,表示對頁進行加鎖。10、MySQL?常用?SQL?查詢語句優化方法【必問】
**SQL優化:**- 定位要優化的SQL語句 - **分析SQL語句執行效率**( explain select * from emp where ename like '%A%';) - 給出SQL優化方案``` 1.頻繁出現在where 或者order by子句中的列,建索引 2.在查詢時,盡量避免在where子句中使用null值判斷 3.在查詢時,盡量避免在where子句中使用!=或者<>運算符 --- 索引引擎會使用全表掃描而不會使用索引 4.在查詢時,盡量避免在where子句中使用or運算符--- 索引引擎會使用全表掃描而不會使用索引 5.在查詢時,in語句要慎用,可以exist替換; 6.在查詢時,不建議用'%key%'的格式進行模糊查詢--- 索引引擎會使用全表掃描而不會使用索引 7.在查詢時,對連續的值,能使用 between就不要用in 8.在查詢時,盡量避免在where子句中對使用表達式或使用函數-- 索引引擎會使用全表掃描而不會使用索引 9.避免頻繁的創建和刪除臨時表,以減少對系統表資源的消耗 10.只含有數值的值盡量不要設為字符型; 11.盡量不要使用*,而用字段名替換 12.盡量避免大事務操作(運時間過久,長時間不提交的事務)總結
以上是生活随笔為你收集整理的Java常见面试题之SQL基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10 清除 PowerShell
- 下一篇: Java回形数问题