MySQL中常見的函數:mysql
if語句: 格式:IF(Condition,A,B) 說明:當Condition爲TRUE時,返回A;當Condition爲FALSE時,返回B。 case when語句: 舉例: SELECT t.message_id,t.title, CASE WHEN TO_DAYS(t.date)= TO_DAYS(NOW()) THEN '今天' WHEN TO_DAYS(t.date)= (TO_DAYS(NOW())-1) THEN '昨天' ELSE date_format(t.date,'%Y-%m-%d') END AS datestr FROM t_message t 字符串截取/鏈接函數: CONCAT函數: 格式: CONCAT(columnName1,columnName2,'otherString') 說明:返回一個字符串結果,該結果由參數中的值鏈接(不使用分隔符)而成,若是某一個參數爲NULL ,則返回值爲NULL。 GROUP_CONCAT函數: 格式: GROUP_CONCAT(columnName) GROUP_CONCAT(columnName SEPARATOR ';') 說明:返回一個字符串結果,該結果由分組中的(columnName列的)值用分隔符(默認爲英文逗號)拼接而成。 RIGHT函數 格式:right(str, length) 說明:返回字符串str最右面的length個字符。 INSTR函數 格式:INSTR(str,substr) 說明:返回子串substr在字符串str中第一個出現的位置,位置從1開始計算。若在str中找不到substr則返回0。 補充: LOCATE(substr,str,pos):返回子串substr在字符串str中從pos開始第一個出現的位置。若是substr不是在str裏面,返回0。 SUBSTRING函數 格式:substring(str, pos, length); 說明:截取字符串。從pos開始,截取length長度。 字符串替換函數: 舉例:將content字段值中的'{URL}'替換爲download_url字段的值。 select t.id, t.title, replace(content,'{URL}',t.download_url) from t_helpcenter t 時間函數: 函數: NOW() eg:2018-03-19 19:18:55 CURDATE() eg:2018-03-19 DATE_SUB(CURDATE(), INTERVAL 7 day) eg:若今天是2018-03-19,則結果爲2018-03-12 DATE_SUB(CURDATE(), INTERVAL 1 week) eg:若今天是2018-03-19,則結果爲2018-03-12 DATE_SUB(CURDATE(), INTERVAL 1 month) eg:若今天是2018-03-19,則結果爲2018-02-19 DATE_SUB(CURDATE(), INTERVAL 1 year) eg:若今天是2018-03-19,則結果爲2017-03-19 DATE_FORMAT(CURDATE(), '%Y%m') eg:201803 quarter(NOW()) eg:若今天是2018-03-19(3月屬於第1季度),則結果爲1 year(NOW()) eg:2018 舉例: 今天: SELECT * FROM t_advertise_message WHERE TO_DAYS(update_time) = TO_DAYS(NOW()) 昨天: SELECT * FROM t_advertise_message WHERE TO_DAYS(update_time) = TO_DAYS(NOW()) -1 7天內: SELECT * FROM t_advertise_message WHERE DATE(update_time) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) 本月: SELECT * FROM t_advertise_message WHERE DATE_FORMAT(update_time,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') 本季度:SELECT * FROM t_advertise_message WHERE quarter(update_time) = quarter(NOW()) 本年度:SELECT * FROM t_advertise_message WHERE year(update_time) = year(NOW()) 將字符串轉換爲時間的函數: str_to_date('2000-05-24 14:00:00', '%Y-%m-%d %H:%i:%s')
MySQL中常見的問題:sql
1)MySQL關於查詢條件中:字符串類型的值忽略英文字母的大小寫以及字符串尾部包含空格的問題 舉例:MySQL中執行下面3條查詢語句,查詢出來的結果徹底相同。 SELECT * FROM t_accounts WHERE account= "xiaoning" SELECT * FROM t_accounts WHERE account= "XiaoNing" SELECT * FROM t_accounts WHERE account= "xiaoning " 分析: 1)MySQL對CHAR或VARCHAR類型的值進行比較(=)時,會忽略字符串中英文字母的大小寫以及尾部的空格 2)對CHAR和VARCHAR類型的值進行LIKE查詢時,會忽略英文字母的大小寫,可是不會忽略字符串尾部的空格 解決方案: SELECT * FROM t_accounts WHERE account= BINARY "xiaoning" 或 SELECT * FROM t_accounts WHERE BINARY account= "xiaoning" SELECT * FROM t_accounts WHERE account= BINARY "XiaoNing" 或 SELECT * FROM t_accounts WHERE BINARY account= "XiaoNing" SELECT * FROM t_accounts WHERE account= BINARY "xiaoning " 或 SELECT * FROM t_accounts WHERE BINARY account= "xiaoning " 說明: 1>BINARY不是函數,是類型轉換運算符 2>BINARY強制將後面的字符串轉換爲一個二進制的字符串,能夠理解爲在字符串比較的時候區分英文字母的大小寫以及空格,即精確匹配。 2)對varchar類型的字段和數字進行比較時,mysql會把varchar轉換爲數字: 舉例: 當varchar類型字段的首字符爲非數字時(eg:asdf),該字段會被轉換爲數字0; 當varchar類型字段的首字符爲數字0時(eg:0abcd),該字段會被轉換爲數字0; eg:varchar類型字段=0 只能排除首字符爲非數字0的字符串 同理:varchar類型字段=1 只能排除首字符爲非數字1的字符串 3)在MySQL客戶端中查看MySQL的安裝目錄: SELECT @@basedir AS MySqlDir FROM DUAL 4)MySQL中存儲超長字符串: MySQL中字段的類型設爲:MEDIUMTEXT Mybatis中對應的類型爲:JdbcType.LONGVARCHAR
其它:mybatis
replace into語句: 原理: replace into語句首先會判斷表中是否已經存在該行數據(根據主鍵或惟一索引來判斷),若是該行數據已存在,則刪除已存在的該行數據並插入新的數據;若是該行數據不存在,則直接將數據插入。 注意: 插入數據的表必須有主鍵或惟一索引,不然replace into語句會直接將數據插入到表中,從而可能致使表中出現重複的數據。 若是要插入的數據已存在,那麼,replace into語句的返回值爲2 (受影響的行數爲2) 舉例: DDL: CREATE TABLE `t_site_id` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `unique_column` varchar(1) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `unique_column` (`unique_column`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 說明: 1>t_site_id表有兩列:id、unique_column,表中只有一條數據:id=1,unique_column="a" 2>執行:replace into t_site_id set unique_column="a" 後,表中的數據變成了:id=2,unique_column="a" 3>在mybatis中執行replace into語句後,能夠使用@SelectKey註解來獲取到自增後最新的id,從而咱們能夠獲取到一個全局惟一(且遞增)的id。 代碼: @Insert({"replace into t_site_id set unique_column='a'" }) @SelectKey(before = false, keyProperty = "id", resultType = Long.class, statementType = StatementType.STATEMENT, statement = "SELECT LAST_INSERT_ID() ") public Long getNewSiteId(ReqAddSite req);