MySQL學習隨筆02
SELECT 查詢列表
FROM 表名或檢視列表
【WHERE 條件表示式】
【GROUP BY 欄位名 【HAVING 條件表示式】】
【ORDER BY 欄位 【ASC|DESC】】
【LIMIT m,n】;
說明:
(1)如果SELECT後面是*,那麼表示查詢所有欄位
(2)SELECT後面的查詢列表,可以是表中的欄位,常量值,表示式,函式
(3)查詢的結果是一個虛擬的表
select語句,可以包含5種子句:依次是where、 group by、having、 order by、limit必須照這個順序。
別名AS
語法:AS 別名
說明:
(1)可以給欄位取別名、可以給表名取別名
(2)AS 可以省略
(3)如果給欄位取別名,如果別名中包含特殊符號,例如“空格”等,建議給別名加上雙引號或單引號
(4)如果是給表名取別名,那麼不能加雙引號或單引號,也不能有特殊符號,例如“空格”等
(5)建議別名簡短,見名知意
著重號
例如:select name
from t_stu;
可以給欄位或表名加著重號
如果欄位名或表名與關鍵字一樣更要加著重號了
MySQL的運算子
(1)算術運算子:+ - * /(除也可以寫成div,div取整) %(取模可以寫成mod)
(2)比較運算子:= > >= < <= !=(不等於還可以寫成<>) <=>(安全等於)
(3)邏輯運算子:&&(邏輯與也可以寫成and) ||(邏輯或也可以寫成or) not(邏輯非) xor(邏輯異或)
(4)範圍:表示式 between ... and ... (也可以寫成 表示式>=... and 表示式 <=...)
(5)集合:in (值,值,值...) not in(值,值,值...)
(6)模糊查詢:LIKE NOT LIKE,萬用字元:%表示0-n個字元,_下劃線代表一個字元
(7)位運算子:&(按位與) |(按位或)^(按位異或)~(按位取反)>>(右移)<<(左移)
(8)NULL值判斷,is null 或 is not null,如果使用null=null,null<>null,null=0,null<>0,null=false等都不對
不過xxx is null 可以使用xxx <=> null ,xxx is not null 可以寫成 not xxx <=> null
結論:所有的運算子遇到NULL結果都是NULL,除了<=>
關聯查詢,聯合查詢
作用:從2張或多張表中,取出有關聯的資料.
關聯查詢一共有幾種情況:
-
內連線:INNER JOIN 、CROSS JOIN
-
外連線:左外連線(LEFT OUTER JOIN)、右外連線(RIGHT OUTER JOIN)、全外連線(FULL OUTER JOIN)
-
自連線:當table1和table2本質上是同一張表,只是用取別名的方式虛擬成兩張表以代表不同的意義
說明:
(1)連線 n個表,至少需要 n-1個連線條件。 例如:連線三個表,至少需要兩個連線條件。
(2)當兩個關聯查詢的表如果有欄位名字相同,並且要查詢中涉及該關聯欄位,那麼需要使用表名字首加以區分
(3)當如果表名比較長時,可以給表取別名,簡化SQL語句
有兩種,顯式的和隱式的,返回連線表中符合連線條件和查詢條件的資料行
格式:
隱式:SELECT [cols_list] from 表1,表2 where [condition]
顯式:SELECT [cols_list] from 表1 INNER JOIN 表2 ON [關聯條件] where [其他篩選條件]
SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [關聯條件] where [其他篩選條件]
SELECT [cols_list] from 表1 JOIN 表2 ON [關聯條件] where [其他篩選條件]
外連線(OUTER JOIN)
外連線分為:
左外連線(LEFT OUTER JOIN),簡稱左連線(LEFT JOIN)
右外連線(RIGHT OUTER JOIN),簡稱右連線(RIGHT JOIN)
自連線
當table1和table2本質上是同一張表,只是用取別名的方式虛擬成兩張表以代表不同的意義。然後兩個表再進行內連線,外連線等查詢
where條件查詢
從原表中的記錄中進行篩選
group by 分組查詢
很多情況下,使用者都需要進行一些彙總操作,比如統計整個公司的人數或者統計每一個部門的人數等。
聚合函式
-
AVG(【DISTINCT】 expr) 返回expr的平均值
-
COUNT(【DISTINCT】 expr)返回expr的非NULL值的數目
-
MIN(【DISTINCT】 expr)返回expr的最小值
-
MAX(【DISTINCT】 expr)返回expr的最大值
-
SUM(【DISTINCT】 expr)返回expr的總和
having與where類似,可篩選資料
having與where不同點
-
where針對表中的列發揮作用,查詢資料;having針對查詢結果中的列發揮作用,篩選資料
-
where後面不能寫分組函式,而having後面可以使用分組函式
-
having只用於group by分組統計語句
order by 排序
-
按一個或多個欄位對查詢結果進行排序
用法:order by col1,col2,col3...
說明:先按col1排序如果col1相同就按照col2排序,依次類推
col1,col2,col3可以是select後面的欄位也可以不是
-
預設是升序,也可以在欄位後面加asc顯示說明是升序,desc為降序
例如:order by click_count desc;
如果兩個欄位排序不一樣,例如:
order by 欄位1 asc ,欄位2 desc;
-
order by 後面除了跟1個或多個欄位,還可以寫表示式,函式,別名等
-
limit 分頁
limit m,n
m表示從下標為m的記錄開始查詢,第一條記錄下標為0,n表示取出n條出來,如果從m開始不夠n條了,就有幾條取幾條。m=(page-1)*n,(page頁碼,n表示每頁顯示的條數)
如果第一頁limit 0,n <=> limit n
如果第二頁limit n,n
依次類推,得出公式limit (page-1)*n , n
-
-
where 型子查詢
where型子查詢即把內層sql語句查詢的結果作為外層sql查詢的條件.
-
子查詢要包含在括號內。
-
建議將子查詢放在比較條件的右側。
-
單行操作符對應單行子查詢,多行操作符對應多行子查詢。
-
單行操作符 右邊子查詢必須返回的是單個值,單行比較運算子(=,>,>=,<,<=,<>)
-
多行操作符 右邊子查詢可以返回多行,但必須是單列,ALL, ANY,IN 其中,ALL和ANY運算子必須與單行比較運算子(=,>,>=,<,<=,<>)結合使用
-
from型子查詢
from型子查詢即把內層sql語句查詢的結果作為臨時表供外層sql語句再次查詢
-
-
事務
DCL用來控制資料庫的訪問,包括如下SQL語句:
-
GRANT:授予訪問許可權
-
REVOKE:撤銷訪問許可權
-
COMMIT:提交事務處理
-
ROLLBACK:事務處理回退
-
SAVEPOINT:設定儲存點
-
LOCK:對資料庫的特定部分進行鎖定
6.1 事務
思考:我去銀行給朋友匯款,我卡上有1000元,朋友卡上500元,我給朋友轉賬50元(無手續費),如果,我的錢剛扣,而朋友的錢又沒加時,網線斷了,怎麼辦?
6.1.1 事務的ACID特性
-
原子性(Atomicity):原子意為最小的粒子,或者說不能再分的事物。資料庫事務的不可再分的原則即為原子性。 組成事務的所有SQL必須:要麼全部執行,要麼全部取消(就像上面的銀行例子)。
-
一致性(Consistency):指資料的規則,在事務前/後應保持一致
-
隔離性(Isolation):簡單點說,某個事務的操作對其他事務不可見的.
-
永續性(Durability):當事務提交完成後,其影響應該保留下來,不能撤消
6.1.2事務的用法
-
開啟事務(start transaction)
-
執行sql操作(普通sql操作)
-
提交/回滾(commit/rollback)
注意:
-
建表的時候,選擇** Innodb引擎才支援事務**
-
預設情況下,MySQL是自動提交事務,每次執行一個 SQL 語句時,如果執行成功,就會向資料庫自動提交,而不能回滾。如果某一組操作需要在一個事務中,那麼需要使用start transaction,一旦rollback或commit就結束當次事務,之後的操作又自動提交。
-
如果需要在當前會話(連線)的整個過程中都取消自動提交事務,進行手動提交事務,就需要設定set autocommit = false;或set autocommit = 0;那樣的話每一句SQL都需要手動commit提交才會真正生效。rollback或commit之前的所有操作都視為一個事務,之後的操作視為另一個事務,還需要手動提交或回滾。
-
和Oracle一樣,DDL語句是不能回滾的,並且部分的DDL語句會造成隱式的提交,因此最好事務中不要涉及DDL語句。
-
-
-
-