天天看點

17、oracle:max,in,or,trunc,sql變量的使用以及分号

1.max

 (1)首先注意max等聚合類函數隻能作用于資料組,其将from後面的整個表格記錄作為一個資料組,對此資料組的單列進行最大值選取,是以select中不能和其他字段一起用,如果非要一起,必須使用group by,例如:

selectmax(a),b from x group by b;---按照b分組,每組找出最大的a

selectmax(a),b,c from x group by b,c;---找出b,c在相同的情況下,a的最大值(待測試)

selectmax(a),max(b),c from x group by c;---找出c相同時的a的最大值和b的最大值(待測試)

而如下則為錯誤

SELECT TNAME, DNAME, TSEX, MAX (AGE)  FROM TEACHER ---錯誤

   SELECT TNAME, DNAME, TSEX,SAL ,AGEFROMTEACHER WHERE AGE=MAX (AGE) ---錯誤

隻能使用子查詢的方式來實作

SELECT TNAME, DNAME, TSEX, SAL, AGE

FROM    TEACHER

WHERE  AGE=(SELECT MAX (AGE) FROM    TEACHER)

  (2)max用于int型數字的最大值選取很容易想到,但是字元串和日期類型資料就不一定能想到了

  Select max(tname) from teacher;

  Select * fromteacher where tbegintime in (select max(begintime) from teacher)—選出teacher表中入職時間最大(遲)的完整記錄

說明:對字元型資料的最大值,是按照首字母由A~Z的順序排列,越往後,其值越大。當然,對于漢字則是按照其全拼拼音排列的,若首字元相同,則比較下一個字元,以此類推。

說明:确定列中的最大值(最小值)時,MAX( )(MIN( ))函數忽略NULL值。但是,如果在該列中,所有行的值都是NULL,則MAX( )/MIN( )函數将傳回NULL值。

此處參考文章:http://www.cnblogs.com/ymj126/p/3912827.html

2.in

  (1)一般in是為了減少or條件的重複使用

SELECT*

FROMorders

WHEREorder_id in (10000, 10001, 10003, 10005);

  等于

SELECT*

FROMorders

WHEREorder_id = 10000

ORorder_id = 10001

ORorder_id = 10003

ORorder_id = 10005;

  還可以是字元串,日期類型等。

  (2)一般使用max的時候擷取的是一個字段的值,此時一般想要擷取max的結果集字段在全表中的完整記錄(就是選出所有包含有max結果集字段的所有記錄),會使用到in

  Select * fromteacher where tbegintime in (select max(begintime) from teacher where…)—選出teacher表中滿足一定條件的入職時間最大(遲)的完整記錄

3.or

 如果邏輯上需要多個or和and條件連用,注意要使用括号,比如.....where  id = 25 and (name = "aaa" or age = 25)

Select* from record where id = 38 and trunc(endtime) = trunc(sysdate) or trunc(begintime)= trunc(sysdate))---錯誤,無法處理這種文法

可以改為

Select* from record where id = 38 and ( trunc(endtime) = trunc(sysdate) or trunc(begintime)= trunc(sysdate))

或改為

select* from  record

where  endtime in (select endtime  from  record

  where id = 38 and trunc(endtime) =trunc(sysdate))

or   begintime in (select begintime from record

  where id = 38 and trunc(begintime) =trunc(sysdate))

4.trunc:類似截取函數,按指定的格式截取輸入的資料。

 (1)處理日期

文法格式:TRUNC(date[,fmt])

  其中:date 一個日期值;fmt 日期格式。

    該日期将按指定的日期格式截取;忽略它則由最近的日期截取

示例:

   select trunc(sysdate) from dual;--2017/2/13,傳回目前時間(無格式控制,去最近日期)

   select trunc(sysdate,'yy') fromdual;--2017/1/1,傳回當年第一天

   select trunc(sysdate,'mm') fromdual;--2017/2/1,傳回當月的第一天

   select trunc(sysdate,'d') fromdual;--2017/2/12,傳回目前星期的第一天,即星期天

   selecttrunc(sysdate,'dd') from dual;--2017/2/13,傳回目前日期,今天是2017/2/13

   select trunc(sysdate ,'HH24') fromdual;--2017/2/13 15:00:00,傳回本小時的開始時間

   select trunc(sysdate ,'MI') fromdual;--2017/2/13 15:13:00,傳回本分鐘的開始時間

(2)處理number型數字

文法格式:TRUNC(number[,decimals])

其中: number 待做截取處理的數值;decimals 指明需保留小數點後面的位數,可選項,忽略它則截去有的小數部分。

注意:截取時并不對資料進行四舍五入

示例:

    select trunc(123.567,2) from dual;--123.56,将小數點右邊指定位數後面的截去;

    select trunc(123.567,-2) from dual;--100,第二個參數可以為負數,表示将小數點左邊指定位數後面的部分截去,即均以0記;(這裡,-2了解為将小數點左邊第二位及後面所有位全部用0代替)

select trunc(123.567) from dual;--123,預設截去小數點後面的部分;

這部分參考文章:http://www.cnblogs.com/linjiao/p/6394087.html

5.c#中的sql語句變量和分号

(1)string selectSql = @" select ID,name from student where ID = {0} and name = ‘{1}’ " ;

stringSql = string.Format(selectSql, myid, myname);

使用占位符來表示sql中的變量,注意雙引号裡面是不可以有分号的

(2)String [email protected]"select ID,name from studentwhere name= ' "+aaa+ " ' ";//字元串型

[email protected]"select ID,name from student where ID="+aaa;//int型

(3):+變量名

注意,如果變量為日期類型,則必須使用“:變量名”的用法,否則無法通過編譯,報出各種奇怪的異常

string selectSql = @" select recordid, customerid, productid  from  a

                             where begintime=:OpTime or endtime=:OpTime ";

 OracleParameter argOpTime = new OracleParameter(":OpTime", OracleDbType.Date);

argOpTime.Value = realOpTime;

其中OracleParameter為封裝好的類,OracleDbType為枚舉類型

繼續閱讀