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