MySql基本學習知識點:
1.Mysql的簡介:
(1):常識:
|
(2):基本安裝信息:
|
(3):安裝mysql錯誤操作:
·手動刪除mysql安裝目錄 ·重新運行配置向導MySQLInstanceConfig.exe ·刪除C:\ProgramData\MySQL目錄
|
2.Mysql命令:
(1).連接數據庫:
|
(2).修改密碼:
(3).添加新用戶:
(4.1).創建數據庫:
|
(4.2).顯示數據庫:
|
(4.3).刪除數據庫:
|
(4.4).連接數據庫:
|
(4.5).當前選擇的數據庫:
|
(5.1).創建數據表:
命令:create table <表名> ( <字段名1>
<類型1> [,..<字段名n> <類型n>]);
|
(5.2).刪除數據表:
|
(5.3).表插入數據:
|
(5.4).查詢表中的數據:
|
(5.5).刪除表中的數據:
命令:delete from 表名 where 表達式 |
(5.6).修改表中數據:
|
(5.7).增加字段:
|
(5.8).修改表名:
|
(6).備份數據庫:
|
(7).一個建庫和建表的實例:
|
3.數據類型
· 數值類型:
|
4.SQL語句語法:
數據操縱語言針對表中的數據,而數據定義語言針對數據庫或表
|
create database school; /*創建數據庫*/ show databases; /*顯示所有數據庫select database()*/ use school; /*指定默認數據庫*/ create table student( /*創建表*/ id int(10) primary key auto_increment, /*主鍵,自增*/ name varchar(8), sex char(1), score float(6,2) );
show tables; /*顯示當前庫中表清單*/ /* 顯示指定表結構show columns from student;*/ describe student; show create table student; /*顯示建表sql語句*/ drop table student; /*刪除表*/ drop database school; /*刪除數據庫*/ |
insert into student values("張三", "t",87.5); insert into student values(null,"張三","t",87.5); //insert into student (name,sex,score) values("張三","t",87.5); select * from student; insert into student values(null,"李四","男",89); alter table student modify sex char(2); insert into student values(null,"李四","男",89); select * from student; update student set sex ="女"; select * from student; update student set sex="男" where id=1; select * from student; update student set name="王五" ,score=100 where id=2; select * from student; delete from student where name="王五"; select * from student; delete from student; select * from student;
|
|
alter table stu drop birthday; |
create table person( id int primary key, name varchar(6), sex char(2), age int(10) ); insert into person values(1,"張三","男",45); insert into person values(2,"李四","男",32); insert into person values(3,"王五","女",32);
create table pet( id int auto_increment , name varchar(6), masterid int, primary key(id), constraint fk foreign key (masterid) references person(id) );
|
limit是每頁顯示的條數. |
5.導入導出:
|
6.mysql數據庫的內連接與外連接的區別:
內連接指的是把表連接時表與表之間匹配的數據行查詢出來,就是兩張表之間數據行匹配時,要同時滿足ON語句後面的條件才行。 左連接的意思是,無論是否符合ON語句後面的表連接條件都會把左邊那張表的記錄全部查詢出來,右邊的那張表只匹配符合條件的數據行。右連接則與之相反(這裏同樣OUTER 可以省略 |
7.MySql的事務處理:
MySQL 事務MySQL 事務主要用於處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。 事務控制語句:
MYSQL 事務處理主要有兩種方法:1、用 BEGIN, ROLLBACK, COMMIT來實現
2、直接用 SET 來改變 MySQL 的自動提交模式:
|
數據庫事務隔離級別 數據庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決臟讀 、不可重復讀 、幻讀 這幾類問題。
√: 可能出現 ×: 不會出現
註意:我們討論隔離級別的場景,主要是在多個事務並發 的情況下,因此,接下來的講解都圍繞事務並發。 Read uncommitted 讀未提交公司發工資了,領導把5000元打到singo的賬號上,但是該事務並未提交,而singo正好去查看賬戶,發現工資已經到賬,是5000元整,非常高 興。可是不幸的是,領導發現發給singo的工資金額不對,是2000元,於是迅速回滾了事務,修改金額後,將事務提交,最後singo實際的工資只有 2000元,singo空歡喜一場。
出現上述情況,即我們所說的臟讀 ,兩個並發的事務,“事務A:領導給singo發工資”、“事務B:singo查詢工資賬戶”,事務B讀取了事務A尚未提交的數據。 當隔離級別設置為Read uncommitted 時,就可能出現臟讀,如何避免臟讀,請看下一個隔離級別。 Read committed 讀提交singo拿著工資卡去消費,系統讀取到卡裏確實有2000元,而此時她的老婆也正好在網上轉賬,把singo工資卡的2000元轉到另一賬戶,並在 singo之前提交了事務,當singo扣款時,系統檢查到singo的工資卡已經沒有錢,扣款失敗,singo十分納悶,明明卡裏有錢,為 何...... 出現上述情況,即我們所說的不可重復讀 ,兩個並發的事務,“事務A:singo消費”、“事務B:singo的老婆網上轉賬”,事務A事先讀取了數據,事務B緊接了更新了數據,並提交了事務,而事務A再次讀取該數據時,數據已經發生了改變。 當隔離級別設置為Read committed 時,避免了臟讀,但是可能會造成不可重復讀。 大多數數據庫的默認級別就是Read committed,比如Sql Server , Oracle。如何解決不可重復讀這一問題,請看下一個隔離級別。 Repeatable read 重復讀當隔離級別設置為Repeatable read 時,可以避免不可重復讀。當singo拿著工資卡去消費時,一旦系統開始讀取工資卡信息(即事務開始),singo的老婆就不可能對該記錄進行修改,也就是singo的老婆不能在此時轉賬。 雖然Repeatable read避免了不可重復讀,但還有可能出現幻讀 。 singo的老婆工作在銀行部門,她時常通過銀行內部系統查看singo的信用卡消費記錄。有一天,她正在查詢到singo當月信用卡的總消費金額 (select sum(amount) from transaction where month = 本月)為80元,而singo此時正好在外面胡吃海塞後在收銀臺買單,消費1000元,即新增了一條1000元的消費記錄(insert transaction ... ),並提交了事務,隨後singo的老婆將singo當月信用卡消費的明細打印到A4紙上,卻發現消費總額為1080元,singo的老婆很詫異,以為出 現了幻覺,幻讀就這樣產生了。 註:MySQL的默認隔離級別就是Repeatable read。 Serializable 序列化Serializable 是最高的事務隔離級別,同時代價也花費最高,性能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免臟讀、不可重復讀,還避免了幻像讀。
二、臟讀、幻讀、不可重復讀 1.臟讀:
|
8.MySql數據庫索引:
|
9.MySql註入:
所謂SQL註入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。 我們永遠不要信任用戶的輸入,我們必須認定用戶輸入的數據都是不安全的,我們都需要對用戶輸入的數據進行過濾處理。
|
防止SQL註入,我們需要註意以下幾個要點: 1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。 2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。 3.永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。 4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。 5.應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝 6.sql註入的檢測方法一般采取輔助軟件或網站平臺來檢測,軟件一般采用sql註入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防禦SQL註入,XSS攻擊等。
|
應對方法: 1.mysql_escape_string() 轉義特殊字符((PHP 4 >= 4.3.0, PHP 5))(mysql_real_escape_string必須先鏈接上數據庫,否則會報錯) 下列字符受影響: \x00 //對應於ascii字符的NULL \n //換行符且回到下一行的最前端 \r //換行符 \ //轉義符 ‘ " \x1a //16進制數 如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。 2.addslashes(): 函數返回在預定義字符之前添加反斜杠的字符串 (stripslashes()實現字符串還原) 預定義的字符有: 單引號(‘) 雙引號(") 反斜杠(\) NULL 3.prepared statements(預處理機制)
|
MySql基本學習知識點: