mysql知識積累 必知必會

2021-10-09 06:32:18 字數 4722 閱讀 6350

distinct能進行去重,但是這是乙個關鍵字,放在select後面,當多個欄位的時候,意義就變了。

比如

select

distinct name,*** from

user;

這個句子的意思是對name欄位和***欄位都相同的行進行去重,而並不是對name進行去重,如果將distinct進行調整,select ***,distinct name from user;會發現報錯了,distinct是乙個關鍵字,但是並非修飾單個欄位的。所以這個時候應該是用group by

select name ,*** from

user

group

by name;

單獨乙個數字,表示的是限制多少行,兩個數字的表示從行幾開始計算的多少行

以下兩個句子的意義是相同的

select

*from

user

limit5;

select

*from

user

limit0,

5;

select

user

.name from today.

user

4,where的操作符,不等於

操作符

說明<>

不等於!=

不等於mysql的sql關鍵字不區分大小寫,但是欄位的varchar也是不區分大小寫的,這就是乙個大問題了。

比如

select

*from

user

where name =

'zhangsan'

;

這裡是要查詢名字是zhangsan的人員資訊,但是mysql資料庫卻查出了zhangsan,如果是查詢後沒有進行應用過濾,就可能拿zhangsan的資訊來使用了,這也是證明了為什麼有時候用數字來進行做type的區分,當然啦,一般的type即使是不區分大小寫也不會有問題,安全起見還是要避免而已。

同時,這種判斷有另乙個更加大的風險,如果是sql是!=判斷邏輯,就會出現判斷失誤了。這個時候,獲取的資料就是錯誤的,無法在應用層進行處理了,不過如果是漢子,就不存在大小寫的問題了。

針對這個問題,在建立表的時候,應該選擇區分大小寫,utf8應該選擇utf8_bin規則,進行區分大小寫,這個時候執行的sql就不會查詢到錯誤的資料。

判斷是否為null,用is null

在mysql中null是具有特殊意義的,所以在條件篩選的時候,null是當做乙個特殊值看待的,所以在進行條件篩選的時候,一定要考慮是否為null

以下兩個句子,執行後的結果是完全不同的,第乙個sql的結果不會包換為null的行

select

*from

`tt_today`

where t_title !=

'title'

;select

*from

`tt_today`

where t_title !=

'title'

or t_title is

null

;

in操作用於指定操作的範圍

select

*from

`tt_today`

where

`create_time`in(

123456

);

mysql中的 not mysql 支 持 使 用 not 對 in 、 between 和exists子句取反

not in,not between,not exists

select

*from

`tt_today`

where

`create_time`

notin

(123456);

select

*from

`tt_today`

where

`create_time`

notbetween

12345

and123456

;select t.

`id`

,t.`t_title`

,t.`t_content`

from

`tt_today` t where

notexists

(select

*from

`user

` u where u.

`name`

= t.

`name`

);

exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false

exists 指定乙個子查詢,檢測 行 的存在。

下面的sql,前半部分是查詢語句,後面的exists就是用來檢測前面查詢的資料是否為true。

select 

t.`id`

, t.

`t_title`

, t.

`t_content`

from

`tt_today` t

where

exists

(select

*from

`user

` u

where u.

`name`

= t.

`name`

);

like是謂語,不是操作符,like配合%實現模糊查詢,但是注意查詢的結果與是否區分大小寫有關。

"%"萬用字元可以放在頭部,尾部和中間,需要注意的是尾部空格也是字元,所以應使用函式去掉空格。

"%「萬用字元能匹配0個到多個字元,但是」_"萬用字元只能匹配乙個字元

注意null不在萬用字元的檢索範圍內。

另外注意,萬用字元搜尋效能差,頭部盡量不使用萬用字元

'_ lisi』限制了前面一定有乙個字元,查詢結果: 1 lisi

select

`name`

from

`tt_today`

where

`name`

like

'_ lisi'

;select

`name`

from

`tt_today`

where

`name`

like

'% lisi'

;

以下兩種寫法的執行結果相同

select

*from

`tt_today`

where

`name`

regexp

'lisi'

;select

*from

`tt_today`

where

`name`

like

'%lisi%'

;

如果資料表的設定支援區分大小寫的,查詢的結果是支援大小寫的,但是如果是預設狀態下,是不區分大小寫的,這個時候可以使用binary 關鍵字

select

*from

`tt_today`

where

`name`

regexp

binary

'lisi'

;

在正規表示式中可以插入多個|,"|"表示or。

查詢包含lisi或者包含張三的記錄

select

*from

`tt_today`

where

`name`

regexp

'lisi|zhangsan'

;

下面兩個sql的查詢結果是相同的,這裡的[12] 是[1|2]的簡寫,表示1或者2,但是注意的乙個問題,正規表示式本身就具有like的特性,所以需要考慮到組合後的正規表示式能查更多的內容。

select

*from

`tt_today`

where

`name`

regexp

'[12] lisi'

;select

*from

`tt_today`

where

`name`

regexp

'1 lisi|2 lisi'

;

下面三個sql,第一sql表示的是包含^2 lisi

第二個表示不包含2 lisi

第三個表示不包含1 lisi也不包含2 lisi

select

*from

`tt_today`

where

`name`

regexp

'^2 lisi'

;select

*from

`tt_today`

where

`name`

regexp

'[^2] lisi'

;select

*from

`tt_today`

where

`name`

regexp

'[^12] lisi'

;

mysql必知必會 mysql必知必會(四)

十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...

mysql的必知必會 mysql 必知必會 筆記

好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...

mysql必知必會

一周了,總想寫點什麼,有的時候進步真的很難在一周顯示出來,週三的時候,我跟我的領導說,好快啊,又週三了,不知不覺,他說是啊,現在對於他來說,有時候他過一天可能跟我過一周的感覺差不多,每天都在忙,時間過的特別快,也沒有感覺做出來點什麼,當然實際肯定是怎麼做了一些東西的,是否我以後也會如此呢?說說技術把...