基本SQL語句(Oracle)
oracle資料型別
文字,二進位制型別:
char 存放字串,最大存放2000個字元,是定長。
varchar2 存放字串,最大可以存放4000個字元,可變長度。
如果資料長度是固定的,應當使用char,如果存放的資料長度是變化的,則使用varchar2。
nvarchar2 Unicode資料型別,變長,最大長度4000。
clob 字元型大物件,變長,最大8tb
blob 二進位制大物件,變長,可以存放圖片和聲音 【注意:一般不直接存放圖片和聲音,而是存放連結。】
數值型:
number 可以存放整數,也可以存放小數。
number 儲存資料範圍, -1.0e-130<=number<1.0e126,預設可以表示整數和小數。
number(10,5) 有效數字10位,小數5位
number(5,0) 、number(5) 有效數字5位,小數0位 整數。
注意:如果有明確要求小數點儲存到第幾位,則明確指定,如果沒有,直接使用number即可。
number是變長 使用1-22bytes來表示
日期型別:
date 用於表示時間 年月日時分秒,預設格式 DD-MM-YYYY,從公元前4712年1月1日到公元4712年12月31日的所有合法日期。
新增的時候使用to_date('20180408 222730','yyyyMMdd hh24miss')
TimeStamp 更加精確,精確到小數秒,最多小數點後9位,預設6位。
使用麻煩,如果沒有特別要求,不推薦。
insert into TEST(updatetime) values(to_timestamp(to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS'));
資料表的建立
類和表的對應關係。
學生資訊表,教師資訊表。
基本語法:
create table student(
id number,
name varchar2(64),
sex char(2),
birthday date,
score number(4,2),
resume clob
);
使用sql指令碼建立表。
使用工具建立表。
資料表的修改
新增列:
alter table 表名 add(新的列名 列的型別);
alter table 表名 add(新的列名 列的型別,新的列名2 列的型別2);
刪除列:
alter table 表名 drop column(列名);
alter table 表名 drop (列名,列名2);--刪除多列不能新增column
修改欄位的型別:
alter table 表名 modify(列名 列的新型別);
alter table 表名 modify(列名 列的新型別,列名2 列2的新型別);
修改表名
rename 舊錶名to 新表名;
刪除表
drop table 表名;
CRUD操作
增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)
INSERT
- 插入的資料應與欄位資料型別相同。
- 資料的大小應該在規定範圍之內。
- 在values中列出的資料位置必須與被加入的列的排列位置相對應。
- 字元和日期型資料應包含在單引號中。
- 插入空值,不指定’’或給null
insert into stu values(1,'ouyang','男');
insert into stu(id) values(1);
insert into stu values(1,null,’’);
比較運算子
> 大於
< 小於
>= 大於等於
<= 小於等於
= 等於
!= 不等於
<>不等於
SELECT
select * from表名 where 條件
select 列名 from 表名 where 條件
select 指定查詢哪些列的資料。
column指定列名
使用scott使用者下的三張表:dept,emp,salgrade進行查詢演示。
- 基本查詢語句 select [distinct] *|[column 1,column 2 ……] from表名 [where (條件)]
示例:
查詢所有列。 select * from emp;
查詢指定列。 select distinct job from emp;
不顯示重複列。 select distinct job from emp;
- 查詢中使用算術表示式 select sal*12 from emp;
- 查詢中使用函式 select sal*12+nvl(comm,0) from emp;
說明: NVL(E1, E2)的功能為:如果E1為NULL,則函式返回E2,否則返回E1本身。
- 拼接字串select ename||'是一個'||job from emp;
說明:在查詢時,如果希望將多列拼接起來作為一個字串可以使用||
- where子句的用法
查詢工資高於3000的員工
select * from emp where sal>3000;
查詢1982年1月1日之後入職的員
select * from emp where hiredate>to_date('19820101','yyyymmdd');
顯示工資在2000和2500之間的員工資訊
select * from emp where sal>=2000 and sal<=2500;
- between and 在兩者之間
select * from emp where sal between 2000 and 2500;--閉區間
select * from emp where sal not between 2000 and 2500;
- in
select * from emp where ename in ('ALLEN','WARD','MARTIN');
select * from emp where ename not in ('ALLEN','WARD','MARTIN');
- 使用like模糊查詢
%表示0到多個字元
_表示一個字元
select * from emp where ename like '%ITH';
select * from emp where ename like '_ITH';--沒有資料
select * from emp where ename like '_MITH';
select * from emp where ename not like '%LEN';--不常用
- is null的用法
顯示沒有上級的員工
select * from emp where mgr is null;
- 使用邏輯運算子
select * from emp where mgr is null or comm is null;
select * from emp where mgr is null and comm is null;
- 增加排序功能order by
select [distinct] *|[column 1,column 2 ……] from表名 [where (條件) order by 列名 ]
select * from emp order by sal;--預設升序
select * from emp order by sal asc;--升序
select * from emp order by sal desc;--降序
select * from emp where job = 'CLERK' order by sal desc;--降序
select * from emp where job = 'CLERK' order by empno,sal desc;--按照員工號升序工資降序
select * from emp order by 8;--使用數字排序 按照表列的順序
select empno,ename,deptno from emp order by 3;--使用數字排序 按照查詢列的順序
- 別名排序
select sal*12+nvl(comm,0) yearSal from emp order by yearsal;
注意:
oracle 關鍵字,列名,表名等都不區分大小寫,但是表中的資料是區分大小寫的。
擴充套件:
select * from user_tables; 查詢使用者下的所有表
select * from dba_users;--查詢所有使用者資訊,使用管理員使用者
UPDATE
update 表名 set 列名=表示式 {+} where 條件
update語法可以使用新值更新原有錶行中的各列。
set子句指示要修改哪些列和給與哪些值。
where子句指定更新哪些行。如沒有where子句,則更新所有的行(特別小心)。
DELETE
delete from 表名where 條件
truncate table 表名;刪除所有記錄,不寫日誌,速度快,無法恢復。
COMMIT和ROLLBACK
commit 提交
rollback 回滾
DML,DDL,DCL
DML(data manipulation language):
它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫裡的資料進行操作的語言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,資料型別,表之間的連結和約束等初始化工作上,他們大多在建立表時使用
DCL(Data Control Language):
是資料庫控制功能。是用來設定或更改資料庫使用者或角色許可權的語句,包括(grant,deny,revoke等)語句。在預設狀態下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人員才有權力執行DCL
統計函式
max,min,sum,avg,count
查詢員工數量
select count(*) from emp;
查詢有獎金的人
select count(comm) from emp;--空值不統計
查詢最高工資。
select max(sal) from emp;
查詢最低工資。
select min(sal) from emp;
查詢最高年薪。
select max((sal+nvl(comm,0))*12) from emp;
查詢平均工資。
select avg(sal) from emp;
select avg(comm) from emp;--獎金不一定有,沒有的不參與
查詢總工資。
select sum(sal) from emp;
查詢真正的平均工資
select sum(sal)/count(*) from emp;
group by 和 having子句
group by 列名 用於分組
having 表示式 針對於一組資料,譬如求
兩者一般結合使用,單獨使用也可以。
按照部門分組查詢部門平均工資和最高工資
select avg(sal),max(sal),deptno from emp group by deptno;
select avg(sal),max(sal),deptno from emp;--錯誤 不是單組分組函式
查詢部門不同崗位的平均工資和最高工資
select avg(sal),max(sal),deptno,job from emp group by deptno,job;
查詢部門不同崗位的平均工資和最高工資並按照部門和崗位排序。
select avg(sal),max(sal),deptno from emp group by deptno,job order by deptno,job;
查詢部門平均工資低於2000的部門的平均工資和最高工資。【典型用法】
select avg(sal) ,max(sal),deptno from emp group by deptno having avg(sal)<2000;
select avg(sal) ,max(sal),deptno from emp where avg(sal)<2000 group by deptno; --錯誤,此處不允許使用分組函式
單獨使用having
select avg(sal) ,max(sal),deptno from emp group by deptno having 1>2;--擴充套件 特殊形式
為什麼不能使用having替代where
select * from emp having avg(sal)>20;--不是group表示式
當同時使用group by having order by 的順序問題
推薦使用順序 group by having order by
查詢部門工資低於2000的部門不同崗位的平均工資和最高工資並按照部門和崗位排序。
select avg(sal),max(sal),deptno from emp group by deptno,job having avg(sal)<2000 order by deptno,job;--推薦寫法
select avg(sal),max(sal),deptno from emp having avg(sal)<2000 group by deptno,job order by deptno,job;--不推薦寫法
select avg(sal),max(sal),deptno from emp order by deptno,job having avg(sal)<2000 group by deptno,job ;--錯誤寫法
其他常用語句
select * from all_tables where owner = 'SCOTT';--查詢scott使用者下的所有表
select * from user_tables;--查詢當前使用者的所有表