重要的oracel比較運算符(可以用來進行模糊查詢)
1、between..and運算符
此運算符用於測試是否在指定的范圍內。通常和where子句一起使用,between..and條件返回一個介於指定上限和下限之內的范圍值。
例如:
select name from student where birth between '1980' and '1990';
between..and操作符前可以加關鍵字NOT,表示指定范圍之外的值
例如:
select name from student where birth not between '1980' and '1990';
2、IN運算符
IN運算符用來判斷操作數是否為IN列表中的其中一個值。同樣NOT IN運算符用來判斷操作數是否不是IN列表中的其中一個值
例如:
--從學生表中找出年齡是25和26的學生姓名(25,26中的任何一個,與or相似) select name from student where age in(25,26);
3、LIKE
此運算符用來匹配字符串。在進行匹配時,可以使用下面兩種通配符
(1)'%',用來代表有0個或者多個字符組成的任意順序的字符串
(2)'_',(下划線)只能匹配一個字符
例如:
--匹配姓張的學生'張%' select name from student where name like '張%'; --'張_' 代表張后面只有一個字 select name from student where name like '張_'; --'%張%' 代表名字包含"張"字就行 select name from student where name like '%張%'; --'b%y' 代表b開頭,y結尾的任意字符 select name from student where name like 'b%y'; --'_ _ _ _y' 代表y前面有4個任意字符,注意下划線之間不能有空格 select name from student where name like '_ _ _ _y';
重要的邏輯運算符
1、NOT運算符
又稱取反運算符,常常和IN、LIKE、BETWEEN..AND和NULL等關鍵字一起使用
例如:
--找到年齡不是25、26歲的學生姓名 select name from student where age not in(25,26);
2、AND運算符
要求兩邊的表達式結果都為true,如果任何一方的返回結果為null或false,那么邏輯運算的結果就為false,也就是說記錄不匹配where子句的要求
例如:
--找到年齡為25和姓張的學生姓名 select name from student age=25 and name like '張%';
3、OR運算符
又稱或運算符,也就是說只要左右兩側的布爾表達式任何一方為true,結果就為true
例如:
select name from student age=25 or name like '張%';
Oracle插入、更新、刪除數據
1、插入:insert into
使用insert插入數據時,允許列名稱為空,此時,值列表中需要為表的每一個字段指定值,並且值的順序必須和數據表中字段定義時的順序相同。
例如一:
insert into person (id,name,age,info) values (1,'Green',21,'Larger') --varchar2字符串需要單引號,例如'Green'
例如二:
insert into person (age,name,id,info) values (22,'Green',2,'dancer')
例如三:
insert into person values (3,'Mary',24,'Mucision') --與表的字段相同
2、為表的指定字段插入數據,就是在insert語句中只向部分字段中插入值,而其它字段的值為定義的默認值。
3、將查詢結果插入到表中
insert還可以將select語句查詢的結果插入表中,如果想要從另外一個表中合並個人信息到person表,
不需要把每一條記錄的值一個一個輸入,只需要使用一條insert語句和一條select語句組成的組合語句,
即可快速的從一個或多個表中向一個表中插入多個行
例如:
--將表2中的所有記錄插入到表1中 insert into table1(字段列表) select (字段列表2) from table2 where (條件); --將person_old表中的數據插入到person表中 insert into person(id,name,age,info) select id,name,age,info from person_old;
4、更新:update
oracle中使用update語句更新表中的記錄,可以更新特定的行或者同時所有的行
例如:
--將person表中id為11的人年齡換成15,姓名改為LiMing update person set age=15,name='LiMing' where id=11;
ipdate后面直接加表明(person),注意set,不寫where時,將把所有的行都修改
注意:保證update以where子句結束,通過where子句指定被更新的記錄所需要滿足的條件,如果忽略where子句,Oracle將更新表中所有的行。
例如:
--將person表中年齡在19-22之間的人職業換為student update person set info='student' where age between 19 and 22;
5、刪除:delete
從數據庫中刪除數據使用DELETE語句,DELETE語句允許where子句指定刪除條件。如果沒有where子句,DELETE語句將刪除表中的所有數據
--刪除id為11的行 delete from person where id=11; --刪除年齡在19-22的行 delete from person where age between 19 and 22;
刪除表中字段
例如:
--修改emp表,刪除bonus列 alter table emp drop (bonus); --刪除字段需要從每行中刪除掉該字段中占據的長度和數據,並釋放
注意:insert、update、delete區別,update后面不加from,用到set
Oracle函數
Oracle函數包括數學函數、字符串函數、日期和時間函數、條件判斷函數、系統信息函數等。
1、數學函數
(1)求余函數MOD(x,y):返回x被y除后的余數,MOD函數對於帶有小數部分的數值也起作用,它返回除法運算后的精確余數
例如:
select MOD(31,8),MOD(234,10) from dual;
(2)獲取整數的函數CEIL(x)和FLOOR(x)
函數CEIL(x):返回不小於x的最小整數值
例如:
select ceil(-3.35),ceil(3.35) from dual; --返回-3,4
函數FLOOR(x):返回最大整數
例如:
select floor(-3.35),floor(3.35) from dual; --返回-4,3
(3)四舍五入函數ROUND(x),ROUND(x,y)和TRUNC(x,y)
函數ROUND(x):返回最接近於參數x的整數,對x值進行四舍五入
例如:
select round(-1.15),round(-1.68),round(1.15),round(1.68) from dual; --返回-1,-2,1,2
函數ROUND(x,y):返回最接近於參數x的數,其值保留到小數點后面的y位,若y為負值,則將保留x值到小數點左邊y位
例如:
select round(1.38,1),round(1.38,0),round(232.38,-1),round(232,38,-2) from dual; --返回1.4,1,230,200
注意,y為負值時,保留的小數點左邊的相應位數直接保存為0,進行四舍五入
函數TRUNC(x,y):返回被舍去至小數點后y位的數字x,若y的值為0,則結果不帶有小數點或不帶有小數部分。若y沒有負值,則截去x小數點左起第y位開始后面所有地位的值
例如:
select trunc(1.31,1),trunc(1.99,1),trunc(1.99,0),trunc(19.99,-1) from dual; --返回1.3、1.9、1、10
補充:ROUND(x,y)函數在截取值的時候會四舍五入,而TRUNC(x,y)函數直接截取值,不會四舍五入
2、字符串函數
(1)length(str):返回字符串的字節長度
例如:
select length('date'),length('egg') from dual; --返回4、3
(2)concat(s1,s2):返回結果為連接參數產生的字符串
例如:
select concat('學習','Oracle 10g') from dual; --返回學習Oracle 10g
(3)字符串搜索函數:instr(s,x) 返回x字符在字符串s的位置
例如:
select instr('Hello Oracle','c') from dual; --返回10 (從1開始數)
(4)Lower(str):可以將字符串str中的字母全部轉換成小寫字母
例如:
select lower('BEIJING') from dual; --返回beijing
(5)upper(str):可以將字符串str中的字母全部轉換為大寫字母
例如:
select upper('beijing') from dual; --返回BEIJING
(6)initcap(str):將輸入的字符串單詞的首字母轉換成大寫
select initcap('hello beautiful') from dual; --Hello Beautiful
(7)substr(s,m,n):獲取指定的字符串。其中參數s代表字符串,m代表截取的位置,n代表截取的長度,當m值為正數時,從左邊開始數指定的位置,當m為負數時,從右邊開始取指定位置的字符
select substr('abcde好fgh',6,2),substr('abcde好fgh',-6,2) from dual; --返回好f、e好
(8)replace(s1,s2,s3):替換字符串函數,其中參數s1代表搜索的目標字符串,s2表示在目標字符串中要搜索的字符串,s3是可選參數,用它替換被搜索到的字符串,
如果該參數不用,表示從s1字符串中刪除搜索到的字符串。
select replace('this is a dog','dog','cat') from dual; --this is a cat select replace('this is a dog','dog') from dual; --this is a
(9)LTRIM(s,n):將刪除指定的左側字符。其中s是目標字符串,n是需要查找的字符,如果n不指定,則表示刪除左側的空格(空白)。
select ltrim('this is a dog','this'),ltrim(' this is a dog') from dual; --is a dog、this is a dog
(10)RTRIM(s,n):將刪除指定的右側字符。其中s是目標字符串,n是需要查找的字符,如果n不指定,則表示刪除右側的空格(空白)
select ltrim('this is a dog','dog'),ltrim('this is a dog ') from dual; --this is a、this is a dog
(11)trim:刪除指定的前綴或者后綴的字符,默認刪除空格
select trim(both 'x' from 'xyxabcyx'),trim(' abc aa ') from dual; --yxabcy 、 abc aa
3、日期和時間函數
(1)SYSDATE():獲取當前系統日期
select sysdate from dual; --以指定格式輸出當前日期 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; select sessiontimezone from dual;
(2)last_day(date):返回參數指定日期對應月份的最后一天
select last_day(sysdate) from dual;
(3)extract(datetime):可以從指定的時間中提取特定部分,例如提取年份,月份,或者時間等
select extract(year from sysdate),extract(minute from timestamp '1985-10-8 12:23:40') from dual; --2022、23
4、轉換函數
主要作用是完成不同數據類型之間的轉換。(字符串、日期、數值)
select ASCIISIR('從零開始學') from dual; --可以打印出每個漢字的ASCII碼
(1)ASCIISIR(char):可以將任意字符串轉換為數據庫字符集對應的ASCII字符串
(2)TO_CHAR:將一個數值型數據轉換成字符串數據
select to_char(10.123) from dual; --10.123(字符串) --將日期類型轉換為字符串類型 select to_char(sysdate,'yyyy-mm-dd') from dual; --2022-03-25(字符串類型)
(3)TO_DATE:將一個字符型數據轉換成日期型數據
select to_char(todate('1996-10-16','yyyy-mm-dd'),'month') from dual; --10月
(4)TO_NUMBER:將一個字符型數據轉換成數字數據
select to_number('1999.23') from dual; --1999.23(數字型) select to_number('1999.23abc') from dual --x錯誤
5、系統信息函數
USER:返回當前會話的登錄名
select user from dual; --system
6、NVL函數:由於聚合函數是忽略空值的,例如sum()、avg()等,所以經常使用NVL()函數進行null的轉換
nvl(列值,0),當列值為null時,取值為0,當列值為非null時,取值為列值本身
7、聚合函數
AVG():返回某列的平均值
COUNT():返回某列的最大值
MAX():返回某列的最大值
MIN():返回某列的最小值
SUM():返回某列值的和
COUNT():函數統計數據表中包含記錄行的總數,或者根據查詢結果返回列中包含的數據行數,其使用方法有兩種
(1)COUNT(*):計算表中總的行數,不管某列有無數值或者空值
(2)COUNT(字段名):計算指定列下總的行數,計算時將忽略空值的行
select count(*) as cust_num from customers; select count(c_email) from customers;
注意:指定列的值為空的行被COUNT函數忽略,但如果不指定列,而在COUNT函數中使用“ * ”,則所有記錄都不會被忽略
SUM():函數在計算時,忽略列值為null的行
select sum(quantify) from orderitems where o_num=3005; --求3005號訂單購買的水果總量
查詢數據(先寫from--再寫where--group by--having--再寫select---order by)
1、Oracle從數據庫中查詢數據的基本語句為select語句
2、在select語句中使用 “ * ”通配符代表所有字段
3、一般情況下,除非需要使用表中所有的字段數據,最好不要使用通配符 “ * ”,使用通配符最然可以節省輸入查詢語句的時間,但是獲取不需要的列數據通常會降低查詢和所使用的應用程序的效率。
通配符的優勢是,當不知道所需要的列的名稱時,可以使用通配符獲取他們。
4、Oracle中SQL語句是不區分大小寫的,因此SELECT和select作用是相同的,但是,許多開發人員習慣將關鍵字使用大寫,而數據列和表名使用小寫
5、在select語句中通常使用where子句對數據進行過濾
6、數據表創建的時候,設計表可以指定某列中是否可以包含空值(NULL)。
空值不同於0,也不同於空字符串。空值一般表示數據未知,不適用或將在以后添加數據。在select語句中使用is null子句,可以查詢某字段內容為空記錄,與is null相反的是is not null,該關鍵字查找字段不為空的記錄。
xxx=null 用法是錯誤的,應該是xxx is null;
select c_id from customers where c_email=null; (X) select c_id from customers where c_email is null; (✔)
7、count:求數據表總列數
select count(*) as cust_num from customers; --cust_num為別名 (as x :設置別名,as可省略)
8、select語句中,可以使用distinct關鍵字指示Oracle消除重復的記錄值
select distinct s_id from fruits; --將不重復的s_id號找出來
9、多列排序:在對多列進行排序的時候,首先排序的第一列必須有相同的列值,才會對第二列進行排序。如果第一列數據中所有值都是唯一的,將不再對第二列進行排序。
select f_name,f_price from fruits order by f_name,f_price; --按名稱、價格進行排序(價格排序不起作用)
(order by 以..排序,默認按照升序對記錄進行排序)
10、與DESC(降序)相反的是ASC(升序),將字段中的數據,按字母表順序升序排序。
實際上,在排序的時候ASC時作為默認的排序方式,所以加不加都可以
select f_name,f_price from fruits order by f_price desc; select f_price,f_name from fruits order by f_price desc,f_name asc; --對價格降序,對名稱升序排列
分組查詢
分組查詢是對數據按照某個或多個字段進行分組,Oracle中使用GROUP BY關鍵字對數據進行分組
基本語法為:
【GROUP BY 字段】【HAVING <條件表達式>】 --必須有group by才可以寫having
其中,“字段”值為進行分組時所依據的列名稱;
“HAVING <表達式>”指定滿足表達式限定條件的結果將被顯示;
GROUP BY關鍵字通常和聚合函數一起使用,例如,MAX()、MIN()、COUNT()、SUM()、AVG()
select s_id,count(s_id) from fruits group by s_id; --按s_id進行排序,並求出每組的記錄數
Oracle中可以在group by字節中listagg()函數,將每個分組中各個字段的值顯示出來
--根據s_id對fruits表中的數據進行分組,將每個供應商的水果名稱顯示出來 select s_id,listagg(f_name,',') within group(order by s_sid) as Names from fruits group by s_id; --根據s_id對fruits表中的數據進行分組,並顯示水果種類大於1的分組信息 select s_id from fruits gruop by s_id having count(f_name)>1;
注意:having關鍵字與where關鍵字都是用來過濾數據,兩者有什么區別呢?
其中重要的一點是:having通過在數據分組之后進行過濾來選擇分組,而where在分組之前,用來選擇記錄,
另外,where排除的記錄不再包括在分組中
rollup():
在group by子句中使用rollup關鍵字之后,在所有查詢出的分組記錄之后增加一條記錄,該記錄計算查詢出的所有記錄的總和,即統計記錄數量
select s_id,count(*) as total from fruits group by rollup(s_id);
多字段分組:
使用group by可以對多個字段進行分組,group by關鍵字后面跟需要分組的字段,oracle根據多字段的值來進行層次分組,分組層次從左到右,即先按第一個字段分組,
然后在第一個字段值相同的記錄中,再根據第2個字段的值進行分組,依次類推。
select o_num,sum(quantity * item_price) as orderTotal from orderitems group by o_num having sum(quantity * item *item_price)>=100; --查詢s_id=103的供應商的水果價格的平均值 select avg(f_price) as avg_price from fruits where s_id=103; --在fruits表中,查詢每一個供應商的水果價格的平均值 select s_id,avg(f_price) from fruits group by s_id;