1. 程式人生 > 實用技巧 >MySQL學習隨筆02

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)建議別名簡短,見名知意

去重DISTINCT

著重號

例如:select name from t_stu;

可以給欄位或表名加著重號

如果欄位名或表名與關鍵字一樣更要加著重號了

MySQL的運算子

(1)算術運算子:+ - * /(除也可以寫成div,div取整) %(取模可以寫成mod)

(2)比較運算子:= > >= < <= !=(不等於還可以寫成<>) <=>(安全等於)

(3)邏輯運算子:&&(邏輯與也可以寫成and) ||(邏輯或也可以寫成or) not(邏輯非) xor(邏輯異或)

(4)範圍:表示式 between ... and ... (也可以寫成 表示式>=... and 表示式 <=...)

表示式 not between ... 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語句

內連線(INNER JOIN)

有兩種,顯式的和隱式的,返回連線表中符合連線條件和查詢條件的資料行

格式:

隱式: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)

全外連線(FULL OUTER JOIN),簡稱全連線(FULL JOIN)。

自連線

當table1和table2本質上是同一張表,只是用取別名的方式虛擬成兩張表以代表不同的意義。然後兩個表再進行內連線,外連線等查詢

select的5個子句

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 篩選

    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語句再次查詢

        • exists型子查詢

        • 事務

          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語句。