1. 程式人生 > >oracle基礎語句學習

oracle基礎語句學習

avi 管理 刪除 選擇 result 通配 job ssm null

1.尋找公司所有部門信息

select * from dept;

2.尋找特定列

select dept_name from dept;

3.使用列別名

基本書寫方法:列名 列別名

       列名 as 列別名

以下三種情況,列別名兩側需要添加雙引號(""):

  列別名中包含有空格。

  列別名中要求區分大小寫。

  列別名中包含有特殊字符。

select emp_id id,last_name as emp_name,salary "Salary",(400+salary)*12 "Annual Salary" from emp;

4.連接運算符的使用

采用豎線(||)來連接做連接運算符

select empno||‘ ‘||ename from emp;

5.distinct關鍵字的用法

去重

select distinct dept_id,job_id from emp;

6.選擇表中的部分行,where子句

select last_name,hire_date from emp where hire_date >=‘01-1月-1999‘;

7.between...and...

select emp_id,last_name,salary from emp where salary between 4200 and 5000;

8.in運算符

select emp_id,last_name,salary,dept_id from emp where dept_id in (10,90,110);

9.like運算符

模糊查詢。常用的通配符有"%"和"_",百分號代表多個字符,下劃線代表一個字符。

查詢的有特殊字符時,會用到escape

select emp_id,last_name,salary from emp where last_name like ‘S%‘;

select emp_id,last_name,salary from emp where last_name like ‘_b%‘;

select emp_id,last_name,salary,job_id from emp where job_id like ‘FI\_%‘ escape ‘\‘;--查詢job_id以“FI_”開頭的信息

10.is null運算符

select emp_id,last_name,dept_id from emp where dept_id is null;

11.and運算符

select emp_id,last_name,sal from emp wjere sal >=4200 and sal <=6000;

12.or運算符

select last_name,salary,dept_id from emp where salart > 10000 or dept_id in (60,90);

13.not運算符

select last_name,job_id,salary from emp where job_id not in (‘IT_PROG‘,‘ST_CLERK‘,‘FI_ACCOUNT‘);

14.order by子句

select last_name,job_id,salary,dept_id from emp order by dept_id desc;--默認是asc

使用列別名排序,多列排序

select last_name,job_id,salary*12 annual,dept_id from emp order by annual;

select last_name,job_id,salary*12 annual,dept_id from emp order by job_id,annual desc;

order by子句可以出現在select子句中沒有出現過的列。

select last_name,job_id,hire_date from emp order by salary;

order by子句後的列名可以用數字來代替,數字為select後列的順序。

select last_name,job_id,salary,dept_id form emp order by 2,3 desc;

15.字符函數

lower:將大寫或小寫混合的字符轉換成小寫。

upper:將大寫或小寫混合的字符轉換成大寫。

initcap:將每個單詞的第一個字母轉換成大寫,其余的變為小寫。

    函數          結果

lower(‘SQL Course‘)       sql course

upper(‘SQL Course‘)      SQL COURSE

initcap(‘SQL Course‘)      Sql Course

字符處理函數

concat:連接兩個值,相當於‘||’

substr:返回第一個參數中從n1字符開始長度為n2的子串,如果n1是負值,表示從後向前數的abs(n1)位,如果n2省略,則取n1之後的所有字符

length:取字符長度

instr:返回s1中,子串s2從n1開始,第n2次出現的位置

lpad:返回s1被s2從左面填充到n1長度

rpad:返回s1被s2從右面填充到n1長度

trim:去除字符串頭部或者尾部的字符

replace:把s1中的s2用s3替換

    函數          結果

concat(‘Good‘,‘string‘)    Goodstring

substr(‘string‘,1,3)      str

length(‘string‘)        6

instr(‘string‘,‘r‘)        3

lpad(sal,10,‘*‘)        ******5000

rpad(sal,10,‘*‘)        5000******

trim(‘S‘ from ‘SSMITH‘)    MITH

replace(‘abc‘,‘b‘,‘d‘)      adc

select emp_id,concat(first_name,last_name) name,job_id,length(last_name) length from emp where substr(job_id,4)=‘ACCOUNT‘ and instr(last_name,‘e‘) > 0;

16.數字函數

round:將列活表達書所表示的值四舍五入到小數點後第n位

trunc:截取到小數點後第n位

mod:取m除以n得到的余數

select round(65.654,2),round(65.654,0),round(65.654,-1) from dual;

select trunc(65.654,2),trunc(65.654,0),trunc()(65.654,-1) from dual;

select emp_id,last_name,sal,mod(sal,900) from emp where dept_id = 90;

17.日期函數

sysdate:系統日期

months_between:兩個日期相隔的月數

add_months:在指定日期基礎上加相應的月數

next_day:某一日期的下一個指定日期

last_day:指定日期當月最後一天的日期

round:將date按照fmt指定的格式進行四舍五入 round(date,[‘fmt‘])

trunc:按照指定格式進行截取

extract:從日期類型中取出指定年、月、日

select last_name,sal,months_between(sysdate,hire_date) months from emp order by months;

select last_name,sal,hire_date,add_months(hire_date,3) new_date from emp where hire_date > ‘01-1月-1999‘;

select next_day(‘02-2月-06‘,‘星期一‘) next_day from dual;

select last_day(‘02-2月-06‘) "LAST_DAY" from dual;

select emp_id,hire_date,round(hire_date,‘MONTH‘) from emp where substr(hire_date,-2,2) = ‘98‘;-- -2,2為從右向左數2位

select emp_id,hire_date,trunc(hire_date,‘MONTH‘) from emp where substr(hire_date,-2)=‘98‘;

select last_name,hire_date,extract(MONTH FROM hire_date) MONTH from emp where dept_id = 90;

18.數據類型顯性轉換

to_char函數:轉換成字符型

to_date函數:轉換成日期

to_number:轉換成數字型

19.NVL函數:NVL(表達式1,表達式2) 空值轉換

NVL(comm,0)

NVL(hire_date,‘01-JAN-06‘)

NVL(job_id,‘No Job Yet‘)

20.NVL2函數:NVL2(表達式1,表達式2,表達式3),對第一個參數進行檢查,如果第一個參數不為空,則輸出第二個參數,否則輸出第三個參數

select last_name,salary,NVL2(commission_pct,salary+commission_pct,salary) income from emp where last_name like ‘_a%‘;

21.NULLIF函數:NULLIF(表達式1,表達式2),對兩個參數比較,當兩個參數不相等時,返回第一個參數值,相等返回空值

select last_name,length(last_name),NULLIF(length(last_name),length(email)) result from emp where last_name like ‘D%‘;

22.coalesce函數:是對NVL函數的擴展,返回第一個不為空的參數,參數個數不受限制

select last_name,coalesce(commission_pct,salary*1.3,100) comm,dept_id from emp where dept_id in (50,80) order by comm;

23.case語句

select last_name,commission_pct,

  (case commission_pct

    when 0.1 then ‘低‘

    when 0.2 then ‘中‘

    when 0.3 then ‘高‘

    else ‘無‘

  end) commission from emp where commission_pct is not null order by last_name;

24.decode語句

select last_name,commission_pct,

  decode(commission_pct,

      0.1 ‘低‘,

      0.2 ‘中‘,

      0.3 ‘高‘,

      ‘無‘

) commission from emp where commission_pct is not null order by last_name;

25.多表關聯:

笛卡爾積:把表中所有的記錄作乘積操作,生成大量的結果,行程這種情況的原因通常是猶豫連接條件缺失

等值連接:簡單連接成內連接,當兩個表有公共字段

select emp.last_name,emp.job_id,emp.dept_id,dept.dept_name from emp,dept where emp.dept_id=dept.dept_id;

select emp.last_name,emp.job_id,emp.dept_id,dept.dept_name from emp,dept where emp.dept_id=dept.dept_id and emp.job_id like ‘%MAN%‘;

ps:sql語句的書寫順序是:select from where group by order by

sql實際的執行順序是:from where group by select order by

兩個以上表連接:

select e.last_name,e.jpb_id,e.dept_id,d.dept_name,l.city from emp e,dept d,locations l where e.dept_id=d.dept_id and d.location_id=l.location_id and l.city in (‘Southlake‘,‘Oxford‘);

不等值連接:between...and...

select e.last_name,e.job_id,e.salary,s.grade_level from emp e,salgrades s where e.salary between s.lowest_salary and s.highest_salary and e.job_id in (‘IT_PROG‘,‘SA_REP‘) order by s.grade_level;

左外連接:以左表為基準,左表中的每個記錄都必須顯示,即使右表中沒有記錄

右外連接:以右表為基準,右表中的每個記錄都必須顯示,即使左表中沒有記錄

select e.last_name,e.job_id,e.dept_id,d.dept_name from emp e,dept d where e.dept_id(+)=d.dept_id;--查詢所有部門信息,不管部門是否有員工

select e.last_name,e.job_id,e.dept_id,d.dept_name from emp e,dept d where e.dept_id=d.dept_id(+);--查詢所有員工信息,不管員工是否有部門

cross join:交叉連接,生成笛卡爾積

natural join:自然連接

26.using:using(column_name),using子句通過名字來具體指定連接

join table2 on (table1.column_name=table2.column_name) 等值連接

left|right|full outer join:左外|右外|全外連接

27.註意:using子句和natural join不能再一套語句中同時書寫

28.on子句

select e.last_name,e.job_id,e.dept_id,d.dept_name from emp e join dept d on (e.dept_id=e.dept_id);

29.全外連接:select e.last_name,e.job_id,e.dept_id,d.dept_name from emp e full outer join dept d on e.dept_id = d.dept_id;

30.union操作符:取並集(去掉重復值)

 union all:取並集以及重復部分

 intersect:去交集

 minus:取差集

31.分組函數:

min和max:最小值和最大值

sum和avg:總和和平均值

count:條數

select avg(commission_pct) from emp;--忽略空值

select avg(nvl(commission_pct,0)) from emp;

group by:select job_id,manager_id,avg(salary) from emp group by job_id,manager_id order by job_id;

使用group by子句時,group by後的列可以不再select語句中出現;select厚的費分組函數列必須在group 不用子句中出現。

32.having子句:

select job_id,max(salary) from emp group by job_id having max(salary) >= 9000;

註意:where與having的區別:

  where是一個約束聲明,是在結果返回之前起作用的,不能再where中使用聚合函數

  having是一個過濾聲明,是在結果返回之後起作用的,可以使用聚合函數

33.子查詢:

select last_name,job_id,salary,dept_id from emp where dept_id = (select dept_id from emp where last_name=‘Char‘);

34.多行子查詢-in操作符

select a.last_name,a.salary from emp a where a.emp_id in (select b.manager_id from emp b);

35.相關子查詢:

select last_name,salary,job_id from emp e where salary > (select avg(salary) from emp where job_id = e,job_id);

36.insert

insert into dept values(300,‘oper‘,110,1500);

insert into emp(emp_id,last_name) values(20,‘Qiuj‘);

insert into hemp select * from emp where hire_date < ‘09-1月-06‘;

insert into emp((emp_id,last_name) select * from (select 300,‘qiuj1‘) from dual union all select * from (select 301,‘qiuj2‘) from dual);

mysql中value後面可以直接接,用逗號分隔就可以。

37.delete

delete [from] table1 [where...];

38.merge

merge into table1 [t_alias] using {table|view|subquery} [t_alias];

39.自動提交

set autocommit [on|off];

40.事務回滾

rollback;

savepoint a;--定義保存點a

rollback to a;--撤銷操作到a保存點

commit;--提交寫入數據庫,commit之後不能回滾

41.鎖:用來在多用戶並發訪問和操作數據庫時保證數據的一致性。

42.創建表

create table table_name [column datatype [default expr]]...

默認值:default

使用只查詢創建表

create table dept as select emp_id,last_name,sal+1000 newsalary from emp where dept=10;--select列表中的表達式要給定別名,沒有別名會發生錯誤

引用另一個用戶的表

select * from scott.emp;--註意權限

43.oracle表的分類

用戶表;數據字典

查詢數據字典:select table_name from user_tables;

查詢數據字典結構:desc user_tables;

rowid:偽列,是表中虛擬的列,系統自動產生,唯一地址

44.alter:列的操作

alter table dossier add (sex char(1));

alter table dossier modify(sex default ‘1‘);

alter table emp drop (last_name,newsalary);

45.drop:

drop table table1;

46.rename:

rename old_name to new_name;

47.截斷表:

truncate tabletbale_name;

48.約束:

not null:非空,列級指定,不可指定為表級

unique:唯一

primary key:主鍵(包含非空和唯一)

foreign key:外鍵

check:檢查

約束可以通過alter...add...和alter...drop...和alter...disable\enable來增加、刪除、禁用、啟用

49.視圖:是虛表,是一個命名的查詢,用於改變基表數據的顯示,簡化查詢,本身不占用數據庫內存

50.概念:

刪除視圖:drop vireview_name;

內聯視圖:select last_name,dept_name from dept a,(select last_name,dept_id from emp) b where a,dept_id = b.dept_id;

TOP-N:查找表中最大或最小的N條記錄功能

oracle:rownum

序列:create sequence [schema] 序列名

    [increment by n] --序列中間的間隔,默認為1

    [start with n] --起始序列值,默認為1

    [maxvalue n | nomaxvalue]

    [minvalue n | nominvalue]

    [cycle | nocycle] --循環,nocycle默認

    [cache n | nocache]; --預先分配並存儲,cache 20是默認

偽列:nextval和currval

  nextval:在序列中增加新值並返回此值

  currval:當前序列正被分配的序列值

索引:

create index indexname on table(column[,column,...]);

drop index indexname;

同義詞:

create synonym s_emp for hr.emp;

drop synonym s_emp;

創建用戶:

create user user_name identified by password [default tablespace]

默認表空間名 temp tablespace 臨時表空間名 quota 配額大小 on表空間名

登錄權限:grant create session to test;

用戶建表權限:create table emp(id number,last_name varchar2(20));

查詢數據庫表空間:select * from v$tablesapce;

修改默認表空間配額:alter user user_name default 默認表空間名;

密碼修改:alter user user identified by newpaword;

狀態管理語句:alter user user password expire;--密碼過期

       alter user user account lock\unlock;--賬戶鎖定\解鎖

刪除用戶:drop user user;

授予權限:grant create session to test with admin option;

創建角色:create role role;

通過角色為用戶test授權:grant tr to test;

oracle基礎語句學習