本篇文章持續更新。
這裡說坑,也不算坑,只是對我乙個經常用sql server的來說有點不習慣而已。
一、groupby 的不同
create tablecustomer (
customernumbervarchar(50),
paymentdatedatetime,
amountint)insert intocustomer(
customernumber,
paymentdate,
amount
)select '103','2018-01-02','123.01' union all
select '103','2018-01-08','123.01' union all
select '115','2018-01-04','123.01' union all
select '112','2018-01-05','123.01' union all
select '115','2018-01-08','123.01' union all
select '112','2018-01-10','123.01' union all
select '114','2018-01-06','123.01' ;
根據上面的資料,我們執行如下sql語句:
select customernumber,paymentdate from customer group by customernumber
第一反應,看到這條sql,我說這不是會報錯嗎(按照以前在sqlserver的邏輯)。
實際上是不會報錯的。
真正的原因:mysql裡面是通過sql_model來提供sql語句的合法檢查,在mysql的sql_model=default的情況下
是允許剛剛上面這種做法的,也就是說一條select語句,除了聚合函式和group by column以外的表示式(這個表示式的值無法確定)
實際上是mysql的分組內第一行對應列的值)
而很多對語義限制比較嚴的多家資料庫,如sqlserver,oracle,postgresql都不支援select trage list **現語義不明確的列。
所以mysql在後續的版本**現了乙個修正的語義,也就是我們說的only_full_group_by的語義。
set sql_mode=only_full_group_by;select customernumber,paymentdate from customer group by customernumber;
上面這樣寫就會報錯:說paymentdate不在group by 的列中。
不管我們是否設定:
set sql_mode=only_full_group_by
我們都應該按照嚴格的語義來寫,不然給後面維護帶來不方便。
二、刪除資料
一開始的刪除資料,直接寫了下面個子查詢,然後就交給dba,去正式的庫執行,之後反饋說,報錯了,不能執行。
delete fromcustomerwhere customernumber in(select customernumber frompayments
上面這個做法為什麼錯呢,因為mysql不允許在安全模式下,刪除資料不通過主鍵來刪除。
正確的做法:
把安全更新設定為零,用完再設定回1。
set sql_safe_updates = 0;delete fromcustomerwhere customernumber in(select customernumber frompayments
);set sql_safe_updates=1;
從這裡也可以看出,我們進行刪除資料這些操作,還是盡量的用主鍵好。主鍵能夠保證不會多刪,並且效率也高。
mysql 常見的坑 常見的Mysql踩坑區
為了看的明顯,我們先建立乙個表測試一下 create table student id int 11 not null,name varchar 20 default null,age int 11 default null,primary key id engine innodb default ...
mysql 坑 mysql入過的坑
前言 前段時間由於工作需要,部署乙個新的專案。需要安裝mysql,因此遇到不少坑。首先是啟動的時候遇到找不到檔案位置的問題,在網上找了下原因,是由於之前安裝了mysql解除安裝的時候沒有解除安裝乾淨有殘留導致的。需要進入登錄檔cmd regedit hkey local machine system...
mysql常見的優化策略 Mysql常見的優化策略
資料庫設計方面優化 1 資料庫設計符合第三正規化,為了查詢方便可以有一定的資料冗餘。2 選擇資料型別優先順序 int date,time enum,char varchar blob,選擇資料型別時,可以考慮替換,如ip位址可以用ip2long 函式轉換為unsign int型來進行儲存。3 對於c...