Oracle數據庫:存放數據的倉庫
1)保存數據
– file是輕量級保存數據。
– 數據庫是重量級保存數據需要安裝軟件。
2)管理數據
有效增刪改查(CRUD),使用SQL語句來操作。
3)在項目開發中,運行在項目的後臺。
項目分前臺和後臺。前臺做界面。
如:前臺註冊界面
後臺保存數據—保存到數據庫中
數據庫分爲
**大型數據庫:**oracle,db2 銀行系統(數據量大,安全性高,需要付費)
**中型數據庫:**sql server,mysql 網站開發(數據量大,安全性相對不高,免費的)
小型數據庫: access,sqlite(數據量小,安全性低,免費的)
Oracle是一門數據庫,
數據庫:存放數據,有效的管理數據CRUD。 重量級保存數據的方式,需要安裝軟件。
總結一下簡單的CRUD的操作
sql命令分類:
數據操作語言:DML
select,insert,update,delete
數據定義語言:DDL
create,alter,drop,rename,truncate
事務控制語句
commit,rollback,savepoint
數據控制語言:DCL
grant(授權),revoke(回收權限)
數據庫中的對象:
表:數據庫最基本的結構
視圖:一張虛表,從一張表或多張表查詢的數據組成的一張虛表。
序列:主要用來生成主鍵的值
索引:主要用來提供檢索的效率
同義詞:爲對象取別名
存儲單元:PL/SQL,將一條或者多條SQL語句通過一些語句(判斷,循環)連接起來。
基本指令:
1)使用sys用戶登錄到數據庫
sqlplus "/as sysdba"
2)使用system用戶登錄到數據庫
sqlplus
用戶名:system
口令:安裝oracle數據庫時的口令
使用briup用戶登錄到數據庫
**3)**sqlplus briup/briup
show user
安裝oracle後,默認提供兩個管理員的用戶sys,system
sys:相當於總裁
system:相當於總經理
briup:普通用戶
4)切換到其他用戶下
conn 用戶名/密碼
//創建用戶:用戶名爲briup,密碼爲briup
create user briup identified by briup;
//授權命令
grant connect,resource to briup;
//切換用戶
conn briup/briup
//修改日期的語言格式
alter session set nls_date_language=english;
//執行腳本文件
start D:/oracle.sql
oracle.sql的路徑:D:/oracle.sql
//查詢當前用戶下所有的表
select table_name from user_tables;
重點部分,SQL語句
sql執行流程:sql引擎解析sql語句
select———-5
from————1 //from後起的別名是可以作用到其他所有語句上的
where———–2
group by——–3
having———-4
order by——–6
查詢表select
1、格式:select [distinct] {*|字段名1,字段名2..}
from 表名
[where 字段名=? and …]
項目中不建議寫*,效率低
1)先查詢表中所有的字段名
2)再根據字段名去查詢數據
2、 可以使用算術符 + - * /
a)針對數字類型number(+-*/)
例如:查年薪
select salary*12
from s_emp;
b)針對日期類型date(+-)
select start_date,start_date+1
from s_emp;
3、取別名
a)在需要取別名的字段後空格,然後加上別名
select last_name,(salary+100)*12 sal
from s_emp;
b)使用as關鍵字
select last_name,(salary+100)*12 as Sal
from s_emp;
c)使用”“,可以區分大小寫和特殊字符
select last_name,(salary+100)*12 "Sal"
from s_emp;
select last_name,(salary+100)*12 "年薪"
from s_emp;
4、數據庫處理空值
nvl(可能出現空值的字段,默認值)
如果可能出現空值的字段爲空,nvl函數處理的結果爲默認值。
如果可能出現空值的字段不爲空, nvl函數處理的結果爲本身的值。
5、字段拼接:||
查詢last_name,first_name取別名name
```
select last_name||','||first_name name
from s_emp;
```
注意:字符串使用單引號
**6、**sql*plus工具中編輯命令
**a)**list/l : 顯示buffer中sql命令
b)/ : 執行buffer中的sql命令
c)替換內容:c
先定位:1
後替換:c/oldStr/newStr
如: c/names/name
select last_name
from s_emp;
d)追加內容:a
先定位:1
後追加:a ,salary
執行:/
select last_name,salary
from s_emp
where dept_id=42;
e)插入一行:i / input
先定位:2
後插入:i where dept_id=42
執行:/
f)刪除一行:del
先定位:3
後刪除:del
g)重寫一行
select last_name,salary
from s_emp;
重寫的行號 重寫的內容
如:1 select first_name,dept_id
執行:/
**h)**sql*plus在文件的命令
save filename:把buffer中命令保存到文件中
如:save D:/test.sql
get filename:把文件中命令顯示在工具上
如:get D:/test.sql
@ filename/start filename:執行腳本文件
如:start D:/test.sql
@ D:/test.sql
edit filename:將文件以編輯的方式打開
如:edit D:/test.sql
spool filename:將工具中所有內容都寫入到文件中
如: spool D:/test1.sql
select last_name from s_emp;
show user
select * from s_dept;
spool off;
注意:spool必須和spool off一起使用。
exit:退出
I)設置字段的顯示格式:col
select last_name,first_name,salary,start_date
from s_emp;
col last_name format a15;
col first_name format a15;
fomat 可以用 for 來代替
注意:format不能通過a來設置數字類型
col salary format a10;
select salary from s_emp;
清除salary顯示格式:
col salary clear;
排序order by
a)升序排序ASC,降序排序DESC
b)order by放在select語句最後的位置
c)order by後面跟需要排序的字段名再加排序規則
1)如果沒有指定排序規則則按照默認排序(升序)
2)需要排序的字段,字段可以寫字段名也可以寫別名也可以寫select後的序列號
如: select last_name,salary
from s_emp
order by 2 ASC;
d)字符串的比較規則是第一個字母比 相同則比第二個 以此類推 比較的是ASCII碼
e)多個字段同時排序 用,隔開 先按照第一個字段排序 在第一個字段的值相同
則把相同數據按照第二個字段排序 以此類推
f)對於空值的排序規則:
空值被看成---無窮大
1.查詢所有員工的last_name和工資,並對工資進行升序排列
select last_name,salary
from s_emp
order by salary ASC;
2.查詢所有員工的last_name和工資,並對last_name進行升序排列
select last_name,salary
from s_emp
order by 1 ASC;
3.查詢所有員工的last_name和工資,先按照salary進行降序排序,再按照last_name
進行升序排序
select last_name,salary
from s_emp
order by 2 DESC,1 ASC;
4.查詢所有員工的last_name和提成,並對提成進行升序排序
select last_name,commission_pct
from s_emp
order by 2 ASC;
限定性的查詢where
a)將數據進行過濾篩選
b)where放在select語句的from後面
c)where後跟表達式
字段名 比較符 常量值
d)比較符
邏輯比較符= < > 不等於: != <> ^=
SQL比較符
between..and.. :在小數和大數之間
in(list) :在集合中 in(1,54,66,4,2)
like :模糊匹配,包含某個東西
is null :是空的
邏輯操作符
and
or
not
select name
from s_dept;
where
1.查看41號部門員工的信息
select last_name,salary,dept_id
from s_emp
where dept_id=41;
2.查詢Ngao這個員工的信息
select last_name,salary,dept_id
from s_emp
where last_name='Ngao';
注意 : sql命令不區分大小寫 字符串是區分大小寫的
3.查詢工資在1000到1500之間的員工信息
4.查詢41號或者42號部門員工信息
5.查詢提成爲空的員工信息
6.查詢last_name包含N員工的信息
通配符: %:匹配0或者多個字符
_:匹配單個字符
select last_name,salary
from s_emp
where last_name like '%N%';
7.查詢出所有不分大小寫的N
upper()將括號內容變爲大寫
lower()將括號內容變爲小寫
select last_name,salary
from s_emp
where upper(last_name) like '%N%';
select last_name,salary
from s_emp
where lower(last_name) like '%n%';
8.查詢last_name第二個字符爲a的員工的信息
select last_name,salary
from s_emp
where last_name like '_a%';
9.查詢last_name以_開頭的員工信息
先插入一列進行測試
insert into s_emp(id,last_name)
values(999,'_briup');
commit;
escape '任意字符' :組合成了一個轉義字符 自定義轉義字符
select last_name
from s_emp
where last_name like '/_%' escape '/';
函數
單值函數: 不會影響數據的個數 如果有n條數據處理之後還是n條數據
多值函數(組函數): 會影響數據的個數 如果有n條數據處理之後可能是1條數據
1.在字符串上的單值函數
LOWER/lower:將字符串轉換成小寫
UPPER/upper:將字符串轉換成大寫
INITCAP/initcap:將字符串轉換成首字母大寫,其他字母小寫
CONCAT/concat:將兩個字符串拼接成一個字符串
SUBSTR/substr:求子串
LENGTH/length:求字符串的長度
NVL/nvl:處理空值的函數
dual:一張啞表
1)用來滿足select語句的格式
2)用來測試函數
select concat('hello','world')
from dual;
//第一個是母串
//第二個是子串的起始位置
//第三個是子串的長度
select substr('hell world',3,7)
from dual;
練習:查詢員工全名,使用,隔開
全名以大寫方式顯示,並且要求first_name的長度爲6,
按照全名進行降序排序
select upper(concat(last_name,first_name)) as name
from s_emp
where length(first_name)=6
order by name DESC;
2.在數值上的單值函數
ROUND/round:四捨五入
TRUNC/trunc:只舍不取
MOD/mod:取餘
select round(45.89) from dual; //46
select round(45.89,1) from dual; //45.9
select round(45.89,2) from dual; //45.89
select round(45.89,-1) from dual; //50
select round(45.89,-2) from dual; //0
select round(55.89,-2) from dual; //100
3.在日期上的單值函數,注意:在進行日期函數之前 需要轉換語言alter session set nls_date_language=english;
select sysdate from dual;
日期的默認格式: DD-MON-YY
MONTHS_BETWEEN/months_between:兩個日期之間相差的月數
ADD_MONTHS/add_months:在一個日期上加上月數之後的日期
NEXT_DAY/next_day:即將來臨的星期幾是多少號
select next_day(sysdate,6) from dual;
注意:以爲Oracle是國外推出的,所以日期中 一週的第六天 是星期五
LAST_DAY/last_day:一個日期所在這個月的最後一天的日期
ROUND:四捨五入
根據month進行 應該看day
根據year進行 應該看month
TRUNC:只舍不取
根據month進行 應該看day
根據year進行 應該看month
select round(to_date('15-JUN-17'),'month')
from dual;
15日舍 16入 6月舍 7月入
4.轉換函數
to_char:將數字或者日期轉換成字符串
1)將數字類型轉換爲字符串類型(錢)
to_char(number,'格式')
$:西方人顯示貨幣的符號
L:顯示本地貨幣符號
,:進行分割
.:小數點
9:不滿位數時不強制補齊
0:不滿位數時強制補齊
fm:清除前面的空格或者0(某些時候清除0)
注意:定義字符串的長度大於或等於數值的長度 否則會顯示#
select to_char(salary,'$99,999.00')
from s_emp;
2)將日期類型轉換成字符串類型
select to_char(sysdate,'YYYY MM D DD DDD YEAR MONTH MON DAY DY ddsp ddspth')
from dual;
select to_char(system,'YYYY-MM-DD HH24-MI-SS AM')
from dual;
日期格式模型的元素
year: 英文年份(例如:two thousand seven(2007年))
month: 英文月份(例如:march(3月))
mon:英文月份的縮寫(例如:mar)
DAY: 星期幾的英文單詞(例如:monday(星期一))
DY: 星期幾的前三個字母(例如:mon)
ddsp:英文拼寫的天(例如:five(5號))
ddspth:英文拼寫的第幾天(例如:fifth(第五天))
d: 一個星期的數字表示,星期天爲1,星期六爲7
dd: 一個月的第幾天
ddd: 一年的第幾天
yyyy:四位數的年
mm:二位數的月
hh24:24小時制
mi:分鐘
ss:秒
AM:上午
PM:下午
to_number:將字符串類型轉換成數字類型
to_date:將字符串類型轉換成日期類型
多表查詢
多表查詢:第一件事將多張表連接成一張表
連接:每張表的每條數據都要連接另一張表的每條數據
實質:是一張表的查詢
多張表連接成一張表時會產生笛卡爾積
如何消除笛卡爾積:
如果有n張表的連接,至少需要多少個連接
條件纔可以完全消除笛卡爾積?
使用連接條件放在where中
如果有n張表的連接,至少需要n-1個連接
連接方式:
1)等連接:連接條件使用=連接
等連接:主鍵的值等於外鍵的值
外鍵值爲空的數據是查詢不出來的
例一:查詢所有員工的ID,名字和所在部門的名稱
步驟一:分析查詢的表
s_emp s_dept
步驟二:連接條件
s_emp.dept_id=s_dept.id
步驟三:寫sql語句
select s_emp.id,last_name,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id;
注意:多表查詢時,重名的字段需要表名指定
多表查詢時,建議給表取別名
多表查詢時,不要忘了寫連接條件
例二:查詢員工的姓名和部門所在地區的名稱(3張表)
步驟一:查詢的表
s_emp s_dept s_region
步驟二:連接條件
s_emp.dept_id=s_dept.id
s_dept.region_id=s_region.id
步驟三:拼接sql語句
select s_emp.id,last_name,s_region.name
from s_emp e,s_dept d,s_region r
where e.dept_id=d.id and d.region_id=r.id;
練習一:查詢部門名稱包含sa的員工姓名薪水
練習二:查詢歐洲銷售部門的薪水在1000到2000的員工信息
練習三:查詢部門名稱是5位,該部門員工的薪
水不等於1500,並按員工的薪水降序排序
select e.last_name,e.salary,d.name
2 from s_emp e,s_dept d
3 where e.dept_id=d.id and length(d.name)=5 and e.salary!=1500
4 order by e.salary DESC;
2)不等連接:連接條件使用的不是等號的連接
>,<,...between..and
drop table s_gender;
create table s_gender(
id number(5) primary key,
minSal number(7),
maxSal number(7),
name varchar2(20));
insert into s_gender
values(1,0,1000,'藍領');
insert into s_gender
values(2,1000,1500,'白領');
insert into s_gender
values(3,1500,2500,'金領');
commit;
查詢所有員工的工資等級?
3)外連接:把外鍵爲空的數據一併查詢出來
使用:(+) 放在連接條件上
規則:把(+)放在查詢數據少的一方
例一:查詢所有員工所在部門的名稱,但是
需要把所有部門給查詢出來
insert into s_dept
values(1000,'teaching',2);
commit;
SQL> select e.last_name,d.name
2 from s_emp e,s_dept d
3 where e.dept_id(+)=d.id;
右外連接:
標準的sql:..right join...on....右外連接
SQL> select e.last_name,d.name
2 from s_emp e right join s_dept d
3 on e.dept_id=d.id;
例二:查詢員工所在部門的名稱,
包括沒有部門號的員工(所有員工)
SQL> select e.last_name,d.name
2 from s_emp e,s_dept d
3 where e.dept_id=d.id(+);
注意:等連接不能查詢外鍵值爲空的數據。
左外連接:
標準的sql:left join ...on...左外連接
select e.last_name,d.name
from s_emp e left join s_dept d
on e.dept_id=d.id;
例三:查詢員工所在部門的名稱,
沒有部門號的員工
所有的部門都查詢出來
select e.last_name,d.name
from s_emp e full join s_dept d
on e.dept_id=d.id;
標準的sql語句:...full join...on...(全連接)
所有數據庫語言通用的SQL語句
4)自連接:連接的時候來自同一張表
同一張表可以當作多張表使用。
from s_emp,s_dept,s_region
from s_emp ,s_emp, s_emp...
查詢所有員工的經理的last_name,salary
包括沒有經理的員工。
select m.last_name,m.salary
from s_emp e,s_emp m
where e.manager_id=m.id;
5)集合連接
union:並集,重複的列只顯示一行
union all:並集,不會消除重複的行
minus:差集
intersect:交集
rownum:僞列,可以分頁技術,邏輯位置
只能等於1
不能大於或者大於等於任何正整數
可以小於或者小於等於任何正整數
rowid:數據保存到文件中的物理位置
部門表中前5條記錄?
select *
from s_dept
where rownum<=5;
部門表中第3條到第5條數據?
select *
from s_dept
where rownum <=5
minus
select *
from s_dept
where rownum >=2;
page:當前頁
count:每一頁的數據
Group Function
AVG/avg:平均
COUNT/count:求非空數據的個數
MAX/max:最大
MIN/min:最小
SUM/sum:和
例一:查詢所有員工的平均工資,最高工資最低工資,工資總和,以及有多少個員工?
select avg(salary),max(salary),min(salary),sum(salary),count(last_name)
from s_emp;
例二:查詢每個部門的平均工資?對平均工資降序排序.平均工資大於1400.
簡化1:求41號部分員工的平均工資?
簡化2:求每個部門的平均工資?
簡化3:平均工資大於1400.
SQL> select avg(salary),dept_id
2 from s_emp
3 having avg(salary)>1400
4 group by dept_id;
簡化4:平均工資降序排序
SQL> select avg(salary),dept_id
2 from s_emp
3 having avg(salary)>1400
4 group by dept_id
5 order by avg(salary) DESC;
分組注意: a)group by 進行分組
b)將值相同的數據分爲一組
c)group by 放在where 後面
*d)組函數不能放在where中,對組函數進行過濾用having. having放在group by後面
e)出現在select後的字段 如果該字段沒有出現在組函數中那就必須出現在group by中
f)多個字段同時分組 多個字段的值都相同才分爲一組
練習:
1.查看各個部門的最高工資
SQL> select max(salary),dept_id
2 from s_emp
3 group by dept_id;
2.查看各個部門的員工數
SQL> select count(last_name),dept_id
2 from s_emp
3 group by dept_id;
3.查詢各個部門各個職稱的平均薪水和最大薪水,並且平均薪水大於2000的部門id;
SQL> select avg(salary),max(salary),dept_id,title
2 from s_emp
3 having avg(salary)>2000
4 group by dept_id,title;
4.查詢title中不包含vp字符串的每個職位的平均薪水和總薪水,並對平均薪水進行降序排列,並且每個職位的總薪水大於5000?
子查詢
一條sql語句嵌套一個或者多個sql語句
格式:
select...
from..
where 字段名 比較符 (
select...
from..
where..
group by..
having...
order by...
)
group by...
having..
order by...
什麼情況下使用:比較符中參數不確定的情況
子查詢出現的地方:1)where子句
2)form子句
3)having子句
例一:查詢和Ngao在同一個部門的員工id,last_name
步驟一:分析所用的表
s_emp
步驟二:分析子查詢
查詢和Ngao在哪個部門
select dept_id
from s_emp
where last_name='Ngao';
步驟三:嵌套sql語句
select id,last_name
from s_emp
where dept_id =(
select dept_id
from s_emp
where last_name='Ngao'
);
子查詢的結果要和外圍查詢的條件對應
未完..