sql語句case when使用和date_formate()的使用,DATEDIFF(欄位1,欄位2)獲取天數,常用的MYSQL的函式
SELECT
CASE
WHEN id = 1 THEN
'id為1'
WHEN id = 2 THEN
'id為2'
ELSE
'都大於2'
END AS '屬性名'
FROM
alq_hunter
ORDER BY
id ASC
case when 。。。then when。。。then else 。。then end
結束的時候使用end結尾,case when 中並沒有使用逗號分隔開。case when 就是類似於java中的else if ,
#=====================================================================================================================
SELECT
cm.id,
cm.content,
DATE_FORMAT(
cm.created_time,
'%Y-%m-%d %H:%i:%s'
) created_time,
cm.fabulous_num,
cm.reply_num,
c.member_id,
CASE
WHEN c.member_id = cm.member_id THEN
'作者回復'
ELSE
(
SELECT
IFNULL(am.nickname, '匿名使用者') nickname
FROM
alq_member am
WHERE
am.id = cm.member_id
)
END nickname,
(
SELECT
a.address
FROM
alq_member m,
alq_attachment a
WHERE
a.id = m.logo_attachment_id
AND m.id = cm.member_id
) address
FROM
alq_consultation_comment cm,
alq_consultation c
WHERE
cm.consultation_id = c.id
AND cm.is_delete = 0
AND cm.id = 2
其中的Date_Formate();中的 '%Y-%m-%d %H:%i:%s'中的大小不一樣含義也不一樣
#============++++++++++++++++++++++++++++++++++++++++++++++++++
DATEDIFF(欄位1,欄位2)
SELECT
created_time,
update_time,
DATEDIFF(created_time, update_time) AS '天數'
FROM
alq_hunter
#=======================================================
DATE_ADD(時間欄位,INTERVAL INTERVAL 31 DAY); 時間新增天數,自動計算出引數
SELECT
created_time,
update_time,
DATE_ADD(update_time, INTERVAL 31 DAY) AS date
FROM
alq_hunter
#==========================================================
Date(欄位)
SELECT
created_time,
update_time,
DATE(update_time) as date
FROM
alq_hunter
################################################################################################################################################
1、語法:
刪除> drop procedure if exists procedureName;
建立> create procedure(IN/OUT/INOUT 引數名稱 資料型別) BEGIN .... END;
----說明:
IN 輸入引數:表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值
OUT 輸出引數:該值可在儲存過程內部被改變,並可返回
INOUT 輸入輸出引數:呼叫時指定,並且可被改變和返回
呼叫儲存過程> call procedureName()/call procedureName(params);
2、mysql的變數宣告:
DECLARE variable_name[,variable_name2,variable_name3...] 資料型別 [DEFAULT variable_value];
[]的內容表示可選。來看幾個示例:
DECLARE my_date date DEFAULT '2012-12-31';
DECLARE my_datetime datetime DEFAULT '2012-12-31 23:59:59';
DECLARE my_varchar varchar(255) DEFAULT 'This will not be padded';
3、變數賦值
SET variable_name=variable_value;
4、mysql內建函式
------------------字元操作函式----------------------------
CHARSET(str) //返回字串字符集
CONCAT (string2 [,... ]) //連線字串
INSTR (string ,substring ) //返回substring首次在string中出現的位置,不存在返回0
LCASE (string2 ) //轉換成小寫
LEFT (string2 ,length ) //從string2中的左邊起取length個字元
LENGTH (string ) //string長度
LOAD_FILE (file_name ) //從檔案讀取內容
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定開始位置
LPAD (string2 ,length ,pad ) //重複用pad加在string開頭,直到字串長度為length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重複count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替換search_str
RPAD (string2 ,length ,pad) //在str後用pad補充,直到長度為length
RTRIM (string2 ) //去除後端空格
STRCMP (string1 ,string2 ) //逐字元比較兩字串大小,
SUBSTRING (str , position [,length ]) //從str的position開始,取length個字元,
注:mysql中處理字串時,預設第一個字元下標為1,即引數position必須大於等於1
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字元
UCASE (string2 ) //轉換成大寫
RIGHT(string2,length) //取string2最後length個字元
SPACE(count) //生成count個空格
---------------------------數學函式---------------------------------
ABS (number2 ) //絕對值
BIN (decimal_number ) //十進位制轉二進位制
CEILING (number2 ) //向上取整
CONV(number2,from_base,to_base) //進位制轉換
FLOOR (number2 ) //向下取整
FORMAT (number,decimal_places ) //保留小數位數
HEX (DecimalNumber ) //轉十六進位制
注:HEX()中可傳入字串,則返回其ASC-11碼,如HEX('DEF')返回4142143
也可以傳入十進位制整數,返回其十六進位制編碼,如HEX(25)返回19
LEAST (number , number2 [,..]) //求最小值
MOD (numerator ,denominator ) //求餘
POWER (number ,power ) //求指數
RAND([seed]) //隨機數
ROUND (number [,decimals ]) //四捨五入,decimals為小數位數]
注:返回型別並非均為整數,如:
(1)預設變為整形值
select round(1.23); //列印輸出1
select round(1.56); //列印輸出2
(2)可以設定小數位數,返回浮點型資料
select round(1.567,2); //列印輸出1.57
SIGN (number2 ) //在進行SQL查詢時,我們通常會有這樣一種需求:
對一個自然數進行判斷,如果為零,返回0,如果為負數,統一返回-1, 如果為正數,統一返回1。
-----------------------------日期函式-------------------------------------
ADDTIME (date2 ,time_interval ) //將time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //轉換時區
CURRENT_DATE ( ) //當前日期
CURRENT_TIME ( ) //當前時間
CURRENT_TIMESTAMP ( ) //當前時間戳
DATE (datetime ) //返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或時間
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上減去一個時間
DATEDIFF (date1 ,date2 ) //兩個日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1為星期天
DAYOFYEAR (date ) //一年中的第幾天
EXTRACT (interval_name FROM date ) //從date中提取日期的指定部分
MAKEDATE (year ,day ) //給出年及年中的第幾天,生成日期串
MAKETIME (hour ,minute ,second ) //生成時間串
MONTHNAME (date ) //英文月份名
NOW ( ) //當前時間
SEC_TO_TIME (seconds ) //秒數轉成時間
STR_TO_DATE (string ,format ) //字串轉成時間,以format格式顯示
TIMEDIFF (datetime1 ,datetime2 ) //兩個時間差
TIME_TO_SEC (time ) //時間轉秒數]
WEEK (date_time [,start_of_week ]) //第幾周
YEAR (datetime ) //年份
DAYOFMONTH(datetime) //月的第幾天
HOUR(datetime) //小時
LAST_DAY(date) //date的月的最後日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分返回符號,正負或0
SQRT(number2) //開平方
5、在儲存過程中使用邏輯判斷
還是從例項中看比較直觀:
(1)、if then else end if
CREATE PROCEDURE proc2(IN parameter int)
begin
declare var int;
set var=parameter+1;
if var=0 then
insert into t values(17);
end if;
if parameter=0 then
update t set s1=s1+1;
else
update t set s1=s1+2;
end if;
end;
(2)、case語句
CREATE PROCEDURE proc3 (in parameter int)
begin
declare var int;
set var=parameter+1;
case var
when 0 then
insert into t values(17);
when 1 then
insert into t values(18);
else
insert into t values(19);
end case;
end;
(3)、while... end while
CREATE PROCEDURE proc4()
begin
declare var int;
set var=0;
while var<6 do
insert into t values(var);
set var=var+1;
end while;
end;
(4)、loop ... end loop
CREATE PROCEDURE proc5 ()
begin
declare v int;
set v=0;
LOOP_LABLE:loop
insert into t values(v);
set v=v+1;
if v >=5 then
leave LOOP_LABLE;
end if;
end loop;
end;
(5)、迭代Iterate
CREATE PROCEDURE proc6 ()
begin
declare v int;
set v=0;
LOOP_LABLE:loop
if v=3 then
set v=v+1;
ITERATE LOOP_LABLE;
end if;
insert into t values(v);
set v=v+1;
if v>=5 then
leave LOOP_LABLE;
end if;
end loop;
end;
6、Java呼叫儲存過程訪問mysql示例
(1)、定義不同資料庫實現介面(適用於mysql,sqlserver,oracle等資料庫儲存過程)
- package com.boonya.procedure.service;
- /**
- * 檔案:ProcedureService.java
- * 功能: 實現mysql資料庫儲存過程的操作
- * 註釋:對於功能相同而實現型別不同而言最好先定義介面
- * @author PengJunlin
- * @date 2013-02-19
- */
- publicinterface ProcedureService {
- void createProcedure(String myprocedure,String procedureName);
- void usingProcedure(String myprocedure,String param);
- void alertProcedure(String myprocedure,String procedureName);
- void dropProcedure(String procedureName);
- }
(2)、實現介面和測試
- package com.boonya.procedure.mysql;
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import com.boonya.procedure.service.ProcedureService;
- import com.boonya.procedure.utils.JDBCConnection;
- /**
- * 檔案:MysqlProcedure.java
- * 功能: 實現mysql資料庫儲存過程的操作
- * 註釋:對於功能相同而實現型別不同而言最好先定義介面,已實現介面
- * @author PengJunlin
- * @date 2013-02-19
- */
- publicclass MysqlProcedure implements ProcedureService{
- static CallableStatement cstmt=null;
- static Connection conn=null;
- static Statement stmt=null;
- static ResultSet rs=null;
- static{
- JDBCConnection.setConn("mysql");
- conn=JDBCConnection.getConn();
- }
- /**
- * 建立資料庫表///溫故而知新
- */
- publicvoid createTable(String createSql,String tableName){
- try {
- stmt=conn.createStatement();
- stmt.execute("drop table if exists "+tableName+" ;");
- stmt.executeUpdate(createSql);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- publicvoid createProcedure(String myprocedure,String procedureName){
- try {
- stmt=conn.createStatement();
- stmt.execute("drop procedure if exists "+procedureName+" ;");
- stmt.executeUpdate(myprocedure);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- publicvoid alertProcedure(String myprocedure,String procedureName){
- try {
- stmt=conn.createStatement();
- stmt.execute("drop procedure if exists "+procedureName+" ;");
- stmt.executeUpdate(myprocedure);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- publicvoid usingProcedure(String procedureName,String param){
- try {
- cstmt=conn.prepareCall("call "+procedureName+"("+param+")");
- rs=cstmt.executeQuery();
- System.out.println("儲存過程查詢結果:");
- while (rs.next()) {
- System.out.println(rs.getInt("sno")+" "+rs.getString("sname")
- +" "+rs.getInt("sage")+" "+rs.getString("sdept"));
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- publicvoid dropProcedure(String procedureName){
- try {
- String dorpProcedure="drop procedure if exists "+procedureName+" ;";
- stmt=conn.createStatement();
- stmt.executeUpdate(dorpProcedure);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- class MysqlProcedureTest{
- publicstaticvoid main(String[] args) {
- MysqlProcedure mysqlProcedure=new MysqlProcedure();
- String mytableString=" create table mytable_mysql "//建表語句
- +"("
- +" uid int(11) primary key ,"
- +" uname varchar(30) ,"
- +" uage int(11) , "
- +" ubackground varchar(100)"
- +");";
- mysqlProcedure.createTable(mytableString,"mytable_mysql"); //建立資料表
- String myprocedure=" create procedure snoquery(IN no int) "//儲存過程語句
- +" BEGIN"
- +" declare s_no int;"
- +" set s_no=no;"
- +" select sno,sname,sage,ssex,sdept "
- +" from student where sno=s_no ;"
- +" END;";
- mysqlProcedure.createProcedure(myprocedure,"snoquery"); //建立儲存過程
- mysqlProcedure.usingProcedure("snoquery","12"); //呼叫儲存過程
- String alertProcedure="create procedure snoquery(IN name varchar(30))"
- +" BEGIN"
- +" declare s_name varchar(30);"
- +" set s_name=name;"
- +" select sno,sname,sage,ssex,sdept "
- +" from student where sname=s_name;"
- +" END;";
- mysqlProcedure.alertProcedure(alertProcedure,"snoquery"); //修改儲存過程
- mysqlProcedure.usingProcedure("snoquery","'boonya007'"); //呼叫儲存過程
- mysqlProcedure.dropProcedure("snoquery"); //刪除儲存過程
- }
- }