Mysql常用的一些方法

2021-08-26 14:59:41 字數 3688 閱讀 9983

1、時間戳轉日期

select *,from_unixtime(create_time,'%y-%m-%d %h:%i%s') as date from user where from_unixtime(create_time,'%y-%m-%d %h:%i%s') > curdate() group by date order by date desc;
上面的sql語句,把create_time欄位格式化為日期,並且按格式話後的字段查詢和排序。

細看可能會發現,group和order我都直接使用了格式化後的別名dete,而where查詢則重新格式化了字段,這跟mysql的執行順序有關。執行到where時,結果還沒被查詢出來,別名自然無法生效,需要注意下。

2、條件判斷

①ifnull

select ifnull(score1,score2) from score;
如果score1是null,則返回score2;否則返回score1

②if

select if(***,'男','女') from user;
第乙個引數是條件。若為浮點數,認為是0,返回『女』

第乙個引數也可以寫成比較式:***=1

③聚合函式中條件判斷

select count(case when age>10 then id end) from user;
上面sql語句查詢年齡大於10的使用者數量

3、中文字段排序

把資料表中的資料按中文字段值得拼音首字母排序,假設該字段為name

如果name的字元編碼是latin_swedish_ci

select * from user order by birary(name) asc;
如果name的字元編碼是utf8_general_ci

select * form user where 1 order by convert(name using gbk) collate gbk_chinese_ci asc;
4、按指定的順序排序
select * form user where id in(1,2,3,4,5) order by field(id,5,4,3,2,1);
返回的值會根據id 5,4,3,2,1排序

5、拼接字段

select concat(id,name,'666') from user;
concat()中的引數,可以使字串,也可以是資料表中的字段。當引數中的字段有乙個為null時,則給行資料就為null了。若想避免這種情況,可以使用concat_ws(),用法略有不同

6、初始化自增id的起始值為1

alter table 表名 auto_increment=1;
7、group後的其他字段

使用group把指定字段相同的行合為一行後,除了group欄位是我們預期的值,行裡其他字段可能不是我們想要的。

比如說我想要合併後,時間欄位create_time的值是最大的那個,但很多時候我們不確定這個create_time是最大還是最小,這時候我們需要自己在select 時增加自己想要的字段,比如:

select *,count(id),max(create_time) as last_time from pay_list group by uid;
8、mysql的一些簡單的執行原理

① mysql執行查詢語句時,關於為where條件的執行順序,看網上很多說是從左到右順序執行的,因此在查詢資料量較大的表時,最好把能排除最多無效資料的條件放在最左(就算不對,也沒啥損失)。

② 關於mysql in 條件的執行原理

select * from a where id in(id_str);

該語句的執行順序類似於以下過程。

$a = select * from a;

$b = id_str;

$result = ;

foreach($a as $v)

}}

當where 需要多個in條件,且條件之間有關聯時

比如我們想篩選:北京,年齡在21,22 ;上海,年齡在22,23的人員

傳統的寫法:select * from a where address in (『北京』,『上海』) and age in (21,22,23);是不對的,會篩選出:上海,年齡21 的無效資料

我們可以把上面語句改為:select * from a where (address ,age) in ((『北京』,『21』),(『北京』,『22』),(『上海』,『22』),(『上海』,『23』),);

9、千萬級資料count()

資料較多時使用count查詢數量,即使有索引,也要幾十秒時間,效率太低。網上看到可以使用mysql的 explain 函式獲取行數。

這個函式是專門用於檢視sql語句的執行效率的,網上可供參考的文章很多。

定義: explain 命令速度很快,因為 explain 用並不真正執行查詢,而是查詢優化器【估算】的行數。

我們使用explain之後,會看到返回很多引數

取rows即行數

10、百萬級資料分頁優化

其實不到百萬級資料,我的資料表才不到40萬條資料,在聯表情況下取最後面的分頁資料時,速度達到了3秒左右。最後發現問題出現在order by 上。

可以看到,使用order by 導致查詢速度慢了10倍。

使用order by 時,mysql使用了using filesort,表示在索引之外,需要額外進行外部的排序動作。aid是主鍵索引,也沒有用到。

搜尋之後知道,想要在order by的字段使用索引,select的字段必須和order by保持一致

這種情況下,我們查詢全部資料期並且使用order by排序就變的不可行了,因為我們不可能把需要的列都加上索引。這個時候我可以先只查詢主鍵id,獲取到某一頁的資料後,使用in查詢,查詢全部資料。

select * from ask_question where aid in (select t.aid from (select aid from ask_question limit 30000,10) t);

可以看到,使用了雙重子查詢。這是因為mysql中規定在子查詢中不能使用limit,但是在字查詢中再巢狀一層子查詢就可以了。

mysql一些命令 mysql常用的一些命令

一 授權登入 參考grant all privileges on cacti.to hnf localhost identified by hnf 2014 只給cacti這個資料庫授權 grant all on to root localhost identified by huningfei 只...

MySQL使用的一些常用方法彙總

1.匯出整個資料庫 mysqldump u 使用者名稱 p 資料庫名 匯出的檔名 mysqldump u dbuser p dbname dbname.sql 2.匯出乙個表 mysqldump u 使用者名稱 p 資料庫名 表名 匯出的檔名 mysqldump u dbuser p dbname ...

mysql一些常用語句 mysql一些常用語句

一 從命令列登入mysql資料庫伺服器 1 登入使用預設3306埠的mysql usr local mysql bin mysql u root p 2 通過tcp連線管理不同埠的多個mysql 注意 mysql4.1以上版本才有此項功能 usr local mysql bin mysql u ro...