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為枚舉類型