mysql常用SQL語句
DDL(Data Definition Languages)語句:數據定義語言,主要定義了不同的數據段、數據庫、表、列、索引等數據庫對象。常用的語句關鍵字主要包括create、drop、alter等。
創建庫
修改庫
顯示庫
刪除庫
庫切換
例1:簡單的一個示例
例2:下面的是一個相對真實的生產上的例子,介紹的比較詳細。包括主鍵、註釋、外鍵約束、表的數據引擎等都有定義。
1.顯示庫中匹配的表
2.查看錶:顯示錶中各個字段的定義
3.顯示錶的創建過程
雖然desc可以查看錶的定義,但是輸出的信息還是不夠完善,爲了查看更全面的表定義,有時就需要查看創建表的SQL語句,如下:
語法:
示例:
語法:
示例:
語法:
示例:
語法:
示例:
注意:change和modify都可以修改表的定義,不同的是change後面需要寫兩次列名,不方便。但是change的有點事可以修改列名,modify則不能。
前面介紹的字段增加和修改語法(ADD/CHANGE/MODIFY)中,都有一個可選項first|after column_name,這個選項可以用來修改字段在表中的位置,ADD增加的新字段默認是加在表的最後位置,而CHANGE/MODIFY默認都不會修改字段的位置。
示例:
1.將新增的字段birth date 加在ename之後
2.修改字段age,將它放在最前面
1.2.4.6 更改表名
語法:
示例:將表emp改名爲emp1,如下
DML語句是指對數據庫中表記錄的操作,主要包括表記錄的插入(insert)、更新(update)、刪除(delete)和查詢(select)。
表創建好之後,就可以往裏插入記錄了,基本語法如下:
例:
也可以不用指定字段名稱,但是values後面的順序應該和字段的排列順序一致。
含有可空字段、非空但是含有默認值的字段、自增字段,可以不用在insert後的字段列表裏出現,value後面只寫對應字段名稱的value。這些沒寫的字段的值可以自動被設置爲NULL、默認值、自增的下一個數字,這樣在某些情況下可以大大縮短SQL語句的複雜性。
例如,只對表中的ename和sal字段顯式插入值
在mysql中,還可以一次性插入多條記錄,語法如下:
可以看出,每條記錄之間都用都好進行了分隔。如下,對錶dept一次插入兩條記錄:
這個特性可以使得mysql在插入大量數據是,節省很多的網絡開銷,大大提高效率。
表裏的值可以通過update命令進行更改,語法如下:
例如,將表emp中的ename爲“lisa”的薪水(sal)從3000調整爲4000
在mysql中,update命令可以同時更新多個表中數據,語法如下:
示例:
結果,兩個表中的數據都有了更新。
如果記錄不再需要,可以使用delete命令進行刪除,語法如下:
例如,在emp中間ename爲“pony”的記錄全部刪除,如下:
在mysql中可以一次刪除多個表的數據,語法如下:
如果from後面的表名用別名,則delete後面也要用相應的別名,否則會提示語法錯誤。
在下面,同時刪除表emp和dept中deptno爲3的記錄:
注意:不光是單表還是多表,不加where條件將會把表的所有記錄刪除,所以操作時一定要小心。
清空指定表中所有數據:
不帶where參數的delete語句可以刪除mysql表中所有內容,使用truncate table也可以清空mysql表中所有內容。
效率上truncate比delete快,但truncate刪除後不記錄mysql日誌,不可以恢復數據。
delete的效果有點像將mysql表中所有記錄一條一條刪除到刪完,而truncate相當於保留mysql表的結構,重新創建了這個表,所有的狀態都相當於新表。
對於帶有自增長字段的表,truncate清除數據後,自增長從0開始,而delete從之前的序號開始。
數據插入到數據庫中之後,就可以使用select命令進行各種各樣的查詢,使得輸出的結果符合用戶的要求。select語句的語法很複雜,下面只介紹一些簡單的。
最簡答的就是將表中的所有記錄全部列出,其中“*”表示將所有的記錄都選出來,也可以使用逗號分隔的所有字段進行代替,以下兩個語句是等價的:
"*"的好處是當查詢所有的字段信息時,查詢語句很簡單,但是隻查詢部分字段的時候,必須要將字段一個個列出來。
有時需要將表中的記錄去重之後顯示出來,可以使用distinct關鍵字來實現:
在很多情況下,用戶並不需要查詢所有的記錄,而只是根據需要限定條件來查詢一部分數據,用where關鍵字可以來實現這樣的操作。
結構集中將符合條件的記錄列出來。上面的例子中,where後面的條件是一個字段的=比較,除了=之外,還可以使用>、<、>=,<=,!=等比較運算符;多個條件之間還可以使用or,and,not等邏輯運算符進行多條件聯合查詢。
如下:
我們經常會有這樣的需求,取出按照某個字段進行排序後的記錄結果集,這就用到了數據庫的排序操作,用關鍵字ORDER BY來實現,語法如下:
其中,DESC和ASC是排序順序關鍵字。DESC是表示按照字段進行降序排列,ASC則表示升序排列,如果不寫此關鍵字默認是升序排列。ORDER BY後面可以跟多個不同的排序字段,並且每個排序字段可以有不同的排序順序。
例如,把emp表中的記錄按照工資高低進行顯示:
如果排序字段的值一樣,則值相同的字段按照第二個排序字段進行排序,以此類推。如果只有一個排序字段,則這些字段相同的記錄將會無序排列。
對於deptno相同的前兩條記錄,如果按照工資由高到低排序,可以使用以下命令:
對於排序後的記錄,如果希望只顯示一部分,而不是全部,這時,就可以使用LIMIT關鍵字來實現。LIMIT
其中,offset_start表示記錄的起始偏移量,row_count表示顯示的行數。
在默認情況下,起始偏移量爲0,只需要寫記錄數就可以,這時,實際顯示的就是前n條記錄。例如,顯示emp表中按照sal排序後的前三條記錄:
如果要顯示emp表中按照sal排序後從第二條記錄開始的3條記錄,可以使用以下命令:
limit經常和order by一起配合用來進行記錄的分頁顯示。
聚合主要用於進行一些彙總操作,比如統計整個公司的人數,用戶數,這時就需要用到SQl的數據聚合操作。
聚合操作的語法如下:
參數說明:
fun_name:表示要做的聚合操作,也就是聚合函數,常用的有sum(求和),count(*)(記錄數),max(最大值),min(最小值)。
GROUP_BY:表示要進行分類聚合的字段,比如要按照部門分類統計員工數量,部門就應該寫在group by後面。
WITH ROLLUP:這是可選語法,表示是否對分類聚合後的結果進行再次彙總。
HAVING:表示對分類後的結果再次進行條件過濾。
注意:HAVING和where的區別是,having是對聚合後的結果進行條件過濾,而where實在聚合之前進行過濾,如果邏輯允許,我們儘可能使用where先過濾記錄,這樣因爲結果集減小,將對聚合的效率大大提高,最後再根據邏輯看是否用having進行再過濾。
例如,要在emp表中統計公司的總人數:
在此基礎上,統計各個部門的人數:
更詳細一些,既要統計各部門人數,也要統計總人數:
統計總人數大於1的部門:
最後統計所有員工的薪水總額,最高,最低薪水:
但需要同時顯示多個表中的字段是,就可以使用表連接來實現這樣的功能。從大類上分,表連接分爲內連接和外連接,它們之間的主要區別就是:內連接僅選出兩張表中相匹配的記錄,而外連接會選出其它不匹配的記錄。我們最常使用的是內連接。
例如,查詢出所有僱員的名字和所在部門名稱,因爲僱員名稱和部門分別存放在emp和dept兩張表中,因此,需要使用表連接來進行查詢。
外連接又分爲左連接和右連接,具體定義如下:
左連接:包含所有的左邊表中的記錄甚至是右邊表中沒有和它匹配的記錄
右連接:包含所有的右邊表中的記錄甚至是左邊表中沒有和它匹配的記錄
左連接示例:
右連接示例:
某些情況下,當進行查詢的時候,需要的條件是另外一個select語句的結果,這個時候,就要用到子查詢。用於子查詢的關鍵字主要包括in、not in、=、!=、exists、not exists等。
例如,從emp表中查詢出所有部門在dept表中的所有記錄:
如果子查詢記錄數唯一,還可以用=代替in:
某些情況下,子查詢可以轉化爲表連接
注意:子查詢和表連接之間的轉換主要應用在兩個方面
1.mysql4.1以前的版本不支持子查詢,需要用表連接來實現子查詢的功能
2.表連接在很多情況下用來優化子查詢。
我們經常會碰到這樣的應用,將兩個表的數據按照一定的查詢條件查詢出來之後,將結果合併到一起顯示出來,這個時候,就需要用union和union all關鍵字來實現這樣的功能,具體語法如下:
union和union all的主要區別就是union all是把結果集直接合並起來,而union是將union all後的結果進行一次DISTINCT,去除重複記錄之後的結果。
例,將emp和dept表中的部門編號的集合顯示出來:
將結果去掉重複記錄之後顯示如下:
綜合應用示例:
DCL語句主要是DBA用來管理系統中的對象權限時使用的,一般的開發人員使用較少。
例:創建一個數據庫用戶user1,使其具有對test1數據庫中所有表的SELECT/INSERT權限;
新建的這個用戶只能通過localhost主機名進行本地連接,認證密碼是“password”。連接登錄如下:
由於權限變更,需要將user1的權限收回,收回INSERT,只能對數據進行SELECT操作。
注意:收回權限的操作只能用管理員才能操作。
使用use1用戶登錄,測試一下:
可以看到,權限已經被收回,設置已經生效了。
在mysql的使用中,可能會遇到如下問題:
1.某個操作語法忘記了,如何快速查找?
2.如何快速知道當前版本上某個字段類型的取值範圍?
3.當前版本都支持哪些函數?想要有例子說明
4.當前版本是否支持某個功能?
對於上面的問題,最好的解決方法就是使用MYSQL自帶的幫助文檔,但遇到問題後可以方便快捷的進行查詢。
例:
help然後是關鍵詞,例如select,revoke,show,grant等等,還可以多跟一些關鍵詞,如下:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.