本文主要以 Mysql 數據庫為基礎,對常用 SQL 語句進行壹次深度總結,由於篇幅較長,難免會有些遺漏的地方,歡迎網友批評指出!
具體內容主要有以下幾個部分:
創建數據庫比較簡單,在創建的時候直接指定字符集、排序規則即可!
例子:
數據庫修改庫名的有三種方法,如果是 MyISAM 存儲引擎,那麽可以直接去數據庫目錄 mv 就可以了,如果是 Innodb 完全不行,會提示相關表不存在。
這個語法在 mysql-5.1.7 中被添加進來,到了 mysql-5.1.23 又去掉了,官方不推薦,會有丟失數據的危險!
思路是先創建壹個新庫,之後將舊庫的數據導入到新庫,即可完成修改庫名!
當然這種方法雖然安全,但是如果數據量大,會比較耗時,同時還需要考慮到磁盤空間等硬件成本。
例子:
直接跑壹個 shell 腳本!
其中 p123456 , p 是 password 的簡稱, 123456 表示數據庫密碼值!
刪除庫,比較簡單,直接刪除即可!
或者
MySQL 主要有以下幾種運算符:
運算符描述實例 +加法select 1+2; 結果為3 -減法select 1-2; 結果為-1 *乘法select 2*3; 結果為6 /除法select 6/3; 結果為2 %取余select 10%3; 結果為1
說明: 在除法運算和模運算中,如果除數為0,將是非法除數,返回結果為NULL 。
SELECT 語句中的條件語句經常要使用比較運算符。通過這些比較運算符,可以判斷表中的哪些記錄是符合條件的。比較結果為真,則返回 1,為假則返回 0,比較結果不確定則返回 NULL。
運算符描述實例 =等於select * from t_user where user_id = 1 查詢用戶ID為1的信息 !=不等於select * from t_user where user_id != 1 查詢用戶ID不為1的信息 >大於select * from t_user where user_id > 1 查詢用戶ID大於1的信息 >=大於select * from t_user where user_id >= 1 查詢用戶ID大於等於1的信息 大於select * from t_user where user_id < 1 查詢用戶ID小於1的信息 <=大於select * from t_user where user_id <= 1 查詢用戶ID小於等於1的信息 BETWEEN AND在兩值之間select * from t_user where user_id between 1 and 100 查詢用戶ID在1和100之間的信息,類似user_id >=1 and user_id <=100 NOT BETWEEN AND不在兩值之間select * from t_user where user_id not between 1 and 100 查詢用戶ID不在1和100之間的信息,類似user_id 100 IN在集合中select * from t_user where user_id in ('1','2') 查詢用戶ID為 1 或者 2 的信息 NOT IN不在集合中select * from t_user where user_id not in ('1','2') 查詢用戶ID不為 1 和 2 的信息 LIKE模糊匹配,%表示0個或者多個匹配select * from t_user where user_name like '%張%' 查詢用戶姓名包含張的信息 IS NULL為空select * from t_user where user_name is null 查詢用戶姓名為空的信息 IS NOT NULL不為空select * from t_user where user_name not is null 查詢用戶姓名不為空的信息
說明: mysql中,IN 語句中參數個數是不限制的。不過對整段 sql 語句的長度有了限制,最大不超過 4M !
邏輯運算符用來判斷表達式的真假。如果表達式是真,結果返回 1。如果表達式是假,結果返回 0。
運算符描述實例 NOT 或 !邏輯非select not 1; 結果為0 AND邏輯與select 2 and 0; 結果為0 OR邏輯或select 2 or 0; 結果為1 XOR邏輯異或select null or 1; 結果為1
位運算符是在二進制數上進行計算的運算符。位運算會先將操作數變成二進制數,進行位運算。然後再將計算結果從二進制數變回十進制數。
運算符描述實例 &按位與select 3&5; 結果為1 I按位或select 3I5; 結果為7 ^按位異或select 3I5; 結果為7 ^按位異或select 3^5; 結果為6 ~按位取反select ~18446744073709551612; 結果為3 >>按位右移select 3>>1; 結果為1 <按位左移select 3<<1; 結果為6
優先級(從高到底)運算符 1! 2-(負號),~(按位取反) 3^(按位異或) 4*,/(DIV),%(MOD) 5+,- 6>>,<< 7& 8I 9=(比較運算),,<,,>=,!=,>,IN,IS NULL,LIKE,REGEXP 10BETWEEN AND,CASE,WHEN,THEN,ELSE 11NOT 12&&,AND 13XOR 14II,OR 15=(賦值運算),:=
說明: 在無法確定優先級的情況下,可以使用圓括號 () 來改變優先級,並且這樣會使計算過程更加清晰 。
視圖(view)是壹種虛擬存在的表,是壹個邏輯表,本身並不包含數據。作為壹個select語句保存在數據字典中的。
參數說明:
基本格式:
創建視圖示例:
刪除視圖是指刪除數據庫中已存在的視圖,刪除視圖時,只能刪除視圖的定義,不會刪除數據,也就是說不動基表:
刪除示例:
函數描述實例 char_length(s)返回字符串 s 的字符長度select char_length("hello") as content; concat(s1,s2...sn)字符串 s1,s2 等多個字符串合並為壹個字符串select concat("hello ", "world") as content; format(x,n)將數字 x 進行格式化,到小數點後 n 位,最後壹位四舍五入select format(500.5634, 2) as content; lower(s)將所有字母變成小寫字母select lower('HELLO'); current_timestamp()返回當前日期和時間select current_timestamp(); DATE_FORMAT(date,format)格式化時間或者日期select DATE_FORMAT(current_timestamp(),"%Y-%m-%d %H:%i:%s"); IFNULL(v1,v2)如果 v1 的值不為 NULL,則返回 v1,否則返回 v2select IFNULL(null,'hello word');
參數說明:
參數說明:
參數說明:
參數說明:
示例:
參數說明:
參數說明:
創建壹個查詢用戶信息的存儲過程示例:
輸出結果:
刪除示例:
觸發器是與表有關的數據庫對象,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。
定義語法
參數說明:
示例,創建了壹個名為trig1的觸發器,壹旦在 t_user 表中有插入動作,就會自動往 t_time 表裏插入當前時間。
創建有多個執行語句的觸發器語法
示例如下:
壹旦插入成功,就會執行 BEGIN ...END 語句!
所有觸發器信息都存儲在information_schema數據庫下的triggers表中,可以使用SELECT語句查詢,如果觸發器信息過多,最好通過TRIGGER_NAME字段指定查詢。
示例如下:
刪除觸發器之後最好使用上面的方法查看壹遍。
觸發器盡量少的使用,因為不管如何,它還是很消耗資源,如果使用的話要謹慎的使用,確定它是非常高效的:觸發器是針對每壹行的;對增刪改非常頻繁的表上切記不要使用觸發器,因為它會非常消耗資源。
在 MySQL 中,可以有如下幾種途徑實現唯壹值:
在mysql中,壹般我們可以給某個主鍵字段設置為自增模式,例如:
這種模式,在單庫單表的時候,沒啥問題,但是如果要對 test_db 表進行分庫分表,這個時候問題就來了,如果水平分庫,這個時候向 test_db_1 、 test_db_2 中插入數據,就會出現相同的 ID !
當然,為了避免出現這種情況,有的大神就自己單獨創建了壹張自增序列表,單獨維護,這樣就不會出現在分表的時候出現相同的ID!
實現過程也很簡單!
這方案,某種情況下解決了分表的問題,但是如果分庫還是會出現相同的ID!
UUID 基於 16 進制,由 32 位小寫的 16 進制數字組成,如下:
比如 d0c754a8-178e-11eb-ae3d-2a7bea22ed3d 就是壹個典型的 UUID。
在 MySQL 的 UUID() 函數中,前三組數字從時間戳中生成,第四組數字暫時保持時間戳的唯壹性,第五組數字是壹個 IEEE 802 節點標點值,保證空間唯壹。
使用 UUID() 函數,可以生成時間、空間上都獨壹無二的值。據說只要是使用了 UUID,都不可能看到兩個重復的 UUID 值。當然,這個只是在理論情況下。
使用方法也很簡單,在 sql 可以直接當成函數調用即可!
在 MySQL 5.1 之後的版本,提供 UUID_SHORT() 函數,生成壹個 64 位無符號整數,在java中可以用 Long 類型接受。另外,需要註意的是,server_id 的範圍必須為 0-255 ,並且不支持 STATEMENT 模式復制,否則有可能會產生重復的ID
同時,需要註意的是, UUID_SHORT() 返回的是 unsigned long long 類型,在字段類型設置的時候,壹定要勾選 無符號 類型,否則有可能生成的ID超過 Long 類型最大長度!
說明:
在給其他授權前,請先用管理員賬戶登錄!
註意:用以上命令授權的用戶不能給其它用戶授權,如果想讓該用戶可以授權,用以下命令!
在結尾加上 WITH GRANT OPTION 就可以了!
可以使用如下命令,來壹鍵設置 root 用戶的密碼,同時擁有所有的權限並設置為遠程訪問!
如果想關閉 root 用戶遠程訪問權限,使用如下命令即可!
最後使用如下命令,使其生效!
創建用戶並進行授權,也可以使用如下快捷命令!
最後需要註意的是:mysql8,使用強校驗,所以,如果密碼過於簡單,會報錯,密碼盡量搞復雜些!
本文主要圍繞 Mysql 中常用的語法進行壹次梳理和介紹,這些語法大部分也同樣適用於其他的數據庫,例如 oracle、sqlserver、postgres 等等,在數據操作欄,除了分頁函數以外,基本都是通用的!