oracle基礎語句學習
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基礎語句學習