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