java面試—mysql資料庫
MYSQL
一、sql的select語句完整的執行順序
1.sql select的執行順序:
1)、from組裝來自不同資料來源的資料;
2)、where基於指定的條件對記錄進行篩選;
3)、group by將資料劃分為多個分組
4)、使用聚集函式進行計算
5)、使用having篩選分組
6)、計算所有的表示式;
7)、select的欄位
8)、使用order by對結果集進行排序
2.sql查詢處理的步驟序號:(**這些步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入,這些虛擬表對呼叫者不可用,只有最後一步生成的表才會給呼叫者使用,)
1)、FROM<left_table>
2)、<join_type>JOIN<right_table>
3)、ON <join_condition>
4)、WHERE<where_condition>
5)、GROUP BY<group_by_list>
6)、WITH{CUBE|ROLLUP}
7)、HAVING<having_condition>
8)、SELECT
9)、DISTINCT
10)、ORDER BY<order_by_list>
11)、<TOP_specification><select_list>
3.邏輯查詢處理:
1)、FROM:對from中的前兩個表執行笛卡爾積,生成虛擬表vt1
2)、on:對vt1應用on篩選器,插入tv2
3)、outer(join):如果指定louter join(cross join或inner join),保留表中未找到匹配的行將作為外部行新增到vt2,生成vt3.如果from子句包含兩個以上表,則對應一個聯接生成的結果表和下一個表重複執行步驟1到3;直到處理完所有的表位置。
4)、where:對tv3篩選,只有true的行才插入到tv4
5)、group by:按group by中列列表對tv4中的進行分組,生成tv5
6)、cute|rollup:把超組插入vt5,生成vt6
7)、having:對vt6應用到篩選器,為true的插入到vt7
8)、select:處理select列表,生成vt8
9)、distinct:將重複行從vt8中刪除。生成vt9
10)、order by:將vt9中行按order by子句中列列表順序,生成一個遊標:vc10
11)、top:從vc10中開始處選擇指定數量或比例的行,生成表tv11,返回給呼叫者;
二、sql之聚合函式:
聚合函式是一對值進行計算並返回單一的值的函式,它經常與select語句中的group by子句一同使用;
1)、avg():返回的是指定組中的平均值,空值被忽略。
2)、count():返回的是指定組中的總數;
3)、max():返回指定資料中最大值;
4)、min():返回指定資料中最小值;
5)、sum():返回指定資料和,只能用於數字列,空值被忽略;
6)、group by():對資料進行分組,對執行完group by之後的組進行聚合函式的運算,計算每一組的值,最後用having去掉不符合條件的組,having子句中的每一個元素必須出現在select列表中(只針對mysql)
三、sql之連線查詢(左連結和右連線區別)
1.外連線:
1)、左連線(左外連線):以左表為基準進行查詢,左表資料會全部顯示出來,右表如果和左表匹配的資料則顯示相應欄位的資料,如果不匹配則顯示null;
2)、右連線(右外連線):以右表作為基準進行查詢,右表資料會全部顯示出來,左表如果和右表匹配的資料則顯示相應欄位的資料,如果不匹配則顯示為null;
3)、全連線:先以左表進行左外連線,再以右表進行右外連線
4)、內連線:顯示錶之間有連線匹配的所有行
2.內連線
顯示錶之間有連線匹配的所有行
四、sql注入
通過在web表單中輸入sql語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖執行sql語句。
防止sql注入:
1.預編譯語句:如select * from user where username=?,sql語句語義不會發生改變,sql語句中變數用?表示,傳遞引數是什麼就是什麼;
2.mybatis框架中mapper方式中#也能很大程式防止sql注入($無法防止sql注入)
五、mysql效能優化
1.當只要一行資料使用limit 1
查詢時如果已知會得到一條資料,這種情況下加上limit 1 會增加效能。因為mysql資料庫引擎會在找到一條結果停止搜尋,而不是繼續查詢下一條是否符合標準直到所有記錄查詢完畢。
2.選擇正確的資料引擎
mysql中有兩個引擎myisam和innodb,每個引擎有利有弊
1)、myisam適用於一些大量查詢的應用,但對於有大量寫功能的應用不是很好,甚至你只需要update一個欄位整個表都會被鎖起來,而別的程序就算是讀操作也不行要等到當前update操作完成之後才能繼續進行,另外,myisam對於select count(*)這類操作是超級快的。
2)、innodb的趨勢會是一個非常複雜的儲存引擎,對於一些小的應用會比myisam還慢,但是支援“行鎖”,所以在寫操作比較多的時候會比較優秀。並且,它支援很多的高階應用(事物);
3.用not exists代替not in
not exists用到了連線能夠發揮已經建立好的索引的引用,not in不能使用索引。not in是最慢的方式要同每條記錄比較,在資料量比較大的操作不建議使用;
4.對操作符的優化,儘量不採用不利於索引的操作符如:(in 、not in, is null, is not null ,<> 等)
建立索引:
mysql中可以利用alter table語句來為表中的欄位新增索引,語法為:alter table 宣告 add index(欄位名);
六、mysql事物
mysql和其他的資料庫產品有一個很大的不同就是事物由儲存引擎所決定,例如:myisam,memory,archive都不支援事務,事務就是為了解決一組查詢要麼全部執行成功,要麼全部執行失敗,
mysql事務預設是採取自動提交的模式,除非顯示開始一個事務。
修改自動提交模式,0=off,1=on
七、事務的四大特徵
原子性,一致性,隔離性,永續性
1.原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾到事務開始前狀態,就像這個事務從來沒有執行過一樣;
2.一致性:在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
3.隔離性:隔離狀態執行事務,是他們好像是系統在給定時間內執行的唯一操作,如果有兩個事務,執行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事物在系統中認為只有該事務在使用系統,這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化和序列化請求,使得在同一時間僅有一個請求用於同一資料。
4.持久化:在事務完成以後,該事務所對資料庫所做的更改便持久的儲存在資料庫之中,並且不會被回滾;
八、mysql中四種隔離級別
1.讀未提交:未提交讀隔離級別也叫髒讀,就是事務可以讀取其他事務未提交的資料。
2.讀已提交:在其他資料庫系統如sql server預設的隔離級別就是提交讀,已提交讀隔離級別就是在事務未提交之前所做的修改其他事務是不可見的。
3.可重複讀:保證同一個事務中的多次相同的查詢的結果是一致的,比如一個事務一開始查詢了一條記錄然後過了幾秒鐘又執行了相同的查詢,保證兩次查詢的結果是相同的,可重複讀也是mysql的預設隔離級別;
4.可序列化:可序列化就是保證讀取的範圍內沒有新的資料插入,比如事務第一次查詢得到某個範圍的資料,第二次查詢也同樣得到了相同範圍資料,中間沒有新的資料插入到該範圍中。
九、mysql儲存過程建立