mysql -u username -pnode
二、如何開啓/關閉mysql服務
service mysql start/stopmysql
三、查看mysql的狀態
service mysql statuslinux
四、如何顯示數全部數據庫
show databases面試
五、如何獲取表內全部字段對象的名稱和類型
describe table_name;算法
六、MYSQL支持事務嗎?
在缺省模式下,MYSQL是autocommit模式的,全部的數據庫更新操做都會即時提交,因此在缺省狀況下,mysql是不支持事務的。
可是若是你的MYSQL表類型是使用InnoDB Tables 或 BDB tables的話,你的MYSQL就可使用事務處理,使用SET AUTOCOMMIT=0就可使MYSQL容許在非autocommit模式,在非autocommit模式下,你必須使用COMMIT來提交你的更改,或者用ROLLBACK來回滾你的更改。
示例以下:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;sql
七、MYSQL相比於其餘數據庫有哪些特色?
MySQL是一個小型關係型數據庫管理系統,開發者爲瑞典MySQL AB公司,如今已經被Sun公司收購,支持FreeBSD、Linux、MAC、Windows等多種操做系統與其餘的大型數據庫例如Oracle、DB2、SQL Server等相比功能稍弱一些
一、能夠處理擁有上千萬條記錄的大型數據
二、支持常見的SQL語句規範
三、可移植行高,安裝簡單小巧
四、良好的運行效率,有豐富信息的網絡支持
五、調試、管理,優化簡單(相對其餘大型數據庫)數據庫
八、varchar和char的區別
Char是一種固定長度的類型,varchar是一種可變長度的類型安全
九、數據庫事物有哪幾種?
隔離性、持續性、一致性、原子性服務器
十、請簡潔地描述下MySQL中InnoDB支持的四種事務隔離級別名稱,以及逐級之間的區別?
SQL標準定義的四個隔離級別爲:
read uncommited:讀取未提交內容
read committed:讀取提交內容
repeatable read:可重讀
serializable:可串行化
詳細解釋以下:
Read Uncommitted(讀取未提交內容)
在該隔離級別,全部事務均可以看到其餘未提交事務的執行結果。本隔離級別不多用於實際應用,由於它的性能也不比其餘級別好多少。讀取未提交的數據,也被稱之爲髒讀(Dirty Read)。
Read Committed(讀取提交內容)
這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它知足了隔離的簡單定義:一個事務只能看見已經提交事務所作的改變。這種隔離級別也支持所謂的不可重複讀(Nonrepeatable Read),由於同一事務的其餘實例在該實例處理其間可能會有新的commit,因此同一select可能返回不一樣結果。
Repeatable Read(可重讀)
這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到一樣的數據行。不過理論上,這會致使另外一個棘手的問題:幻讀(Phantom Read)。簡單的說,幻讀指當用戶讀取某一範圍的數據行時,另外一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的「幻影」 行。InnoDB和Falcon存儲引擎經過多版本併發控制(MVCC,Multiversion Concurrency Control 間隙鎖)機制解決了該問題。注:其實多版本只是解決不可重複讀問題,而加上間隙鎖(也就是它這裏所謂的併發控制)才解決了幻讀問題。
Serializable(可串行化)
這是最高的隔離級別,它經過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每一個讀的數據行上加上共享鎖。在這個級別,可能致使大量的超時現象和鎖競爭。
對於不一樣的事務,採用不一樣的隔離級別分別有不一樣的結果。不一樣的隔離級別有不一樣的現象。主要有下面3種如今:
一、髒讀(dirty read):一個事務能夠讀取另外一個還沒有提交事務的修改數據。
二、非重複讀(nonrepeatable read):在同一個事務中,同一個查詢在T1時間讀取某一行,在T2時間從新讀取這一行時候,這一行的數據已經發生修改,可能被更新了(update),也可能被刪除了(delete)。
三、幻像讀(phantom read):在同一事務中,同一查詢屢次進行時候,因爲其餘插入操做(insert)的事務提交,致使每次返回不一樣的結果集。
不一樣的隔離級別有不一樣的現象,並有不一樣的鎖定/併發機制,隔離級別越高,數據庫的併發性就越差,4種事務隔離級別分別表現的現象以下表:
網絡
十一、mysql數據庫引擎MyISAM和InnoDB的區別
十二、mysql有關權限的表都有哪幾個
MySQL服務器經過權限表來控制用戶對數據庫的訪問,權限表存放在mysql數據庫裏,由mysql_install_db腳本初始化。這些權限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結構和內容:
user權限表:記錄容許鏈接到服務器的用戶賬號信息,裏面的權限是全局級的。
db權限表:記錄各個賬號在各個數據庫上的操做權限。
table_priv權限表:記錄數據表級的操做權限。
columns_priv權限表:記錄數據列級的操做權限。
host權限表:配合db權限表對給定主機上數據庫級操做權限做更細緻的控制。這個權限表不受GRANT和REVOKE語句的影響。
1三、mysql存儲引擎有哪些?如何修改mysql存儲引擎?
MyISAM indexed sequential access method (有索引的順序訪問方法)
MyISAM 具備檢查和修復表格的大多數工具。表格能夠被壓縮,並且支持全文收索
不是事務安全的,並且不支持外鍵。
MEMORY 也是之前的(HEAP) 該類型表存儲在內存中,表的索引是哈希分佈的。
merge 這些表爲了查詢目的,把myisam 表集合做爲單個表,所以你能夠在某些操做系統中避開最大文件大小的限制。
archive 這種類型的表只支持,insert ,select 不支持delete,update,replace ,不使用索引。
csv 這些表保存在服務器的單個文件中,它包含了用逗號間隔的數據。
innodb 這種表是事務安全的。提供了commit(提交) rollback(實務回滾)支持外鍵,比myisam慢。
修改mysql存儲引擎alter table tablename type = innodb;
1四、MYSQL 數據表修復及數據恢復面試題
MYSQL數據表在什麼狀況下容易損壞?服務器忽然斷電致使數據文件損壞。
強制關機,沒有先關閉mysql 服務等。 數據表損壞後的主要現象是什麼?
從表中選擇數據之時,獲得以下錯誤:Incorrect key file for table: ‘…’. Try to repair it
查詢不能在表中找到行或返回不徹底的數據。
Error: Table ‘p’ is marked as crashed and should be repaired 。
打開表失敗: Can’t open file: ‘×××.MYI’ (errno: 145) 。 數據表損壞的修復方式有哪些?
使用 myisamchk 來修復,具體步驟:
1)修復前將mysql服務中止。
2)打開命令行方式,而後進入到mysql的/bin目錄。
3)執行myisamchk –recover 數據庫所在路徑/*.MYI
使用repair table 或者 OPTIMIZE table命令來修復,REPAIR TABLE table_name 修復表 OPTIMIZE TABLE table_name 優化表 REPAIR TABLE 用於修復被破壞的表。
OPTIMIZE TABLE 用於回收閒置的數據庫空間,當表上的數據行被刪除時,所佔據的磁盤空間並無當即被回收,使用了OPTIMIZE TABLE命令後這些空間將被回收,而且對磁盤上的數據行進行重排(注意:是磁盤上,而非數據庫)
1五、MYSQL數據庫服務器性能分析的方法命令有哪些?
Show status
一些值得監控的變量值:
Bytes_received和Bytes_sent
和服務器之間來往的流量。
Com_*服務器正在執行的命令。
Created_*在查詢執行期限間建立的臨時表和文件。
Handler_*存儲引擎操做。
Select_*不一樣類型的聯接執行計劃。
Sort_*幾種排序信息。
Show session status like ‘Select’;
Show profiles
SET profiling=1;
Show profiles\G
Show profile;
1六、 mysql裏記錄貨幣用什麼字段類型好
NUMERIC和DECIMAL類型被MySQL實現爲一樣的類型,這在SQL92標準容許。他們被用於保存值,該值的準確精度是極其重要的值,例如與金錢有關的數據。當聲明一個類是這些類型之一時,精度和規模的能被(而且一般是)指定;例如:
salary DECIMAL(9,2)
在這個例子中,9(precision)表明將被用於存儲值的總的小數位數,而2(scale)表明將被用於存儲小數點後的位數。所以,在這種狀況下,能被存儲在salary列中的值的範圍是從-9999999.99到9999999.99。在ANSI/ISO SQL92中,句法DECIMAL(p)等價於DECIMAL(p,0)。一樣,句法DECIMAL等價於DECIMAL(p,0),這裏實現被容許決定值p。MySQL當前不支持DECIMAL/NUMERIC數據類型的這些變種形式的任一種。這通常說來不是一個嚴重的問題,由於這些類型的主要益處得自於明顯地控制精度和規模的能力。
DECIMAL和NUMERIC值做爲字符串存儲,而不是做爲二進制浮點數,以便保存那些值的小數精度。一個字符用於值的每一位、小數點(若是scale>0)和「-」符號(對於負值)。若是scale是0,DECIMAL和NUMERIC值不包含小數點或小數部分。
DECIMAL和NUMERIC值得最大的範圍與DOUBLE同樣,可是對於一個給定的DECIMAL或NUMERIC列,實際的範圍可由制由給定列的precision或scale限制。當這樣的列賦給了小數點後面的位超過指定scale所容許的位的值,該值根據scale四捨五入。當一個DECIMAL或NUMERIC列被賦給了其大小超過指定(或缺省的)precision和scale隱含的範圍的值,MySQL存儲表示那個範圍的相應的端點值。
2.數據庫事務的四個特性及含義
數據庫事務transanction正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、持久性(Durability)。
原子性:整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
一致性:在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。
隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的惟一操做。若是有兩個事務,運行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認爲只有該事務在使用系統。這種屬性有時稱爲串行化,爲了防止事務操做間的混淆,必須串行化或序列化請 求,使得在同一時間僅有一個請求用於同一數據。
持久性:在事務完成之後,該事務所對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾。
3.視圖的做用,視圖能夠更改麼?
視圖是虛擬的表,與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢;不包含任何列或數據。使用視圖能夠簡化複雜的sql操做,隱藏具體的細節,保護數據;視圖建立後,可使用與表相同的方式利用它們。
視圖不能被索引,也不能有關聯的觸發器或默認值,若是視圖自己內有order by 則對視圖再次order by將被覆蓋。
建立視圖:create view XXX as XXXXXXXXXXXXXX;
對於某些視圖好比未使用聯結子查詢分組彙集函數Distinct Union等,是能夠對其更新的,對視圖的更新將對基表進行更新;可是視圖主要用於簡化檢索,保護數據,並不用於更新,並且大部分視圖都不能夠更新。
4.drop,delete與truncate的區別
drop直接刪掉表 truncate刪除表中數據,再插入時自增加id又從1開始 delete刪除表中數據,能夠加where字句。
(1) DELETE語句執行刪除的過程是每次從表中刪除一行,而且同時將該行的刪除操做做爲事務記錄在日誌中保存以便進行進行回滾操做。TRUNCATE TABLE 則一次性地從表中刪除全部的數據並不把單獨的刪除操做記錄記入日誌保存,刪除行是不能恢復的。而且在刪除的過程當中不會激活與表有關的刪除觸發器。執行速度快。
(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操做不會減小表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。
(3) 通常而言,drop > truncate > delete
(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE能夠是table和view
(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。
(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變爲:invalid。
(7) delete語句爲DML(data maintain Language),這個操做會被放到 rollback segment中,事務提交後才生效。若是有相應的 tigger,執行的時候將被觸發。
(8) truncate、drop是DLL(data define language),操做當即生效,原數據不放到 rollback segment中,不能回滾
(9) 在沒有備份狀況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,若是於事務無關,用truncate便可實現。若是和事務有關,或老師想觸發trigger,仍是用delete。
(10) Truncate table 表名 速度快,並且效率高,由於:
truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:兩者均刪除表中的所有行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。TRUNCATE TABLE 經過釋放存儲表數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放。
(11) TRUNCATE TABLE 刪除表中的全部行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置爲該列的種子。若是想保留標識計數值,請改用 DELETE。若是要刪除表定義及其數據,請使用 DROP TABLE 語句。
(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。因爲 TRUNCATE TABLE 不記錄在日誌中,因此它不能激活觸發器。
5.索引的工做原理及其種類
數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現一般使用B樹及其變種B+樹。
在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就能夠在這些數據結構上實現高級查找算法。這種數據結構,就是索引。
爲表設置索引要付出代價的:一是增長了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(由於索引也要隨之變更)。
圖展現了一種可能的索引方式。左邊是數據表,一共有兩列七條記錄,最左邊的是數據記錄的物理地址(注意邏輯上相鄰的記錄在磁盤上也並非必定物理相鄰的)。爲了加快Col2的查找,能夠維護一個右邊所示的二叉查找樹,每一個節點分別包含索引鍵值和一個指向對應數據記錄物理地址的指針,這樣就能夠運用二叉查找在O(log2n)的複雜度內獲取到相應數據。
建立索引能夠大大提升系統的性能。
第一,經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性。
第二,能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由。
第三,能夠加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間。
第五,經過使用索引,能夠在查詢的過程當中,使用優化隱藏器,提升系統的性能。
也許會有人要問:增長索引有如此多的優勢,爲何不對錶中的每個列建立一個索引呢?由於,增長索引也有許多不利的方面。
第一,建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。
第二,索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。
第三,當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。
索引是創建在數據庫表中的某些列的上面。在建立索引的時候,應該考慮在哪些列上能夠建立索引,在哪些列上不能建立索引。通常來講,應該在這些列上建立索引:在常常須要搜索的列上,能夠加快搜索的速度;在做爲主鍵的列上,強制該列的惟一性和組織表中數據的排列結構;在常常用在鏈接的列上,這些列主要是一些外鍵,能夠加快鏈接的速度;在常常須要根據範圍進行搜索的列上建立索引,由於索引已經排序,其指定的範圍是連續的;在常常須要排序的列上建立索引,由於索引已經排序,這樣查詢能夠利用索引的排序,加快排序查詢時間;在常用在WHERE子句中的列上面建立索引,加快條件的判斷速度。
一樣,對於有些列不該該建立索引。通常來講,不該該建立索引的的這些列具備下列特色:
第一,對於那些在查詢中不多使用或者參考的列不該該建立索引。這是由於,既然這些列不多使用到,所以有索引或者無索引,並不能提升查詢速度。相反,因爲增長了索引,反而下降了系統的維護速度和增大了空間需求。
第二,對於那些只有不多數據值的列也不該該增長索引。這是由於,因爲這些列的取值不多,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即須要在表中搜索的數據行的比例很大。增長索引,並不能明顯加快檢索速度。
第三,對於那些定義爲text, image和bit數據類型的列不該該增長索引。這是由於,這些列的數據量要麼至關大,要麼取值不多。
第四,當修改性能遠遠大於檢索性能時,不該該建立索引。這是由於,修改性能和檢索性能是互相矛盾的。當增長索引時,會提升檢索性能,可是會下降修改性能。當減小索引時,會提升修改性能,下降檢索性能。所以,當修改性能遠遠大於檢索性能時,不該該建立索引。
根據數據庫的功能,能夠在數據庫設計器中建立三種索引:惟一索引、主鍵索引和彙集索引。
惟一索引
惟一索引是不容許其中任何兩行具備相同索引值的索引。
當現有數據中存在重複的鍵值時,大多數數據庫不容許將新建立的惟一索引與表一塊兒保存。數據庫還可能防止添加將在表中建立重複鍵值的新數據。例如,若是在employee表中職員的姓(lname)上建立了惟一索引,則任何兩個員工都不能同姓。 主鍵索引 數據庫表常常有一列或列組合,其值惟一標識表中的每一行。該列稱爲表的主鍵。 在數據庫關係圖中爲表定義主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特定類型。該索引要求主鍵中的每一個值都惟一。當在查詢中使用主鍵索引時,它還容許對數據的快速訪問。 彙集索引 在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引。
若是某索引不是彙集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非彙集索引相比,彙集索引一般提供更快的數據訪問速度。
局部性原理與磁盤預讀
因爲存儲介質的特性,磁盤自己存取就比主存慢不少,再加上機械運動耗費,磁盤的存取速度每每是主存的幾百分分之一,所以爲了提升效率,要儘可能減小磁盤I/O。爲了達到這個目的,磁盤每每不是嚴格按需讀取,而是每次都會預讀,即便只須要一個字節,磁盤也會從這個位置開始,順序向後讀取必定長度的數據放入內存。這樣作的理論依據是計算機科學中著名的局部性原理:當一個數據被用到時,其附近的數據也一般會立刻被使用。程序運行期間所須要的數據一般比較集中。
因爲磁盤順序讀取的效率很高(不須要尋道時間,只需不多的旋轉時間),所以對於具備局部性的程序來講,預讀能夠提升I/O效率。
預讀的長度通常爲頁(page)的整倍數。頁是計算機管理存儲器的邏輯塊,硬件及操做系統每每將主存和磁盤存儲區分割爲連續的大小相等的塊,每一個存儲塊稱爲一頁(在許多操做系統中,頁得大小一般爲4k),主存和磁盤以頁爲單位交換數據。當程序要讀取的數據不在主存中時,會觸發一個缺頁異常,此時系統會向磁盤發出讀盤信號,磁盤會找到數據的起始位置並向後連續讀取一頁或幾頁載入內存中,而後異常返回,程序繼續運行。
B-/+Tree索引的性能分析
到這裏終於能夠分析B-/+Tree索引的性能了。
上文說過通常使用磁盤I/O次數評價索引結構的優劣。先從B-Tree分析,根據B-Tree的定義,可知檢索一次最多須要訪問h個節點。數據庫系統的設計者巧妙利用了磁盤預讀原理,將一個節點的大小設爲等於一個頁,這樣每一個節點只須要一次I/O就能夠徹底載入。爲了達到這個目的,在實際實現B-Tree還須要使用以下技巧:
每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁裏,加之計算機存儲分配都是按頁對齊的,就實現了一個node只需一次I/O。
B-Tree中一次檢索最多須要h-1次I/O(根節點常駐內存),漸進複雜度爲O(h)=O(logdN)。通常實際應用中,出度d是很是大的數字,一般超過100,所以h很是小(一般不超過3)。
而紅黑樹這種結構,h明顯要深的多。因爲邏輯上很近的節點(父子)物理上可能很遠,沒法利用局部性,因此紅黑樹的I/O漸進複雜度也爲O(h),效率明顯比B-Tree差不少。
綜上所述,用B-Tree做爲索引結構效率是很是高的。
6.鏈接的種類
查詢分析器中執行:
--建表table1,table2:
create table table1(id int,name varchar(10))
create table table2(id int,score int)
insert into table1 select 1,'lee'
insert into table1 select 2,'zhang'
insert into table1 select 4,'wang'
insert into table2 select 1,90
insert into table2 select 2,100
insert into table2 select 3,70
如表
-------------------------------------------------
table1 | table2 |
-------------------------------------------------
id name |id score |
1 lee |1 90|
2 zhang| 2 100|
4 wang| 3 70|
-------------------------------------------------
如下均在查詢分析器中執行
1、外鏈接
1.概念:包括左向外聯接、右向外聯接或完整外部聯接
2.左鏈接:left join 或 left outer join
(1)左向外聯接的結果集包括 LEFT OUTER 子句中指定的左表的全部行,而不只僅是聯接列所匹配的行。若是左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的全部選擇列表列均爲空值(null)。
(2)sql 語句
select * from table1 left join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
註釋:包含table1的全部子句,根據指定條件返回table2相應的字段,不符合的以null顯示
3.右鏈接:right join 或 right outer join
(1)右向外聯接是左向外聯接的反向聯接。將返回右表的全部行。若是右表的某行在左表中沒有匹配行,則將爲左表返回空值。
(2)sql 語句
select * from table1 right join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
註釋:包含table2的全部子句,根據指定條件返回table1相應的字段,不符合的以null顯示
4.完整外部聯接:full join 或 full outer join
(1)完整外部聯接返回左表和右表中的全部行。當某行在另外一個表中沒有匹配行時,則另外一個表的選擇列表列包含空值。若是表之間有匹配行,則整個結果集行包含基表的數據值。
(2)sql 語句
select * from table1 full join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------
註釋:返回左右鏈接的和(見上左、右鏈接)
2、內鏈接
1.概念:內聯接是用比較運算符比較要聯接列的值的聯接
2.內鏈接:join 或 inner join
3.sql 語句
select * from table1 join table2 on table1.id=table2.id
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
註釋:只返回符合條件的table1和table2的列
4.等價(與下列執行效果相同)
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join後加條件只能用where,不能用on)
3、交叉鏈接(徹底)
1.概念:沒有 WHERE 子句的交叉聯接將產生聯接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小。(table1和table2交叉鏈接產生3*3=9條記錄)
2.交叉鏈接:cross join (不帶條件where...)
3.sql語句
select * from table1 cross join table2
-------------結果-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
註釋:返回3*3=9條記錄,即笛卡爾積
4.等價(與下列執行效果相同)
A:select * from table1,table2
7.數據庫範式
1 第一範式(1NF)
在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫。
所謂第一範式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。若是出現重複的屬性,就可能須要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間爲一對多關係。在第一範式(1NF)中表的每一行只包含一個實例的信息。簡而言之,第一範式就是無重複的列。
2 第二範式(2NF)
第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每一個實例或行必須能夠被唯一地區分。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。這個唯一屬性列被稱爲主關鍵字或主鍵、主碼。
第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是非主屬性非部分依賴於主關鍵字。
3 第三範式(3NF)
知足第三範式(3NF)必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。例如,存在一個部門信息表,其中每一個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那麼在員工信息表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。若是不存在部門信息表,則根據第三範式(3NF)也應該構建它,不然就會有大量的數據冗餘。簡而言之,第三範式就是屬性不依賴於其它非主屬性。(個人理解是消除冗餘)
8.數據庫優化的思路
這個我借鑑了慕課上關於數據庫優化的課程。
1.SQL語句優化
1)應儘可能避免在 where 子句中使用!=或<>操做符,不然將引擎放棄使用索引而進行全表掃描。
2)應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
能夠在num上設置默認值0,確保表中num列沒有null值,而後這樣查詢:
select id from t where num=0
3)不少時候用 exists 代替 in 是一個好的選擇
4)用Where子句替換HAVING 子句 由於HAVING 只會在檢索出全部記錄以後纔對結果集進行過濾
2.索引優化
看上文索引
3.數據庫結構優化
1)範式優化: 好比消除冗餘(節省空間。。) 2)反範式優化:好比適當加冗餘等(減小join) 3)拆分表: 分區將數據在物理上分隔開,不一樣分區的數據能夠制定保存在處於不一樣磁盤上的數據文件裏。這樣,當對這個表進行查詢時,只須要在表分區中進行掃描,而沒必要進行全表掃描,明顯縮短了查詢時間,另外處於不一樣磁盤的分區也將對這個表的數據傳輸分散在不一樣的磁盤I/O,一個精心設置的分區能夠將數據傳輸對磁盤I/O競爭均勻地分散開。對數據量大的時時表可採起此方法。可按月自動建表分區。
4)拆分其實又分垂直拆分和水平拆分: 案例: 簡單購物系統暫設涉及以下表: 1.產品表(數據量10w,穩定) 2.訂單表(數據量200w,且有增加趨勢) 3.用戶表 (數據量100w,且有增加趨勢) 以mysql爲例講述下水平拆分和垂直拆分,mysql能容忍的數量級在百萬靜態數據能夠到千萬 垂直拆分:解決問題:表與表之間的io競爭 不解決問題:單表中數據量增加出現的壓力 方案: 把產品表和用戶表放到一個server上 訂單表單獨放到一個server上 水平拆分: 解決問題:單表中數據量增加出現的壓力 不解決問題:表與表之間的io爭奪
方案: 用戶表經過性別拆分爲男用戶表和女用戶表 訂單表經過已完成和完成中拆分爲已完成訂單和未完成訂單 產品表 未完成訂單放一個server上 已完成訂單表盒男用戶表放一個server上 女用戶表放一個server上(女的愛購物 哈哈)
4.服務器硬件優化
這個麼多花錢咯!
9.存儲過程與觸發器的區別
觸發器與存儲過程很是類似,觸發器也是SQL語句集,二者惟一的區別是觸發器不能用EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發(激活)執行。觸發器是在一個修改了指定表中的數據時執行的存儲過程。通常經過建立觸發器來強制實現不一樣表中的邏輯相關數據的引用完整性和一致性。因爲用戶不能繞過觸發器,因此能夠用它來強制實施複雜的業務規則,以確保數據的完整性。觸發器不一樣於存儲過程,觸發器主要是經過事件執行觸發而被執行的,而存儲過程能夠經過存儲過程名稱名字而直接調用。當對某一表進行諸如UPDATE、INSERT、DELETE這些操做時,SQLSERVER就會自動執行觸發器所定義的SQL語句,從而確保對數據的處理必須符合這些SQL語句所定義的規則。