1. 程式人生 > >基本SQL語句(Oracle)

基本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

  1. 插入的資料應與欄位資料型別相同。
  2. 資料的大小應該在規定範圍之內。
  3. 在values中列出的資料位置必須與被加入的列的排列位置相對應。
  4. 字元和日期型資料應包含在單引號中。
  5. 插入空值,不指定’’或給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進行查詢演示。

  1. 基本查詢語句 select [distinct] *|[column 1,column 2 ……] from表名 [where (條件)]

示例:

查詢所有列。      select * from emp;

查詢指定列。     select distinct job from emp;

不顯示重複列。   select distinct job from emp;

  1. 查詢中使用算術表示式 select sal*12 from emp;
  2. 查詢中使用函式 select sal*12+nvl(comm,0)  from emp;

說明: NVL(E1, E2)的功能為:如果E1為NULL,則函式返回E2,否則返回E1本身。

  1. 拼接字串select ename||'是一個'||job from emp;

說明:在查詢時,如果希望將多列拼接起來作為一個字串可以使用||

  1. 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;

  1. between  and  在兩者之間

select * from emp where sal between 2000 and 2500;--閉區間

select * from emp where sal not between 2000 and 2500;

  1. in

select * from emp where ename in ('ALLEN','WARD','MARTIN');

select * from emp where ename not in ('ALLEN','WARD','MARTIN');

  1. 使用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';--不常用

  1. is null的用法

顯示沒有上級的員工

select * from emp where mgr is null;

  1. 使用邏輯運算子

select * from emp where mgr is null or comm is null;

select * from emp where mgr is null and comm is null;

  1. 增加排序功能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;--使用數字排序  按照查詢列的順序

  1. 別名排序

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;--查詢當前使用者的所有表