為什么要用數(shù)據(jù)庫(kù)?
文件存儲(chǔ):
1、不易于管理和分析(Linux操作系統(tǒng)下輸入ls命令會(huì)卡死)
2、不易于共享
3、文件內(nèi)容不斷增大,不易于存儲(chǔ)
數(shù)據(jù)庫(kù):用數(shù)據(jù)結(jié)構(gòu)來(lái)管理、存儲(chǔ)數(shù)據(jù)的倉(cāng)庫(kù)
DB:Database數(shù)據(jù)庫(kù)
DBMS:數(shù)據(jù)庫(kù)管理系統(tǒng)
數(shù)據(jù)庫(kù)軟件:Oracle MySQL db2 sql-server sybase
關(guān)系型數(shù)據(jù)庫(kù):由二維表組成
非關(guān)系型數(shù)據(jù)庫(kù)(NOSQL not only sql):
Web 高并發(fā)性MongoDB redis
關(guān)系:二維表
二維表:由行和列組成的表格
行:Record一條記錄信息
列:字段(Feild) 屬性
SQL:(structured query language 結(jié)構(gòu)化查詢(xún)語(yǔ)言)
Oracle甲骨文
Java sun ---> oracle收購(gòu)
Mysql my ----> sun(2008年1) ---> oracle(2009年4)
db2IBM
Sybasesybase C/S數(shù)據(jù)庫(kù)
Sql server MS 微軟
現(xiàn)在是oracle的天下
Oracle商業(yè)(收費(fèi))大型數(shù)據(jù)庫(kù)個(gè)人使用
Sql server
Windows 商業(yè)(收費(fèi))
Mysql開(kāi)源免費(fèi) --->收費(fèi)免費(fèi)版本(不提供服務(wù))
一般中小型企業(yè)用mysql阿里用mysql
移動(dòng)、聯(lián)通、電信都用oracle
數(shù)據(jù)庫(kù)是以二維表的形式存儲(chǔ)數(shù)據(jù)
數(shù)據(jù)庫(kù)客戶(hù)端:sqldeveloper
plsql developer(公司一般用)
查看數(shù)據(jù)庫(kù)里有哪些表:
select * from all_tables;顯示用戶(hù)有權(quán)限看到的所有的表,包括系統(tǒng)表
select *from user_tables;當(dāng)前用戶(hù)的所有表
selet *from dba_tables;是管理員可以看到的數(shù)據(jù)庫(kù)中所有的表
數(shù)據(jù)庫(kù)不難,提升效率難:如雙11
SQL:所有數(shù)據(jù)庫(kù)基本通用的語(yǔ)言
所有數(shù)據(jù)庫(kù)都遵循一套規(guī)則
主體語(yǔ)言:Java
腳本:
數(shù)據(jù)庫(kù):
數(shù)據(jù)結(jié)構(gòu)和算法:
業(yè)務(wù)知識(shí),業(yè)務(wù)框架:
SQL:
DDL:Data Definition Language數(shù)據(jù)定義語(yǔ)言(操作對(duì)象是表)
關(guān)鍵字:CREATE:創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象 建表
DROP:刪表
ALTER:改表結(jié)構(gòu)
TRUNCATE:刪除表數(shù)據(jù),不刪除表結(jié)構(gòu)
DML:Data Manipulation Language數(shù)據(jù)操作語(yǔ)言(操作對(duì)象是表的記錄)
關(guān)鍵字:INSERT:插入數(shù)據(jù)
DELETE:刪除數(shù)據(jù)
UPDATE:修改數(shù)據(jù)
影響的數(shù)據(jù),需要事物控制語(yǔ)句才能生效
eg:一張表里兩個(gè)字段的值
Update** set coll=**,col=**;
TCL:Transaction Control Language事物控制語(yǔ)句
關(guān)鍵字:COMMIT:提交,確定把數(shù)據(jù)提交到數(shù)據(jù)庫(kù)
ROLLBACK:回滾,把影響數(shù)據(jù)的操作撤銷(xiāo)
SAVEPOINT:設(shè)置保存點(diǎn),更有利于回滾到特定的場(chǎng)景
DCL:Data Contro Language數(shù)據(jù)控制語(yǔ)句(操作對(duì)象是用戶(hù)student)
關(guān)鍵字:GRANT:賦權(quán)
REVOKE:回收權(quán)限
CREATE USER:創(chuàng)建用戶(hù)
企業(yè)中對(duì)權(quán)限管理非常嚴(yán)格:允許插數(shù)據(jù),不允許刪數(shù)據(jù)
DQL:Data Query Language數(shù)據(jù)查詢(xún)語(yǔ)句
關(guān)鍵字:SELECT
oracle數(shù)據(jù)類(lèi)型:
1、數(shù)字類(lèi)型(只用NUMBER)
NUMBER(p,s)
P表示總位數(shù)
S:表示小數(shù)的位數(shù)
可正可負(fù),最多位數(shù)為38位
INTERGER == NUMBER(38)
例子:NUMBER(7,3)能表示的最大的數(shù):9999.999
2、字符串類(lèi)型
CHAR(n):固定長(zhǎng)度的字符,定長(zhǎng)字符串
n可以省略,默認(rèn)為1
指定n,代表n個(gè)字節(jié)寬度,即使存儲(chǔ)的數(shù)據(jù)的字節(jié)小于n,也占n個(gè)字節(jié),其余的補(bǔ)空格
最長(zhǎng)只能存儲(chǔ)2000個(gè)字節(jié)
VARCHAR2(n):變長(zhǎng)字符串
N表示字符串最大的長(zhǎng)度
Varchar2(100)只存儲(chǔ)10個(gè)字符,實(shí)際上字符串占的內(nèi)存和它自身長(zhǎng)度是一致的
如:varchar2(100) hello存儲(chǔ)5個(gè)字節(jié)
節(jié)省內(nèi)存
最長(zhǎng)能存儲(chǔ)4000個(gè)字節(jié)
LONG:2GB
CLOB
3、時(shí)間類(lèi)型
DATE
默認(rèn)‘DD-MON-YY(RR)’
Systimestamp 時(shí)間輟 (時(shí)間毫秒)
Sysdate 系統(tǒng)時(shí)間
DDL:
CREATEcreate
建表:
Create table table_name(
字段名1 字段類(lèi)型,
字段名2 字段類(lèi)型,
....
);
自動(dòng)提交,不用COMMIT
all_tables:記錄數(shù)據(jù)庫(kù)所有的表
//owner屬有者,擁有者
Table_name:表名
user_tables:記錄當(dāng)前用戶(hù)下所有的表
//dba_tables:記錄所有的表,包括系統(tǒng)表(現(xiàn)在不講)
約法三章:
1、同一個(gè)數(shù)據(jù)庫(kù),同一個(gè)用戶(hù)下,只能有唯一的標(biāo)識(shí)符,同名的表只能有一個(gè);
2、不要用別人的表;
3、自己建了之后記得刪掉
Sql語(yǔ)句除了字符串里的內(nèi)容,都要是英文的
創(chuàng)建表:create table ly_student(
name varchar2(20),
id number(12),
gender char(1),
birth date
);
Number:默認(rèn)38位
查看表結(jié)構(gòu):desc wly_student;
能夠查看表的所有字段以及字段類(lèi)型
往里面插入數(shù)據(jù):
Insert into table_name(字段名) values(值);
字符串用單引號(hào)表示 ’ ’
日期:to_date(‘2017-08-02’,’YYYY-MM-DD’)
alter session set nls_date_format = 'yyyy mm dd hh34:mi:ss';
select sysdate-1,sysdate,sysdate+1 from dual;
查找昨天,今天,明天這一時(shí)刻的時(shí)間,按指定格式輸出
插入:
insert into ly_student(name,id,gender,birth)
values(‘龍’,001,’M’,to_date(‘2017-08-02’,’YYYY-MM-DD’));
精度或者位數(shù)超長(zhǎng),報(bào)錯(cuò)!
Commit;//插入后要提交
EMPLOYEE_ID NUMBER Primary Key:主鍵(唯一非空:值不能有重復(fù))
當(dāng)前面賦值過(guò)的值,后面再次被賦值時(shí),會(huì)報(bào)錯(cuò),必須賦值
查看表的內(nèi)容:seletct * from wly_student;
comment on table ly_student is ’student information’;
comment on column ly_student.name is ‘student name’;
comment on column ly_student.id is ‘student id’;
comment on column ly_student.gender is ‘student gender’;
comment on column ly_student.birth is ‘student birth’;
完整的建表語(yǔ)句:
建表的sql腳本及表和字段的詳盡說(shuō)明
===============================================
drop:刪除表
drop table ly_student;
按照表名查找特定的表:
select * from user_tables where table_name like '%LY_STUDENT&';
like '%LY_STUDENT&' 可以換成=table_name
需要注意的是:表名大寫(xiě)
drop table ly_student;
create table ly_student(
name varchar2(20),
id number(12),
gender char(1),
birth date
);
Alter table table_name add(字段名 字段類(lèi)型);
alter table ly_student add(address VARCHAR2(100));
Alter table table_name drop column字段名;
Alter table table_name drop column address;
刪除字段時(shí),要逐行刪除該字段的數(shù)據(jù),當(dāng)數(shù)據(jù)量較大時(shí),效率會(huì)比較慢
Alter table table_name modify(字段名 字段類(lèi)型);
Rename old_table_name to new_table_name;修改一個(gè)表的名字
模型
DDL語(yǔ)句 CREATE drop alter
提交DB變量
流程,提供
建表:
1、emp:?jiǎn)T工表
id:?jiǎn)T工idnumber(5)
first_namelast_name varchar2(20)
Gender性別char(1)
birth 生日date
hiredate 入職時(shí)間date
Deptid 部門(mén)idchar(2)
2、Dept表:部門(mén)表
Id:部門(mén)idchar(2)
Name:部門(mén)名稱(chēng)varchar2(40)
插入三個(gè)部門(mén),每個(gè)部門(mén)插入若干員工
建表加復(fù)制數(shù)據(jù)
Create table table_name as select * from other_table_name;
*表示復(fù)制所有字段
Create table table_name as select id,name from other_table_name;可以
Create table table_name as select id*2,name from other_table_name;不可以(因?yàn)閛ther_table_name里面沒(méi)有“id*2”這個(gè)字段名)
表名不區(qū)分大小寫(xiě)
修改字段的類(lèi)型,(如果有記錄可能報(bào)錯(cuò))
Alter table table_name modify column_name type;
修改字段的名字
Alter table table_name rename column old_column to new_column
DML:(所有操作只有不commit,都可以通過(guò)回退,得到原來(lái)的數(shù)據(jù))
Insert into table_name(字段名) values(值);
csex CHAR(6) check(csex='男' OR csex='女'),//如果插入數(shù)據(jù)不是男或者女,會(huì)報(bào)錯(cuò)
如果插入全表的字段,table_name后面可以省略字段名;
如果是指定插入某些字段,或者值的順序和字段名的順序不一樣,則需要字段名和值一一匹配。
修改字段的值:
Update table_name set
字段名1=值1,字段名2=值2;
全表所有記錄的該字段的值都被修改了
Update table_name set 字段=值 where condition;
不帶where條件的update請(qǐng)慎重!
刪除記錄:
Delete [ from ] table_name;
全表的數(shù)據(jù)被刪除,不帶where條件的delete請(qǐng)慎重!
刪除指定數(shù)據(jù):Delete [from] table_name where condition;
Truncate:清空表數(shù)據(jù),不會(huì)對(duì)表結(jié)構(gòu)造成影響
Truncate table table_name和delete table_name
都可以把表里的數(shù)據(jù)全部清空(刪除)
1、truncate 不可以帶條件,delete可以有
2、Truncate 刪除數(shù)據(jù)不可以修復(fù),delete可以通過(guò)rollback將刪除的數(shù)據(jù)回復(fù)回來(lái)(如果commit了,則回退不了)
3、Truncate效率非常高,delete效率比較慢,如果實(shí)際中需要清空一張表,優(yōu)先選擇truncate
TCL:(transaction)
Commit:提交
Rollback:執(zhí)行DML語(yǔ)句之后,只要沒(méi)有commit;都可以回退;但是如果執(zhí)行了commit,再去rollback都無(wú)法回退。
DQL:select
Select * from table_name;
*代表所有字段都顯示,查詢(xún)tabble_name所有字段的所有記錄
Selete 字段1,字段2,...from table_name
查詢(xún)指定字段的信息
字符串函數(shù):concat ||拼接字符串
Concat(char1,char2) concat可以連用
注意轉(zhuǎn)義字符 ’
select concat(first_name,last_name) from ly_emp; //拼接
select first_name||' '||last_name name from ly_emp; //拼接,中間加空格
select first_name||'‘’'||last_name name from ly_emp; //拼接,中間加 ’
dual 測(cè)試表
Length:求字符串的長(zhǎng)度
char類(lèi)型的長(zhǎng)度是固定的,varchar2是根據(jù)字符串的長(zhǎng)度
Lower:將字符串小寫(xiě)
Upper:將字符串大寫(xiě)
Initcap:首字母大寫(xiě),其余小寫(xiě)
Trim(c1 from c2):把字符c1從字符串c2兩端去掉
Ltrm(c1 c2):把字符c2從字符串c1左邊去掉
Rtrim(c1,c2):把字符c2從字符串c1右邊去掉
Lpad(char1,n,char2):把char1填充為n個(gè)字節(jié),在左邊補(bǔ)char2
如果n小于length(char1),則會(huì)截?cái)啵疫吔財(cái)啵O伦筮?Rpad:與lpad相反
select rpad('abcd',7,'*') from dual; ---> abcd***
translate(char1,char2,char3);把字符串char1里面和char2相同的字符,變成char3
select translate('hello','le','WX') from dual; ----> hXWWo
replace(char1,char2,char3):把char1中的char2子字符串換成char3字符串,如果沒(méi)有char3,則表示去掉char2子字符串部分;
Substr(char1,n,m)從字符串char1中,從第n個(gè)開(kāi)始截取,截取m個(gè)字符
n=0(或1)表示從第一個(gè)字符開(kāi)始截取,n<0表示從末尾倒數(shù)第n個(gè)開(kāi)始,-1表示最后一個(gè)字符
Instr(char1,char2,n,m)
在char1中匹配char2,從第n個(gè)字符開(kāi)始,匹配第m個(gè),返回下標(biāo)
如果匹配不到,返回0
Ascii(char1):求字符串char1第一個(gè)字母的ASCII碼值
Number函數(shù):
Round(n,m):m>0,表示保留m位小數(shù),四舍五入
m<0,表示保留m+1位數(shù)字,四舍五入
select round(123.23,-2) from dual;------> 100
Trunc(n,m):和round是一樣,但方法不一樣,直接舍棄
Ceil(n):向上(大的)取整select ceil(-125.56) from dual; ---> -125
Floor(n):向下(小的)取整select floor(-125.56) from dual; ---> -126
Mod(n,m):取余n%m:當(dāng)m=0時(shí),直接返回0
函數(shù)可以直接作用于字段
Emp(salary number(8,2) );
Select salary*12 from number;
To_date();按格式把字符串轉(zhuǎn)換成一個(gè)日期
YYYY ---> 年; MM---> 月 ; DD ---> 日;
Mon--->英文的月份;day --->星期幾(1表示日)
HH ---> 小時(shí); HH24 ---> 24小時(shí)制;mi --->分鐘;ss ---> 秒
Add_month:select add_months(birth,3) from ly_emp;所有月份加3
Last_day():select last_day(birth) from ly_emp;返回月的最后一天
Months_between(a,b):select months_between(birth,hiredate) from ly_emp; //兩個(gè)日期相差的月份
Next_day():select next_day(sysdate,1) from dual;//下周的星期日的日期To_char():可以把時(shí)間和數(shù)字轉(zhuǎn)換成字符串
select to_char(sysdate,'yyyy-mm-dd hh34:mi:ss') from dual;將當(dāng)前時(shí)間轉(zhuǎn)化成指定格式
Trunc
Round
Select:查詢(xún)數(shù)據(jù)庫(kù)的數(shù)據(jù)
單表查詢(xún):
1、查詢(xún)所有字段所有記錄:select * from 表名
2、查詢(xún)指定字段所有記錄:select字段,... form 表名;
3、可以給字段取別名:
Select 字段 字段別名,... from 表名
4、可以用字符串、數(shù)字、日期函數(shù)對(duì)字段進(jìn)行處理
5、Select可以帶條件用where來(lái)過(guò)濾數(shù)據(jù)
1、指定字段的值 where 字段=值
2、指定字段的值在某個(gè)區(qū)間,數(shù)字的值可以通過(guò)< 和 >來(lái)匹配,
< > != 來(lái)匹配不等于某個(gè)值的數(shù)據(jù)
可以用and來(lái)連接兩個(gè)有表達(dá)式,表示兩個(gè)表達(dá)式都滿(mǎn)足的情況下的所有記錄
可以用or來(lái)連接兩個(gè)表達(dá)式,只要滿(mǎn)足其中之一的表達(dá)式則匹配
Select * from table_name where id=1;
Select*from table_name where sal <> 800(或者sal !=800)
Select * from table_name where sal>800 and sal<1800;
3、字符串
可以用= 和 != 來(lái)匹配;
模糊匹配:like
% 匹配任意多個(gè)任意字符
_ 能夠匹配任意一個(gè)字符
Select*from emp where ename like ‘A%’;把名字是以A開(kāi)頭的匹配出來(lái)
Select*from emp where ename like ‘_A%’;匹配第二個(gè)字符是A的
匹配以A開(kāi)頭或者S結(jié)尾的名字:
Select*from emp where ename like ‘A%’ or ename like ‘%s’;
4、between and
相當(dāng)于 字段 <= ** and 字段 >=**
Select * from table_name where sal>=800 and sal<=1800;
Select * from table_name where sal between 800 and 1800;
5、in 來(lái)匹配零散的值
Select * from table_name where sal in(1250,800,1300);匹配工資為這三個(gè)值的數(shù)據(jù),括號(hào)里可以有多個(gè)值
Select * from table_name where sal not in(1250,800,1300);匹配除了這三條的其他數(shù)據(jù);
In(list) 用表的記錄來(lái)list里面進(jìn)行逐一比較(=),如果相等,則匹配該條記錄;List里面如果有null,null匹配不出來(lái)
Not in(list) 用表里的記錄來(lái)list里逐一進(jìn)行比較(!=),如果全部都不相等,則匹配該記錄;表中null的記錄匹配不出來(lái)
Not in(list)所有值都不等于list里面的值才匹配,null只要list里面有null值,not in(list)將沒(méi)有一個(gè)被匹配出來(lái)。
例子:建表時(shí):給默認(rèn)值default設(shè)置默認(rèn)值
字段非空:not null表示不為空
Create emp(id number(10) not null,//不插入數(shù)據(jù),報(bào)錯(cuò)
Name varchar2(20),//不插入數(shù)據(jù),為null
Gender char(1) default ‘F’//不插入,默認(rèn)為F
);
插入數(shù)據(jù)時(shí),如果該字段沒(méi)有值,默認(rèn)為null,但是如果該字段是not null,則插入失敗,非空字段一定要有值存在
Null值在oracle中非常關(guān)鍵
Null:是一種特殊的值,空值
任何數(shù)據(jù)類(lèi)型都可以是空值
一個(gè)字段的值未確定或者沒(méi)有必要時(shí)可以為null;
Null值不可以用= 和 !=來(lái)進(jìn)行比較判斷
select * from emp where mgr is (not)null;
空值處理函數(shù)
Nvl(expr1,expr2)
如果expre1為空,則取expr2的值
如果expr1不為空,則取它自身的值
select empno,ename,(nvl(comm,0)+sal)*12 from emp;
Nvl2(expr1,expr2,expr3)
如果expr1為空,則取expr2的值
如果不為空,則取expr3的值
select empno,ename,(nvl(comm,comm,0)+sal)*12 from emp;
給字段取別名會(huì)自動(dòng)變成大寫(xiě)的,如果想保持原狀,可以用雙引號(hào)“”;
如果別名需要空格,也可以用雙引號(hào)“”
可以給字段取別名,用as關(guān)鍵字,但as可以省略
select empno,ename,(nvl(comm,0)+sal)*12 “salary” from emp;
查找所有的部門(mén)emp:
去重:去除重復(fù)的沒(méi)必要的數(shù)據(jù) distinct
Distinct可以對(duì)單個(gè)字段去重,也可以對(duì)多個(gè)字段一起進(jìn)行去重
select distinct deptno,job from emp; //查找每個(gè)部門(mén)都有哪些崗位
排序:
Order by 字段asc/desc 升序/降序
默認(rèn)是按升序排序,所以asc可以省略
//查找所有的員工,按部門(mén)升序顯示所有的員工的薪資從多到少
select * from emp order by deptno asc , sal desc;
對(duì)多個(gè)字段進(jìn)行排序時(shí),先按前面的字段進(jìn)行排序(分組),然后再按后面的字段進(jìn)行排序,注意:每一個(gè)字段都要指定排序方式(asc/desc,asc可以省略(默認(rèn)值));order by和distinct只出現(xiàn)一次。
Null最大,asc排序,null排在最后面
日期:
要對(duì)日期進(jìn)行判斷
select sysdate +1 from dual;系統(tǒng)時(shí)間加n天
select trunc(sysdate,'dd')-to_date('2017-01-01','yyyy-mm-dd') from dual;截取系統(tǒng)時(shí)間到天,距離2017-1-1日的天數(shù);
日期可以直接加減運(yùn)算,也可以用<,>,<=,>=,=,!=來(lái)判斷兩個(gè)日期
To_char() 整數(shù)按格式轉(zhuǎn)換為字符串
格式字符串里以fm開(kāi)頭
9 代表任意一個(gè)數(shù)字
0 強(qiáng)制顯示前導(dǎo)0,如果該位置有數(shù)字,則顯示數(shù)字,數(shù)字不足則顯示0
. 代表小數(shù)點(diǎn)
$ 代表美元符號(hào)
L 代表本地貨幣符號(hào)
select to_char(123.34,'fm09999.99') from dual; ==》00123.34
select to_char(123.34,'fm99.99') from dual; ==》######
select to_char(123.456,'fmL999.999') from dual; ==》¥123.456
select to_char(123456.456,'fm$999,999.999') from dual; ==》$123,456.456
聚合函數(shù):
對(duì)數(shù)據(jù)進(jìn)行分組,然后進(jìn)行統(tǒng)計(jì)工作
一個(gè)組返回一條記錄
分組函數(shù),集合函數(shù)
Max:select max(sal) from emp;//找到sal最高的員工
Min:select min(sal) from emp;
select max(sal) max_sal,min(sal) min_sal from emp;//找到并重命名
可以用于number,char,date類(lèi)型
過(guò)濾掉記錄里的null值
Avg sum 平均值 和值
1、求所有員工的平均工資select avg(sal) avg_sal from emp;
2、求公司一個(gè)月要發(fā)放的工資select sum(sal+nvl(comm,0)) from emp;
Avg sum只能用于number,自動(dòng)過(guò)濾掉null
3、平均獎(jiǎng)金 select avg(nvl(comm,0)) from emp;
Select avg(comm) from emp;求有獎(jiǎng)金員工的每個(gè)人的平均獎(jiǎng)金
Count求記錄的數(shù)目
Select count(*) from emp;//emp里面有多少個(gè)員工
Select count(1) from emp;//計(jì)數(shù)所有的記錄,可以隨便填
Select count(ename) from emp;//emp里面有多少個(gè)名字
Count可以對(duì)任意內(nèi)容進(jìn)行統(tǒng)計(jì),會(huì)自動(dòng)過(guò)濾掉null值
1、每個(gè)部門(mén)里工資最大、最小
select deptno,max(sal),min(sal) from emp group by deptno;
2、統(tǒng)計(jì)每個(gè)部門(mén)的平均工資和工資總和
select deptno,avg(sal),sum(sal) from emp group by deptno;
3、每個(gè)部門(mén)有多少員工
select deptno,count(1) from emp group by deptno;
分組:
Group by 字段
組函數(shù)自動(dòng)過(guò)濾null記錄
1、查找部門(mén)編號(hào)大于10的部門(mén)的員工平均工資
Select avg(sal) from emp where deptno>10;
2、查找部門(mén)編號(hào)大于10的部門(mén)平均工資:先過(guò)濾數(shù)據(jù)然后再組函數(shù)
Select avg(sal) from emp where deptno>10 group by deptno;
3、查找部門(mén)平均工資大于1600的部門(mén)編號(hào)及其平均工資:先用組函數(shù)求值(分組),然后再過(guò)濾數(shù)據(jù)
Select deptno,avg(sal) from emp group by deptno having avg(sal)>1600;
Having:用來(lái)過(guò)濾分組數(shù)據(jù),只能用在group by之后;
SQL語(yǔ)句的執(zhí)行順序:
1、from語(yǔ)句:從右往左,從后往前執(zhí)行,建議把數(shù)據(jù)量少的放后面,數(shù)據(jù)大的表放前面;
2、Where語(yǔ)句:從右往左,從下往上執(zhí)行;建議把過(guò)濾數(shù)據(jù)量多的語(yǔ)句放后面;
3、Group by語(yǔ)句:非常消耗資源,建議少用;建議在where的時(shí)候盡量過(guò)濾多的數(shù)據(jù);
4、Having語(yǔ)句:從左往右
5、Select語(yǔ)句:oracle在解析*的時(shí)候,會(huì)先根據(jù)表名去查找這個(gè)表的字段(解析字段),需要消耗時(shí)間,所以盡量避免使用*,而是用具體的字段替代;
6、Order by語(yǔ)句:從左往右,非常耗資源。
多表查詢(xún):
1、顯示員工編號(hào)、員工姓名、員工所在部門(mén)編號(hào)及部門(mén)名稱(chēng)
關(guān)聯(lián)查詢(xún)
select * from emp;//14條數(shù)據(jù)
Select * from dept;//4條語(yǔ)句
Select * from emp,dept;//56條數(shù)據(jù)
笛卡爾積:兩個(gè)表數(shù)據(jù)的記錄相乘得到的就是笛卡爾積
等值連接
Select empno,ename,emp.deptno,dname from emp,dept
where emp.deptno=dept.deptno
多表查詢(xún):
多個(gè)表之間用逗號(hào)隔開(kāi);如果兩個(gè)表有同名的字段,需要顯示同名的字段時(shí),需要表名.字段名來(lái)區(qū)別,對(duì)于表,也可以有別名
Select e.empno,e.ename,d.deptno,d.dname
From emp e,dmpt d
Where e.deptno=d.deptno;
內(nèi)連接:把等值連接中表名之間‘,’換成join,再把where換成on;
Select e.empno,e.ename,d.deptno,d.dname
From emp e join dept d
On e.deptno=d.deptno
外連接:
左外連接:left join左邊表里的數(shù)據(jù)一條都不會(huì)少(全部匹配),左邊表也稱(chēng)為驅(qū)動(dòng)表,然后根據(jù)條件去右邊的表匹配,匹配不上的記錄,該表的字段自動(dòng)填充為null值。
Select e.empno,e.ename,d.deptno,d.dname
From emp e left join dept d
On e.deptno=d.deptno;
也可以寫(xiě)成:Select e.empno,e.ename,d.deptno,d.dname
From emp e ,dept d
Where e.deptno=d.deptno(+);
//(+) 一定寫(xiě)在驅(qū)動(dòng)表的對(duì)面
右外連接:
Select d.deptno,d.dname,e.empno,e.ename
From emp e right join dept d
On e.deptno=d.deptno;
也可以寫(xiě)成:Select d.deptno,d.dname,e.empno,e.ename
From emp e , dept d
Where e.deptno(+)=d.deptno;
全外連接:
Select d.deptno,d.dname,e.empno,e.ename
From emp e full join dept d
On e.deptno=d.deptno;
自連接:對(duì)同一張表用別名的方式擴(kuò)展為兩張表,然后再進(jìn)行關(guān)聯(lián)匹配
select distinct e1.empno,e1.ename
from emp e1 , emp e2
where e1.empno=e2.mgr;
記住:外連接有個(gè)關(guān)鍵字outer;left outer join
Sql高級(jí)查詢(xún):
條件、表可能是從一個(gè)select語(yǔ)句中獲得
Select語(yǔ)句作為where的子句:
可能where依賴(lài)的條件不是一個(gè)確定的值,也不是通過(guò)函數(shù)求得;依賴(lài)于一條select的返回值
select語(yǔ)句中嵌套一個(gè)select語(yǔ)句,這個(gè)嵌入的select語(yǔ)句稱(chēng)為select子句
Select 子句先執(zhí)行,得到結(jié)果之后,再進(jìn)行父select比較
根據(jù)select語(yǔ)句的返回值,可以分為:
單行select子句(= in < > != ...)
多行select子句(ANY ALL in not in)
多列select子句(in)
Select語(yǔ)句:返回一行數(shù)據(jù),多行數(shù)據(jù),多列數(shù)據(jù)
返回多條語(yǔ)句:
ANY,ALL函數(shù),不能單獨(dú)使用,只能和< > <= >= 一起使用
<ANY( list ) 小于其中一個(gè)
<ALL( list ) 小于所有的
Exists:(用的很多)用在where條件中,對(duì)于exists里面如果有返回記錄,則表示條件為true,否則返回false
Select語(yǔ)句作為from的子句:
From的目標(biāo)是一個(gè)表,當(dāng)用select語(yǔ)句作為from的目標(biāo)時(shí),select子句稱(chēng)之為行內(nèi)視圖,或者匿名視圖
Rownum:
用來(lái)標(biāo)識(shí)表里數(shù)據(jù),用數(shù)字對(duì)所有的記錄進(jìn)行編號(hào),編號(hào)從1開(kāi)始,全部連續(xù),也稱(chēng)之為偽列;
用了之后,會(huì)出現(xiàn)一條標(biāo)記行號(hào)的一列,但是訪問(wèn)只能從1開(kāi)始,不能從中間開(kāi)始或直接訪問(wèn)后面的;
可以把一個(gè)select出來(lái)的rownum當(dāng)做一個(gè)行內(nèi)視圖,把rownum取一個(gè)別名,這時(shí)候偽列就變成真的字段
Oracle的分頁(yè)記錄:rownum
Decode(expr[,expr1,result1[,expr2,result2]][,default])
集合操作:對(duì)分表時(shí)非常重要
Union結(jié)果是并集:a+b-重復(fù)的
union all結(jié)果是a+b,
Intersect并集
Minus a-重復(fù)的(不會(huì)為負(fù)的)
對(duì)多個(gè)select語(yǔ)句的結(jié)果進(jìn)行集合操作
每一個(gè)select語(yǔ)句的字段個(gè)數(shù)、順序和類(lèi)型必須相同
Rownum
分組函數(shù):
Row_number() over(PARTiTION BY col1 ORDER BY col2【,col3 desc】)
返回一個(gè)和rownum相識(shí)的東西(編號(hào))
對(duì)coll字段進(jìn)行分組,然后再對(duì)col2進(jìn)行排序
編號(hào)從1開(kāi)始,連續(xù)且不重復(fù),也不能直接截取
Rank()
Rank( ) over(PARTiTION BY col1 ORDER BY col2【,col3 desc】)
對(duì)coll字段進(jìn)行分組,然后再對(duì)col2進(jìn)行排序,編號(hào)從1開(kāi)始,如果排序值相同,然后會(huì)跳躍,如果兩個(gè)并列第二,后面從第4開(kāi)始
Dense_rank()
Dense_rank() over(PARTiTION BY col1 ORDER BY col2【,col3 desc】)
對(duì)coll字段進(jìn)行分組,然后再對(duì)col2進(jìn)行排序,編號(hào)從1開(kāi)始,如果排序值相同,則編號(hào)相同,不會(huì)跳躍,如果兩個(gè)并列第二,后面從第3開(kāi)始
高級(jí)分組:
按年統(tǒng)計(jì)銷(xiāo)售額
按月統(tǒng)計(jì)銷(xiāo)售額
Group by rollup(a,b,c)
按a,b,c
A,b
A
Group by cube(a,b,c)
Group by grouping sets((a),(b)...)
小括號(hào)里填分組的字段
指定需要的分組,顯示數(shù)據(jù)
約束
條件約束
為了維護(hù)數(shù)據(jù)的完整性及邏輯性
用約束來(lái)限制(DML insert update delete)表里的數(shù)據(jù)
非空約束(NOT NULL) 簡(jiǎn)寫(xiě) NN
唯一約束(UNIQUE) 簡(jiǎn)寫(xiě)UK
主鍵約束(PRIMARY KEY) 簡(jiǎn)寫(xiě) PK
外鍵約束(FREIGN KEY)簡(jiǎn)寫(xiě) FK
檢查約束(CHECK) 簡(jiǎn)寫(xiě) CK
默認(rèn)值(default) 這不是約束
約束可以在建表時(shí)指定,也可以在建表之后添加
所有的約束都在 user_constraints表中
1、非空約束
Insert時(shí),如果有字段為not null,那么一定得插入該字段的值,否則會(huì)報(bào)錯(cuò);update時(shí),無(wú)法將該字段更新為null。
什么時(shí)候用:為了確保該字段一定有值
在建表之后添加非空約束
Alter table wly_stu add constraints constraints_name check(id is not null); 其中id是一個(gè)字段
刪除約束
Alter table wly_stu drop constraint constraints_name
改變非空屬性
Alter table wly_stu modify (id number(7) not null) 添加非空約束
Alter table wly_stu modify (id number(7) null) 刪除非空約束
如果是匿名約束,需要先去user_constraints表中找到相應(yīng)的約束,以及默認(rèn)的約束名,然后再把它刪除
2、唯一約束:
值唯一,不能重復(fù)
建表時(shí)建唯一約束
create table wly_stu(
id number(10) ,
name varchar2(30) not null,
gener char(1)
constraint id_constraint_uk unique(id)//id字段有唯一約束,不能插入兩個(gè)相同的值
(null值例外,可以有多個(gè)id為null的行)
);
建表之后添加唯一約束
Alter table wj_stu add constraint constraint_name unique(coll);
唯一約束可以是一個(gè)字段也可以是多個(gè)字段,多個(gè)字段時(shí)表示只要有一個(gè)字段不相同即為不相同
Alter table wj_stu add constraint constraint_name unique(id,name);
Insert into wj_stu values(110,’’xiaohong’);
Insert into wj_stu values(110,’xiaohei’);這兩條都可以插入,如果完全相同,則不能插入
3、主鍵約束:
必須非空,且值唯一
一個(gè)表里,主鍵約束只能有一個(gè)
一個(gè)表里,約束只能
主鍵約束可以提升select效率很好,(數(shù)據(jù)量多,根據(jù)主鍵查詢(xún)時(shí))
主鍵約束也可以是對(duì)組合字段,但不建議
主鍵約束建在什么地方,什么字段建主鍵?
1、主鍵字段不要有具體的邏輯業(yè)務(wù)
2、主鍵約束不要經(jīng)常DML操作
3、主鍵值應(yīng)該自然有序,用序列生成最好
4、主鍵相當(dāng)于索引
4、外鍵約束:
多張表之間的關(guān)系,一張表的字段的值依賴(lài)于另一張表的字段的值
被依賴(lài)的表叫做:主表
依賴(lài)其他的表叫做:從表
在建表時(shí)建外鍵約束,得先建主表,再建從表(建外鍵約束)
Alter table wj_dept add constraint constraint_name primary key(deptno)
Alter tbale wj_emp add constraint constraint_name foreign key(deptno)
references wj_dept(q_dept);
Create table ly_dept( //主表
Deptno number(2) primary key, //主鍵
Dname varchar2(30) not null,
Loc varchar2(30)
);
Create table ly_emp( //從表
Empno number(2) primary key,
Ename varchar(30) not null,
Deptno number(2),
Constraint constraint_name foreign key(deptno) references ly_dept(deptno)
//依賴(lài)于主鍵關(guān)系,外鍵約束
);
外鍵約束:主表列是主鍵,從表添加不需要add關(guān)鍵字
外鍵約束對(duì)性能非常損耗,在從表插入數(shù)據(jù)時(shí),要去主表里查詢(xún)是否有對(duì)應(yīng)的值,不建議使用,
除非特殊情況
可以不用外鍵約束來(lái)限制數(shù)據(jù)的完整性,這部分功能可以在代碼里實(shí)現(xiàn)
索引、視圖
從表里外鍵約束的值可以插入null值,除了空值以外的值,只能是主表里對(duì)應(yīng)的值(主表里有的值)
從表里引用了主表里的值,則主表里的值不允許刪除或者修改
Insert into ly_emp(empno,ename,deptno) values(120,’long’,20);
Delete ly_dept where deptno=20;//錯(cuò)誤的,在從表里引用了
增加外鍵:
Alter table tbale_name add constraint constraint_name foreign key(col) references
other_table_name(other_col)
create table parent (c1 number(2) primary key);
child表的c2列為外鍵,引自parent表的c1列
方法一:create table child
(c1 number(4) constraint child_c1_pk primary key,
c2 number(2) constraint child_c2_fk references parent(c1));
方法二:create table child
(c1 number(4) constraint child_c1_pk primary key,
c2 number(2) ,constraint child_c2_fk foreign key(c2) references parent(c1));
5、檢查約束:
對(duì)數(shù)據(jù)進(jìn)行檢查,只有滿(mǎn)足條件的情況下才允許插入和修改
Check(條件)
Check(gender in(‘男’,’女’))//插入數(shù)據(jù)時(shí)只能是男或者女,否則報(bào)錯(cuò)
Alter table wj_emp add constraint constraint_name check(id>1000 and
name like ‘%A%’);
Insert into wj_emp values(110,’wng’,20);//報(bào)錯(cuò)
Insert into wj_emp values(1110,’wang’,20);//不會(huì)報(bào)錯(cuò)
非空約束 not null
唯一約束 unique 可以往里插入多個(gè)null值
主鍵約束 不可以為空
外鍵約束 可以插入空值
檢查約束 只要不檢查是否為空,那就可以插入null值
可以在建表時(shí)建立約束,也可以在建表之后添加、刪除
Alter table table_name add constraint constraint_name ***
Unique(col)
Primary key(col)
Foreign key(col) references table_name(col)
Check(condition)
User_constraints 保存著用戶(hù)下所有的約束名(如果創(chuàng)建時(shí)沒(méi)有指定約束名,系統(tǒng)會(huì)
自動(dòng)生成一個(gè)約束名)
視圖:把一個(gè)select語(yǔ)句的結(jié)果集當(dāng)做一個(gè)表一樣使用,虛擬的表,是數(shù)據(jù)的邏輯表示,其本質(zhì)
是一個(gè)select語(yǔ)句加了一個(gè)名字
創(chuàng)建一個(gè)視圖
Create [or replace] view view_name as subquery;
Subquery:一個(gè)select語(yǔ)句
試圖分為:
1、簡(jiǎn)單視圖:select 語(yǔ)句包含一張表,但是沒(méi)有有函數(shù)、表達(dá)式、group by的約束
2、復(fù)雜視圖:select 語(yǔ)句包含一張表,但是有函數(shù)、表達(dá)式、group by的條件
3、連接視圖:select 多張表
Create view emp_view_20 as select empno,ename,deptno,sal from emp
創(chuàng)建視圖需要權(quán)限:grant create view to 用戶(hù)(student);
所有的視圖名都保存在User_views里
視圖是一個(gè)select語(yǔ)句的結(jié)果集,他沒(méi)有具體的數(shù)據(jù),而是一種映射關(guān)系。當(dāng)視圖建立以后,可以
把試圖當(dāng)做一張表一樣使用(select)
視圖作用:
1、對(duì)于復(fù)雜的select語(yǔ)句,建立視圖之后,可以提升查詢(xún)效率
2、通過(guò)視圖只能查詢(xún)特定的記錄和字段,能夠隱藏和保護(hù)一些數(shù)據(jù)及字段,保護(hù)數(shù)據(jù)和屏蔽
數(shù)據(jù)的作用(安全措施)
3、操作視圖就等于操作視圖映射的表。(不建議通過(guò)視圖修改表里的數(shù)據(jù)),可以在創(chuàng)建視圖時(shí)
指定視圖只能查詢(xún),不能修改數(shù)據(jù)
在創(chuàng)建視圖的語(yǔ)句后面加With read only;
對(duì)于復(fù)雜的視圖,根本就不允許插入和刪除。
Create view emp_view_20 as select empno,ename,deptno,sal from emp where
deptno = 20;
當(dāng)插入部門(mén)不是20的數(shù)據(jù)時(shí),視圖不會(huì)有變化,但是映射所對(duì)應(yīng)的表會(huì)多一行數(shù)據(jù);當(dāng)修改一個(gè)
deptno為20的數(shù)據(jù)變成不是20時(shí),視圖里會(huì)消失。
可以通過(guò)限定用戶(hù)智能操作視圖里有的數(shù)據(jù):
with check option—— DML只能操作視圖里有的數(shù)據(jù)(只對(duì)視圖可見(jiàn))
Delete時(shí)只能刪除視圖里有的數(shù)據(jù)
Insert時(shí)只能插入滿(mǎn)足select條件的數(shù)據(jù)
Create or replace view 可以創(chuàng)建和修改視圖
Drop view view_name 刪除視圖
在用函數(shù)和表達(dá)式進(jìn)行創(chuàng)建視圖時(shí),必須用別名
Create view emp_view_20 as select empno,lower(ename) name,deptno,sal from emp
序列:(sequence)可以自動(dòng)生成數(shù)字值的數(shù)據(jù)庫(kù)對(duì)象
CREATE sequence seq_name [ start with i ] [ increment by i ] [ minvalue
n|no minvalue] [maxvalue m|no maxvalue] [cycle | nocycle] [ cache p | on cache];
Start with i表明從i開(kāi)始計(jì)數(shù)
Increment by j 表明每次遞增多少(j是負(fù)數(shù),遞減)
如果沒(méi)有指定i和j,從1開(kāi)始遞增,每次遞增1
Cycle:表明值取到了最大值之后,可以從最小值開(kāi)始重新開(kāi)始計(jì)數(shù)
如果是取到了最小值,可以從最大值重新開(kāi)始計(jì)數(shù)
Cache p:表示每次生成多少個(gè)數(shù)字,緩存的值的個(gè)數(shù),默認(rèn)是20
序列可以有效的用來(lái)生成主鍵的值
多個(gè)表可以共用一個(gè)序列,但是建議一個(gè)表用一個(gè)序列
user_sequences所有的序列都存儲(chǔ)在這個(gè)表里
Nextval:獲取序列的下一個(gè)值,每執(zhí)行一次nextval會(huì)增長(zhǎng)一次,在序列剛創(chuàng)建時(shí),
必須使用一次nextval才能使用currval
Currval:獲取序列的當(dāng)前值
Create sequence seqly_emp2
Start witn 1000 increment by 1
Minvalue 1 maxvalue 1000000000 nocycle cache 2000
create table wly_emp_test(
id number(10) primary key,
name varchar2(30)
);
select seqly_emp2.nextval from dual;
insert into wly_emp_test(id) values(seqly_emp2.nextval);
select * from wly_emp_test;
序列可以高效的用來(lái)生成主鍵的值
刪除:drop sequence seq_name;
索引:
Rowid是一個(gè)偽列,用于標(biāo)識(shí)數(shù)據(jù)表里每一條記錄的地址
Pl sql developer里面:select e.*,e.rowid from emp e;可以在表中直接修改
索引是保存記錄的地址及索引關(guān)鍵字,用于提升查詢(xún)效率最有效的方法
字典:通過(guò)目錄去查找
視圖:把內(nèi)容大的拆分成每一塊內(nèi)容較小的,再去查找
Create index [unique] index_name on table_name(col);
注意事項(xiàng):
1、數(shù)據(jù)量小的時(shí)候應(yīng)該避免建索引
2、一般給where條件,group by 這些經(jīng)常用來(lái)查詢(xún)的字段建索引
3、索引的個(gè)數(shù)沒(méi)有限制,但不是越多越好
4、索引對(duì)于查詢(xún)的效率有很好的提高,但是得建立合適的索引
5、索引也是占用資源的(需要保存值和地址)
6、二叉樹(shù) oracle實(shí)現(xiàn)索引是用二叉樹(shù):B-tree
7、對(duì)于經(jīng)常DML操作的列,應(yīng)當(dāng)根據(jù)情況避免建索引,因?yàn)樗饕龝?huì)影響insert操作的執(zhí)行效率
刪索引 --> 導(dǎo)數(shù)據(jù) --> 再建索引 會(huì)比直接導(dǎo)數(shù)據(jù)的效率要高
Create index deptno_index on dept(deptno);
User_objects;---索引、視圖、序列均可在這個(gè)表里查到
索引一旦建立之后,oracle自動(dòng)維護(hù),查詢(xún)時(shí)不需要指定使用哪個(gè)索引
Select * from emp where empno =** ---empno
Select * from emp where ename =** ---ename
如果某個(gè)字段的值是唯一的,可以建唯一索引
Create unque index empno_index on(empno);
如果索引字段的值經(jīng)常DML,可以用Alter index index_name rebuild;
更新索引,將刪除的數(shù)據(jù)的索引刪掉,提高內(nèi)存效率
索引:建在那個(gè)字段,經(jīng)常用來(lái)查詢(xún)數(shù)據(jù)的字段,這個(gè)字段可以是組合字段,group by deptno,mgr
-------> On(deptno,mgr);
在生產(chǎn)中,索引用的非常多
索引:用空間換時(shí)間,消耗內(nèi)存空間提升效率
網(wǎng)站名稱(chēng):數(shù)據(jù)庫(kù)——oracle
網(wǎng)頁(yè)路徑:http://chinadenli.net/article44/jigihe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、虛擬主機(jī)、靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)