文章目錄
1. 簡單數據查詢
1.1 單條件查詢
返回輸出的是滿足WHERE子句條件的所有記錄,即條件爲TRUE。
若需返回表所有記錄,條件可以是不爲零的常數。
1.2 根據查詢結果創建和複製表
create table stu1
as
select * from stu;
無where條件實現表結構和數據的複製;加入where 1=2
由於“1=2”爲false,因此只會複製表結構,也可用where rownum<1
實現
1.3 返回表中的前N行記錄
因爲rownum是符合條件的結果集的序號,從1開始集加的一個僞列
- 只能使用<、<=、!=
- 不能使用>、>=
- =1可以返回符合條件第一行數據
- 與order by使用時,先排序再取值
select * from stu
where rownum<4;
1.4 消除重複行
DISTINCT只消除查詢結果中的重複記錄,對原表無影響
select distinct sage from stu;
1.5 NULL值的判定
NULL表示
- 字段值未知(不包括零、一個或多個空格組成的字符串以及零長度的字符串)
- 字段值不存在
- 字段對錶的記錄不可用
另外:
- 空值不代表相等
- 用
IS NULL
和IS NOT NULL
判斷
1.6 查詢字段值爲某個範圍內的記錄
select * from stu
where sage between 22 and 25;
1.7 複合條件查詢
- and的優先級高於or,改變優先級需要用()來實現
- not的優先級最高
1.8 模糊查詢
like與通配符搭配使用
_
:與任意單字符匹配%
:一個或多個字符的字符串匹配[]
:與特定範圍(例如[a-f]或特定集(例如[abcdf])中 任意單字符匹配)
like後可以是完整的值,此時與=相同
1.9 使用ESCAPE和轉義字符
搜索%作爲字符而不是通配符就需要使用ESCAPE子句和轉義符來實現
select * from class
where ms like '%0!%' escape '!'
'%0!%'
表示
- 第一個“%”是通配符,允許前面有多個字符,若比例不是100%,可使用“_”;
- 後一個“%”爲 普通字符百分號,爲區別於通配符,加了轉義字符“!”,用
ESCAPE子句
定義的轉義字符“!”;(也可用ESCPAE
定義爲“\”、“a”)
2. 數據查詢函數使用
2.1 count計數
select count(distinct(sno) 人數 from stu;
2.2 sum求和
- 只能對數值型數據求和
- 也支持distinct關鍵字
2.3 avg求平均值
like sum
2.4 max求最大值
- 可用於非數值的數據
- 中文漢字比較時,將比較拼音字母
2.5 min求最小值
like min
count、sum、avg、max等聚合函數不能在WHERE子句中使用
2.6 replace查找替換
只改變顯示在控制端的值
select replace(sdept,'計算機','COMPUTER') 所在班級
from stu;
2.7 dual表
- 對所有用戶可用的一個實際存在的表
- 一行一列的結構固定的表,不能對其插入刪除
- 不可存儲信息,僅執行select語句
2.8 length返回字符串長度
還可統計數值位數
SQL> select length(34444) from dual;
LENGTH(34444)
-------------
5
SQL> select length(34444.444) from dual;
LENGTH(34444.444)
-----------------
9
2.9 round函數輸出記錄
round(處理的數值,精度(默認爲0,爲負數時對小數點前數字四捨五入))
SQL> l
1 select round(123.456),
2 round(123.456,2),
3 round(123.456,-2),
4 round(163.456,-2)
5* from dual
SQL> /
ROUND(123.456) ROUND(123.456,2) ROUND(123.456,-2) ROUND(163.456,-2)
-------------- ---------------- ----------------- -----------------
123 123.46 100 200
2.9 日期運算(add_months)
SQL> select sysdate from dual;
SYSDATE
--------------
29-3月 -20
SQL> select sysdate,add_months(sysdate,-12) from dual;
SYSDATE ADD_MONTHS(SYS
-------------- --------------
29-3月 -20 29-3月 -19
參數N爲小數時,往前取整數
2.10 日期格式化輸出( to_char(d|n[,fmt])
)
SQL> l
1* select to_char(sysdate,'yyyy/mm/dd') 年月日,to_char(sysdate,'yyyy/mm/dd hh:mi:ss')年月日12小時制,to_char(sysdate,'yyyy/mm/dd hh24:mi:ss')年月日24小時制 ,to_char(sysdate,'yyyy"年"mm"月"dd"日"') 自定義年月日 from dual
SQL> /
年月日 年月日12小時制 年月日24小時制 自定義年月日
----------- -------------------------------------- -------------------------------------- ---------------
2020/03/29 2020/03/29 10:32:53 2020/03/29 22:32:53 2020年03月29日
自定義年月日時需要使用雙引號引用非格式化字符
2.11 提取日期特定部分
EXTRACT(fmt from d)
SQL> l
1 select sysdate 當前時間,
2 extract(year from sysdate) 年份,
3 extract(month from sysdate) 月份,
4 extract(day from sysdate) 日,
5 extract(hour from systimestamp) 小時,#systimestamp纔可抽取時分
6 extract(minute from systimestamp) 分,
7 extract(second from systimestamp) 秒
8* from dual
SQL> /
當前時間 年份 月份 日 小時 分 秒
-------------- ---------- ---------- ---------- ---------- ---------- ----------
29-3月 -20 2020 3 29 14 38 52.059
`extract`提取時間,HOUR匹配結果沒有加上時區,故在中國運行結果小八小時
ROUND(d[,fmt])
返回四捨五入日期值
SQL> l
1 select sysdate 當前日期,
2 round(sysdate),
3 round(sysdate,'year') round年, #返回某年的一月一日
4 round(sysdate,'month') round月,#返回某月的一日
5 round(sysdate,'day') round日#返回最近周的週日
6* from dual
SQL> /
當前日期 ROUND(SYSDATE) ROUND年 ROUND月 ROUND日
-------------- -------------- -------------- -------------- --------------
29-3月 -20 30-3月 -20 01-1月 -20 01-4月 -20 29-3月 -20
2.12 數據類型轉換
to_char:將日期類型和數字類型轉換爲字符串類型
to_num:將字符串類型轉換爲數字類型
SQL> select to_char(-123456,'L9.9EEEEPR') from dual;
TO_CHAR(-123456,'L9.9EEEEPR')
----------------------------------------
<¥1.2E+05>
SQL> select to_number('-$12,345.67','$99,999.99') 數字 from dual;
數字
----------
-12345.67
2.13 計算時間差
SQL> select floor(to_number(sysdate-to_date('2019-03-29','yyyy-mm-dd'))) as spandays from dual;
SPANDAYS
----------
366
- to_date 指定日期返回格式
- to_number將日期轉爲數值類型
- floor 取小於等於該相差值的最大整數
SQL> select ceil(to_number(sysdate-to_date('2019-03-29','yyyy-mm-dd'))) as spandays from dual;
SPANDAYS
----------
367
- ceil獲取大於等於該相差月份的最小整數
74