數據庫技術
l 前言
T1.什么是數據庫?
存儲數據的倉庫
T2.常見的數據庫有哪些?
微軟-------SQLServer
微軟-------Access
IBM-------DB2
甲骨文-----Oracle
甲骨文-----MySQL
國產-------人大金倉
T3.生活中那些地方使用數據庫?
超市商品管理系統---商品信息和價錢
銀行管理系統----賬戶信息
醫院掛號系統----用戶信息
網上商城系統-商品信息和價錢和等級
12306---------賬戶信息和車次信息
一、數據庫發展史
1.1 程序管理階段(20世紀50年代中期)
特點:不能長期存儲數據
1.2 文件系統階段(20世紀50年代后期---20世紀60年代后期)
特點:數據缺乏獨立性
1.3 數據庫系統階段(20世紀60年代后期--)
特點:數據實現共享,減少冗余
二、數據庫專業術語
2.1 關系
一個關系就是一張2維表(Excel)
2.2 元組
在2維表中,一行叫做元組,或者稱為
“行”或者 “記錄”
2.3 屬性
在2為表中,一列叫做屬性,或者稱為
“列”或者“字段”
三、數據庫及連接工具介紹
3.1 Oracle數據庫介紹
Oracle是美國ORACLE公司研發的一款關系型數據庫,主要特點有:速度快、安全性強、可跨平台,主要版本有:Oracle9i、Oracle10g、Oracle11g、
Oracle12c
3.2 連接工具介紹
l SQL Developer--Oracle自主研發
l PL/SQL Developer
l Navicat
3.3 Oracle數據庫登錄
1)登錄到DOS窗口
開始>搜索程序和文件>cmd>回車
2)在DOS窗口中輸入:sqlplus>回車
3)請輸入用戶名:system>回車
4)輸入口令:123456>回車
說明:如果出現
連接到:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production SQL> 表示登錄成功
四、表空間
表空間就是數據庫中存儲對象(2維表、視圖、索引、序列)的容器,因為主要存儲2維表(表),所以稱為表空間
l 在數據庫安裝的時候,系統會自動創建表空間(system)
l 可以通過system表空間,創建其它表空間
l 一個數據庫中,可以有若干個表空間,也可以只有一個system表空間。
五、數據類型
小說類型=>都市、玄幻、穿越、仙俠
5.1 字符類型
char、varchar、varchar2
char(n) 表示固定長度的字符串,n表示字符串的長度,當實際要保存的數據小於n時,在字符串的右側,使用空格補齊。
例如: char(10) 存儲zhangxs,會占用系統10個存儲空間(7+3)
varchar(n) 表示可變長度的字符串,n表示字符串的最大長度,當要保存的數據小於n時,按照實際長度保存。
varchar2,是Oracle自定義的類型,比varchar數據類型兼容性更好,一般在企業開發中,常用varchar2代替varchar
5.2 數值類型
number
number(n) 表示整數類型,n表示能保存整數的最大位數
例如: number(3) 999 88 5
number(n,m) 表示整數或者小數,n表示有效數字的最大位數,m表示小數的最大位數,n-m表示整數的最大位數
例如: number(7,2) 12345.3 1000
5.3 日期類型
date 表示日期類型,包含:年月日時分秒
系統默認日期格式: dd-mon月-yy
dd----表示幾號
mon---表示幾月
yy-----表示那年
六、數據庫語句
6.1 SQL語句
結構化查詢語句,通過SQL語句,可以對數據庫進行增刪改查。
6.2 SQL語句分類
DDL--數據定義語句,主要是對數據庫中的表,創建、刪除、修改
創建----create
修改----alter
刪除----drop
DML--數據操縱語句,主要是對數據庫表中的數據,插入、修改(更新)、刪除
插入---insert
更新---update
刪除---delete
TCL--事務控制語句,主要負責數據庫中的事務。
提交事務---commit
回滾事務---rollback
DQL--數據查詢語句,數據庫中的重點
查詢---select
6.3 創建表
格式:
create table 表名(
列名1 數據類型 primary key,
列名2 數據類型,
......
列名n 數據類型
);
create table per01(
id number(8) primary key,
name varchar2(30),
age number(3),
sex char(3)
);
create table per02(
id number(8) primary key,
name varchar(30)
);
練習:創建一張表,表名為per03,表中包含的字段有:
id number(8) primary key
name varchar2(30)
sex char(3)
address varchar2(50)
create table per03(
id number(8) primary key,
name varchar2(30),
sex char(3),
address varchar2(50)
);
練習:創建一張表,表名為ter01,表中包含的字段有:
id number(4) primary key
name varchar2(30)
age number(3)
sex char(3)
sal number(7,2)
address varchar(50)
ttime date
create table ter01(
id number(4) primary key,
name varchar2(30),
age number(3),
sex char(3),
sal number(7,2),
address varchar(50),
ttime date
);
6.4 查看表結構
格式: desc 表名;
案例:查看per01表的,表結構
desc per01;
練習:查看per03表的,表結構
desc per03;
6.5 插入語句
6.5.1 向全部列插入數據
格式:
insert into 表名 values(列值1,列值2,列值3.....列值n);
說明:values中的列值必須和表結構中的列名是一一對應的(數量、順序、類型)
驗證: select * from 表名;
案例:向per01表中,插入2條記錄
desc per01;
insert into per01 values(1001,'張三',23,'男');
insert into per01 values(1002,'李四',30,'女');
select * from per01;
練習:向per02表中插入2條記錄,並驗證
(1)desc per02;
(2)insert into per02 values(101,'奧利根');
(3)insert into per02 values(102,'奧利奧');
(4)select * from per02;
練習:向per03表中,插入2條記錄,並驗證
desc per03;
insert into per03 values(1,'王五','男','北京');
insert into per03 values(2,'趙六','男','天津');
select * from per03;
6.5.2 向指定列插入數據
格式:
insert into 表名(列名1,列名2,列名3.....列名n) values(列值1,列值2,列值3.....列值n);
說明:表名中的列名必須和values中的列值是一一對應的(數量,順序,類型)。
驗證:select * from 表名;
案例:向per01表中插入2條記錄
ID NAME AGE SEX
9001 tom 20
9002 rose 女
9003 25 男
insert into per01(id,name,age) values(9001,'tom',20);
insert into per01(id,name,sex) values(9002,'rose','女');
select * from per01;
insert into per01(id,age,sex) values(9003,25,'男');
練習:向per03表中,插入數據並驗證
ID NAME SEX ADDRESS
801 jack 男
802 女 上海
803 lucy 廣州
insert into per03(id,name,sex) values(801,'jack','男');
insert into per03(id,sex,address) values(802,'女','上海');
insert into per03(id,name,address) values(803,'lucy','廣州');
select * from per03;
6.6 修改(更新)語句
格式:
update 表名 set 列名1=該列新值, 列名2=該列新值,.....列名n=該列新值 where 條件;
說明:如果沒有where條件,修改全部數據。
驗證:select * from 表名;
案例:修改per03表中,編號(id)是801的記錄,將地址(address)修改為深圳
update per03 set address='深圳' where id=801;
select * from per03;
案例:修改per03表中,地址(address)是上海的記錄,將姓名(name)修改為rose
update per03 set name='rose' where address='上海';
練習:修改per03表中,姓名(name)是lucy的記錄,將性別(sex)修改為女
update per03 set sex='女'
where name='lucy';
練習:修改per01表中,編號是9003的記錄,將姓名(name)修改為smith,年齡(age)修改為99歲
update per01 set name='smith',age=99 where id=9003;
練習:修改per01表中,將全部年齡(age)修改為18歲
update per01 set age=18;
6.7 刪除表中的數據
格式:
delete from 表名 where 條件;
說明:如果沒有where條件,刪除全部數據。
案例:刪除per01表中,將編號(id)是9001的記錄刪除
delete from per01 where id=9001;
練習:刪除per01表中,將姓名(name)是rose的記錄刪除
delete from per01 where name='rose';
練習:刪除per01表中全部數據
delete from per01;
6.8 刪除表
格式:drop table 表名;
案例:刪除per01、per02、per03表
drop table per01;
select * from per01;
復習:
l 創建表
create table 表名(
列名1 數據類型 primary key,
列名2 數據類型,
列名3 數據類型,
......
列名n 數據類型
);
l 查看表結構
desc 表名;
l 向全部列插入數據
insert into 表名 values(列值1,列 值2,........列值n);
l 向指定列插入數據
insert into 表名(列名1,列名2,...列名n) values(列值1,列值2,...列值n);
l 修改(更新)語句
update 表名 set 列名1=該列新值,列名2=該列新值,....列名n=該列新值 where 條件;
l 刪除表中的數據
delete from 表名 where 條件;
l 刪除表
drop table 表名;
6.9 查詢語句(重點)
6.9.1 沒帶條件的查詢語句
1)查詢全部列數據
select * from 表名;
說明: *表示全部列
案例:查詢emp表、dept表、salgrade表全部數據
select * from emp; ---員工表
select * from dept; ---部門表
select * from salgrade; -工資等級表
2)查詢指定列數據
格式:
select 列名1,列名2,....列名n from 表名;
案例:查詢emp表中,員工的編號(empno)、員工的姓名(ename)、員工的工資(sal)
select empno,ename,sal
from emp;
案例:查詢dept表中,部門的編號(deptno),部門名稱(dname),部門地址(loc)
select deptno,dname,loc
from dept;
練習:查詢emp表中,員工的編號(empno),姓名(ename),職位(job),工資(sal),入職時間(hiredate)
select empno,ename,job,sal,hiredate
from emp;
練習:查詢salgrade表中,工資的等級(grade),最低工資(losal)、最高工資(hisal)
select grade,losal,hisal
from salgrade;
6.9.2 給列起別名
格式1:
select 列名1 as 別名1,列名2 as 別名2,.....列名n as 別名n from 表名;
案例:查詢emp表中,員工的編號(empno),員工姓名(ename),領導編號(mgr),入職時間(hiredate),並給每列起別名
select empno as 員工編號,ename as 員工姓名,mgr as 領導編號,hiredate as 入職時間
from emp;
格式2:
select 列名1 別名1,列名2 別名2,.....列名n 別名n from 表名;
練習:查詢dept表中,部門編號(deptno),部門名稱(dname),部門地址(loc),並給每列起別名
select deptno 部門編號,dname 部門名稱,loc 部門地址
from dept;
6.9.3 去掉重復的列值(distinct)
格式:
select distinct 列名 from 表名;
案例:查詢emp表中,員工的職位(job)信息(去重)
select distinct job from emp;
練習:查詢emp表中,部門的編號(deptno)(-去重)
select distinct deptno from emp;
6.9.4 排序(order by)
格式:
select */列名 from 表名
order by 列名1 asc/desc,列名2 asc/desc;
說明: asc----升序排列(默認)
desc---降序排列
案例:查詢emp表中,員工的編號(empno),姓名(ename),工資(sal),根據員工的編號降序排列
select empno,ename,sal
from emp
order by empno desc;
練習:查詢emp表中,員工的姓名(ename),職位(job),工資(sal),部門編號(deptno),根據工資升序排列
select ename,job,sal,deptno
from emp
order by sal asc;
練習:查詢emp表中,員工的編號(empno),姓名(ename),工資(sal),部門編號(deptno),首先根據工資升序排列,再次根據員工編號降序排列。
select empno,ename,sal,deptno
from emp
order by sal asc,empno desc;
練習:查詢emp表中,員工的編號(empno),姓名(ename),職位(job),部門編號(deptno),先根據部門編號降序排列,再根據員工編號升序排列
select empno,ename,job,deptno
from emp
order by deptno desc,empno asc;
說明:
l 如果根據2列排序,先根據前面的列排序,如果列值相同,那么在根據第2列排序
l 排序永遠放在格式的最后面
6.9.5 條件查詢語句
格式:
select */列名 from 表名 where 條件;
說明: 條件包含關系運算符、邏輯運算符、特殊情況
關系運算符: > < = >= <= <>/!=(不等於)
案例:查詢emp表中,工資(sal)大於1500的,員工的編號,姓名,職位,工資
select empno,ename,job,sal
from emp
where sal>1500;
練習:查詢emp表中,部門編號是30號部門的,員工的姓名,職位,工資,部門編號(deptno)
select ename,job,sal,deptno
from emp
where deptno=30;
練習:查詢dept表中,部門地址(loc)是BOSTON的,部門的編號(deptno),部門名稱(dname),部門地址
select deptno,dname,loc
from dept
where loc='BOSTON';
練習:查詢emp表中,工資不等於1250的,員工的編號,姓名,工資,根據工資降序排列
select empno,ename,sal
from emp
where sal<>1250
order by sal desc;
邏輯運算符: and(與)、or(或)、not(非)
1)and 並且 連接2個或者多個條件
案例:查詢emp表中,工資在1000~3000之間的,員工的編號,姓名,職位,工資
select empno,ename,job,sal
from emp
where sal>1000 and sal<3000;
練習:查詢emp表中,部門編號是30號部門並且工資大於1000的,員工的編號,姓名,職位,工資,部門編號
select empno,ename,job,sal,deptno
from emp
where deptno=30 and sal>1000;
2) or 或者
案例:查詢emp表中,職位是SALESMAN或者工資大於1000的,員工的編號,職位,工資
select empno,job,sal
from emp
where job='SALESMAN' or sal>1000;
練習:查詢emp表中,工資大於等於3000或者部門編號是20號部門的,員工的編號,姓名,職位,工資,部門編號,根據工資升序排列
select empno,ename,job,sal,deptno
from emp
where sal>=3000 or deptno=20
order by sal asc;
3) not 非
案例:查詢emp表中,工資不等於1250,員工的編號,姓名,職位,工資
select empno,ename,job,sal
from emp
where sal<>1250;
select empno,ename,job,sal
from emp
where not sal=1250;
6.9.5.1 查詢列值為空的情況(is null)
案例:查詢emp表中,獎金(comm)為空的,員工的編號,姓名,獎金
select empno,ename,comm
from emp
where comm is null;
練習:查詢emp表中,領導編號(mgr)為空的,員工的編號、姓名、職位、領導編號
select empno,ename,job,mgr
from emp
where mgr is null;
6.9.5.2 查詢列值不為空的情況(is not null)
案例:查詢emp表中,獎金不為空的,員工的編號,姓名,職位,工資,獎金,根據工資升序排列
select empno,ename,job,sal,comm
from emp
where comm is not null
order by sal asc;
練習:查詢emp表中,有領導編號的,員工的全部列信息
select * from emp where mgr is not null;
6.9.5.3 between....and
格式:
select */列名 from 表名 where 列名 between 初值 and 終值;
說明:使用between...and查詢出來的數據,范圍在[初值,終值]之間。
案例:查詢emp表中,工資在1000~5000之間的,員工的編號,姓名工資
select empno,ename,sal
from emp
where sal>=1000 and sal<=5000;
select empno,ename,sal
from emp
where sal between 1000 and 5000;
6.9.5.4 in 比較一個列中的幾個列值
格式:
select */列名 from 表名 where 列名 in(列值1,列值2,.....列值n);
練習:查詢emp表中,員工編號是7521, 7698, 7844, 7902的員工信息
select * from emp where empno=7521 or empno=7698 or empno=7844 or empno=7902;
select * from emp where empno in(7521, 7698, 7844, 7902);
練習:查詢emp表中,員工職位是MANAGER, SALESMAN, ANALYST的,員工的編號,姓名,職位,工資
select empno,ename,job,sal
from emp
where job in('MANAGER', ' SALESMAN',' ANALYST');
復習:
1、查詢全部列數據
select * from 表名;
2、查詢指定列數據
select 列名1,列名2,....列名n from 表名;
3、給列起別名
select 列名1 as 別名1,列名2 as 別名2,....列名n as 別名n from 表名;
select 列名1 別名1,列名2 別名2,....列名n 別名n from 表名;
4、去掉重復的列值
select distinct 列名 from 表名;
5、排序
select */列名 from 表名 order by 列名1 asc/desc,列名2 asc/desc;
6、條件查詢
select */列名 from 表名 where 條件;
關系運算符:> < = >= <= <>/!=
sal>2000 job='MANAGER'
sal<>1250
邏輯運算符: and or not
sal>1000 and sal<5000
deptno=10 and job='MANAGER'
deptno=30 or sal>2000
not sal=1250
特殊情況:
l 列值為空 comm is null
l 列值不為空 mgr is not null
l between...and和and相似
select */列名 from 表名 where 列名 between 初值 and 終值;
l in 比較一個列中的幾個列值
select */列名 from 表名 where 列名 in(列值1,列值2,....列值n);
6.9.5.5 模糊查詢(-重點)
格式:
select */列名 from 表名 where 列名 like 條件;
說明條件組成:
l %: 表示0個或者多個任意字符
l _: 表示任意一個字符
案例:查詢emp表中,員工姓名的首字母(第1個字母)是M開頭的,員工的編號,姓名,職位
Mfsdfdf M===>M%
select empno,ename,job
from emp
where ename like 'M%';
案例:查詢emp表中,員工姓名尾字母是(最后一個字母)N的,員工的編號,姓名,職位
dsafdN N ==> %N
select empno,ename,job
from emp
where ename like '%N';
案例:查詢emp表中,員工姓名中包含(含有)字母N的,員工的編號,姓名,工資
fdsN Newr gfNgfg==>%N%
select empno,ename,sal
from emp
where ename like '%N%';
練習:查詢emp表中,員工姓名倒數第2個字母是N的,員工的編號,姓名,工資
dfsdNe Nw ==> %N_
select empno,ename,sal
from emp
where ename like '%N_';
練習:查詢emp表中,員工姓名正數第3個字母是N的,員工的編號,姓名,工資
select empno,ename,sal
from emp
where ename like '__N%';
6.9.6 處理空值的函數
案例:查詢emp表中,員工的編號,姓名,工資,年薪(工資*12)
select empno,ename,sal,sal*12 from emp;
案例:查詢emp表中,員工的編號,姓名,工資,獎金(comm),年薪(工資*12+comm)
select empno,ename,sal,comm,sal*12+nvl(comm,0) from emp;
說明:任何數值類型通過“+”和null連接在一起,結果是null,對於這種情況需要使用nvl()函數處理
nvl(列名,數值) 表示如果列值為null,使用數值代替null。
6.9.7 聚合(分組)函數
count() sum() avg() min()
max()
1)count(列名/*)
*: 表示統計表中數據的總數量
列名: 表示統計該列中,列值不為空的總數量
案例:統計emp表中,員工的總數量
select count(*) from emp;
案例:統計emp表中,獎金不為空的,員工的總數量
select count(comm) from emp;
練習:統計emp表中,員工職位的總數
select count(distinct job) from emp;
2)sum(列名) 統計列值累加之和
案例:統計emp表中,員工的工資總和
select sum(sal) from emp;
練習:統計emp表中,員工的獎金總和
select sum(comm) from emp;
3)avg(列名) 求平均值
案例:求emp表中,獎金的平均值
select avg(comm) from emp;
練習:求emp表中,工資的平均值
select avg(sal) from emp;
4)min(列名) 求最小值
案例:查詢emp表中,員工的最低工資
select min(sal) from emp;
練習:查詢emp表中,員工編號的最小值
select min(empno) from emp;
5)max(列名) 求最大值
案例:查詢emp表中,員工的最高工資
select max(sal) from emp;
練習:查詢emp表中,員工總數,工資總和,平均工資,最低工資,最高工資,並給每列起別名
select count(*) 員工總數,sum(sal) 工資總和,avg(sal) 平均工資,min(sal)
最低工資,max(sal) 最高工資 from emp;
6.9.8 分組查詢
解釋分組查詢:在數據庫中的表中,對表中某一列的數據,根據列值分成幾組(相同的分成一組),然后對每一組的數據,使用聚合函數,聚合函數經常和分組查詢一起使用。
格式:
select 列名/聚合函數
from 表名
where 條件
group by 列名
order by 列名/聚合函數 asc/desc;
案例:查詢emp表中,每個部門的編號,部門的人數,部門的最高工資
select deptno,count(*),max(sal)
from emp
group by deptno;
案例:查詢emp表中,工資大於1000的,每個部門的編號,部門的工資總和,部門的平均工資
select deptno,sum(sal),avg(sal)
from emp
where sal>1000
group by deptno;
練習:查詢emp表中,領導編號不為空的,每個部門的編號,部門的最高工資,部門的人數,根據部門編號升序排列
select deptno,max(sal),count(*)
from emp
where mgr is not null
group by deptno
order by deptno asc;
練習:查詢emp表中,員工姓名中不包含C的,每個職位的名稱,職位的最高工資,每個職位的人數,根據人數降序排列
select job,max(sal),count(*)
from emp
where not ename like '%C%'
group by job
order by count(*) desc;
6.9.9 having語句
解釋:分組查詢后,得到的結果,再次進行過濾,這個時候使用having語句
格式:
select 列名/聚合函數
from 表名
where 條件
group by 列名
having條件
order by 列名/聚合函數 asc/desc;
where和having的區別:
l where是對整張表的數據進行過濾,可以單獨使用
l having是對分組后的數據進行過濾,
having必須和group by一起使用。
案例:查詢emp表中,部門的平均工資大於2000的,每個部門的編號,部門人數,部門的平均工資
select deptno,count(*),avg(sal)
from emp
group by deptno
having avg(sal)>2000;
練習:查詢emp表中,工資在1000~5000之間的,每個職位的名稱,職位的人數,職位的平均工資,職位的最高工資,要求職位的最高工資小於3000,根據平均工資降序排列
select job,count(*),avg(sal),max(sal)
from emp
where sal>1000 and sal<5000
group by job
having max(sal)<3000
order by avg(sal) desc;
6.9.10 常用字符處理函數
1)length(字符串/列名) 統計字符串中字符/列值的個數
案例:查詢emp表中,員工的姓名以及姓名的長度
select ename,length(ename) from emp;
案例:查詢helloworld字符串的長度
說明:如果試題中沒有表,可以使用系統自帶表---dual可以驗證各種函數的使用
select length('helloworld') from dual;
2)substr(參數1,參數2,參數3) 截取字符串---重點
參數1: 要截取的字符串/列名
參數2: 從哪里開始截取
如果是正數表示從正數第幾位開始截取,如果是負數,表示從倒數第幾位開始截取
參數3:截取的數量
select substr('helloworld',-3,2) from dual;
select substr('helloworld',5,3) from dual;
練習:查詢emp表中,員工的姓名以及姓名最后2個字母
select ename,substr(ename,-2,2) from emp;
3)拼接字符串
l 使用 || 拼接字符串
select '窗前明月光' || '疑是地上霜' || '舉頭望明月' || '低頭思故鄉' from dual;
select ename || job from emp;
l 使用concat拼接字符串
concat(字符串/列名,字符串/列名)
select ename,job,concat(ename,job) from emp;
復習:
1、模糊查詢
select 列名 from 表名
where 列名 like 條件;
條件: %: 0個或者多個任意字符
_: 1個任意字符
2、處理空值的函數
nvl(列名,數值) 如果列值為null,使用數值代替null
3、聚合函數
count(列名/*)
*:表示統計表中數據總數量
列名:列值不為空的,數據總數量
sum(列名) 求和
avg(列名) 求平均值
min(列名) 求最小值
max(列名) 求最大值
4、分組查詢
聚合函數經常和分組查詢一起使用
select 列名/聚合函數
from 表名 ---1
where 條件 ---2
group by 列名 ----3
order by 列名/聚合函數 asc/desc;
5、having語句
select 列名/聚合函數
from 表名 ---1
where 條件 ---2
group by 列名----3
having 條件
order by 列名/聚合函數 asc/desc;
6.9.11 常用數值處理函數
1)round(數值,位數) 四舍五入函數
如果位數>0,表示小數點后保留幾位小數,如果位數=0,不保留小數,位數<0,小數點之前第幾位進行四舍五入
select round(35.376,2) from dual;
select round(35.376,1) from dual;
select round(35.576,0) from dual;
select round(35.576,-1) from dual;
----40
select round(35.576,-2) from dual;
----0
2)trunc(數值,位數) 截取函數
如果位數>0,表示小數點后保留幾位小數,如果位數=0,不保留小數,位數<0,舍掉小數點之前第幾位
select trunc(35.376,2) from dual;
--35.37
select trunc(35.376,1) from dual;
--35.3
select trunc(35.576,0) from dual;
--35
select trunc(35.576,-1) from dual;
--30
select trunc(35.576,-2) from dual;
--0
6.9.12 常用日期處理函數
l 常見的日期格式:
系統默認格式: dd-mon月-yy
年月日格式: yyyy-mm-dd
年月日時分秒格式:
yyyy-mm-dd hh24:mi:ss
1)sysdate 當前系統日期
案例:查詢當前系統時間
select sysdate from dual;
練習:查詢昨天、今天、明天的日期
select sysdate-1,sysdate,sysdate+1 from dual;
2)to_char(date,'日期格式的一部分')
案例:查詢當前的月份
select to_char(sysdate,'mm') from dual;
練習:查詢當前時間的分鍾數
select to_char(sysdate,'mi') from dual;
練習:查詢emp表中,12月份入職的,員工的編號,姓名,職位,入職時間(hiredate)--重點
select empno,ename,job,hiredate
from emp
where to_char(hiredate,'mm')='12';
3)to_date('特殊日期格式的字符串','日期格式')
將字符類型按照某種日期格式,轉換為日期類型,經常用於插入語句操作
案例:向emp表中插入2條記錄
empno ename hiredate
2345 ROSE 2019-5-9
2346 JACK 2000-10-11
2347 TOMS 2008-8-8
insert into emp(empno,ename,hiredate) values(2345,'ROSE',to_date('2019-5-9','yyyy-mm-dd'));
insert into emp(empno,ename,hiredate) values(2346,'JACK',to_date('2000-10-11','yyyy-mm-dd'));
insert into emp(empno,ename,hiredate) values(2347,'TOMS',to_date('2008-8-8','yyyy-mm-dd'));
6.9.13 多表連接查詢
說明:多表連接查詢就是,通過一條SQL語句,可以將分布在不同表中的數據,一次查詢出來------多表連接查詢
格式:
select 別名1.*/列名,別名2.*/列名,...
from 表1 別名1,表2 別名2,.....
where 關聯條件;
案例:查詢emp表中,員工的編號,姓名,職位以及dept表中,部門的編號,部門名稱
select e.empno,e.ename,e.job,d.deptno,d.dname
from emp e,dept d
where e.deptno=d.deptno;
說明:如果2張表中的,關聯條件是通過“=”相連接的,稱為等值連接查詢,特點是把2張表中有關聯的數據全部查詢出來。
案例:查詢emp表中,工資在1000~5000之間的,員工的編號,姓名,職位,工資以及dept表中全部列的數據
select e.empno,e.ename,e.job,e.sal,d.*
from emp e,dept d
where e.deptno=d.deptno and e.sal>1000 and e.sal<5000;
練習:查詢emp表中,工資大於1000的,員工的編號,姓名,職位,工資以及dept表中,部門的名稱(dname),部門地址(loc),根據工資進行降序排列
select e.empno,e.ename,e.job,e.sal,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno and e.sal>1000
order by e.sal desc;
練習:查詢emp表中,員工姓名中不包含字母K的並且在10和20號部門下的,員工的編號,姓名,職位,以及dept表中部門名稱,部門地址
select e.empno,e.ename,e.job,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno and not e.ename like '%K%' and (e.deptno=10 or e.deptno=20);
select e.empno,e.ename,e.job,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno and not e.ename like '%K%' and e.deptno in(10,20);
2)非等值連接查詢
說明:如果2張表中,關聯條件不是通過“=”相連接的,稱為非等值連接查詢
案例:查詢emp表中,員工的編號,姓名,職位,工資以及salgrade表中,工資等級(grade),最低工資(losal),最高工資(hisal)
emp表中的sal,一定在salgrade表中的最低工資(losal)和最高工資(hisal)之間
e.sal between s.losal and s.hisal
select e.empno,e.ename,e.job,e.sal,
s.grade,s.losal,s.hisal
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
3)自連接
自連接查詢就是,列與列之間存在關聯關系,我們將1張表看成2張表,使用等值連接方式進行查詢。
練習:查詢emp表中,員工的編號,姓名,職位,領導編號(mgr),領導姓名
select e.empno,e.ename,e.job,e.mgr,m.ename
from emp e,emp m
where m.empno=e.mgr;
6.9.14 子(嵌套)查詢
子查詢就是在一個查詢語句的內部,又包含一個查詢語句。
案例:查詢emp表中,工資大於平均工資的,員工的編號,姓名,職位,工資
1)求出平均工資
select avg(sal) from emp;
2)合成
select empno,ename,job,sal
from emp
where sal>(select avg(sal) from emp);
練習:查詢emp表中,工資大於30號部門最高工資的,員工的編號,姓名,工資
select empno,ename,sal
from emp
where sal>(select max(sal) from emp where deptno=30);
練習:查詢dept表中,部門地址(loc)是DALLAS下的,員工的編號,姓名,職位,工資
select e.empno,e.ename,e.job,e.sal
from emp e,dept d
where e.deptno=d.deptno and d.loc='DALLAS';
select empno,ename,job,sal from emp where deptno=(select deptno from dept where loc='DALLAS');
練習:查詢emp表中和JONES是同一個部門的,員工的編號,姓名,職位,部門編號
select empno,ename,job,deptno from emp where deptno=(select deptno from emp where ename='JONES');
復習:
1、常見字符處理函數
l length(字符串/列名) 統計字符/列值的個數
l substr(參數1,參數2,參數3) 截取字符串
參數1:被截取的字符串/列名
參數2:從哪里開始截取
參數3:截取個數
l 拼接字符串 || 或者 concat
|| 可以無限拼接
concat(字符串/列名,字符串/列名)
2、常見數值處理函數
l round(數值,位數) 四舍五入函數
l trunc(數值,位數) 截取函數
3、常見日期處理函數
l sysdate 獲取系統當前日期
l to_char(date,'日期格式的一部分')
l to_date('日期格式的字符串','日期格式')
4、多表連接查詢
select 別名1.*/列名,別名2.*/列名...
from 表1 別名1,表2 別名2....
where 關聯條件;
6.9.15 事務控制語句
1)提交事務---commit
create table test01(
id number(4) primary key,
name varchar2(30)
);
insert into test01 values(101,'喬峰');
insert into test01 values(102,'虛竹');
select * from test01;
commit;
2)回滾事務---rollback
說明:回滾事務只可以撤銷未保存(沒有提交事務的)的事務
insert into test01 values(103,'段譽');
insert into test01 values(104,'許仙');
select * from test01;
rollback;
七、約束(constraint)
說明:在創建表的時候,對表中的列設置一些規則,在插入數據的時候,只有滿足這些規則才可以插入數據,我們把這些規則叫做約束。
l 約束的分類
主鍵約束(primary key)
唯一約束(unique)
檢查約束(check)
默認值約束(default)
非空約束(not null)
7.1 主鍵約束(primary key)
說明:主鍵約束就是用來標識表中唯一的一條記錄,被主鍵約束所修飾的列,其列值是唯一且非空的,一張表中,只可以有一個主鍵約束。
1)創建表時,添加主鍵約束
create table test02(
id number(4) primary key,
name varchar2(30),
age number(3)
);
insert into test02 values(101,'rose',22);
insert into test02 values(101,'jack',25);
insert into test02(name,age) values('toms',30);
2)聯合主鍵(復合主鍵)---重點
使用主鍵約束修飾2個列或者多列叫做復合主鍵
create table test03(
id number(4),
name varchar2(30),
age number(3),
address varchar2(50),
constraint pk_id_name_test03 primary key(id,name)
);
insert into test03 values(101,'tom',20,'北京');
insert into test03 values(101,'toms',22,'上海');
insert into test03 values(101,'toms',25,'重慶');
3)修改表時,添加主鍵約束
格式:
alter table 表名 add constraint
約束名 primary key(列名1,列名2....列名n);
案例:創建一張表,表名為test04,表中的字段有: id number(4),
name varchar2(30), sex char(3),email varchar2(30),修改表時,對id列添加主鍵約束,約束名為pk_id_test04
create table test04(
id number(4),
name varchar2(30),
sex char(3),
email varchar2(30)
);
alter table test04 add constraint
pk_id_test04 primary key(id);
insert into test04(id,name) values(101,'金庸');
insert into test04(id,name) values(101,'古龍');
練習:創建一張表,表名為test05,表中包含的字段有:tid number(4)
tname varchar2(30)
passwd varchar2(30)
修改表時,對tid和tdname添主鍵約束,約束名為pk_tid_tname_test05
create table test05(
tid number(4),
tname varchar2(30),
passwd varchar2(30)
);
alter table test05 add constraint pk_tid_tname_test05 primary key(tid,tname);
4)刪除主鍵約束
格式1:
alter table 表名 drop primary key;
格式2:
alter table 表名 drop constraint 約束名;
說明:可以使用此格式,刪除主鍵約束、唯一約束、檢查約束。
案例:刪除test02表中的主鍵約束
alter table test02 drop primary key;
案例:刪除test05表中的主鍵約束,約束名為pk_tid_tname_test05
alter table test05 drop constraint pk_tid_tname_test05;
練習:刪除test04表中的主鍵約束,約束名為pk_id_test04
alter table test04 drop constraint pk_id_test04;
7.2 唯一約束(unique)
說明:使用唯一約束可以修飾1列或者多列的組合值,使其具有唯一性,防止用戶輸入重復數據
l 被唯一約束修飾的列,列值可以為null
l 一張表中,可以有多個唯一約束
1)創建表時,添加唯一約束
create table test06(
id number(4) primary key,
name varchar2(30) unique,
age number(3),
email varchar2(30)
);
insert into test06(id,name) values(101,'小花');
insert into test06(id,name) values(102,'小花');
2)修改表時,添加唯一約束
格式:
alter table 表名 add constraint 約束名 unique(列名1,列名2,.....列名n);
案例:對test06表中的,email列,添加唯一約束,約束名為uq_email_test06
alter table test06 add constraint uq_email_test06 unique(email);
練習:創建一張表,表名為test07,表中包含的字段有: id number(4) pk,
name varchar2(30), phone number(7),address varchar2(50)
修改表時,對name和address列添加唯一約束,約束名為uq_name_address_test07
create table test07(
id number(4) primary key,
name varchar2(30),
phone number(7),
address varchar2(50)
);
alter table test07 add constraint uq_name_address_test07 unique(name,address);
3)刪除唯一約束
格式:
alter table 表名 drop constraint 約束名;
案例:刪除test07表中,唯一約束,約束名為uq_name_address_test07
alter table test07 drop constraint uq_name_address_test07;
練習:刪除test06表中,唯一約束,約束名為uq_email_test06
alter table test06 drop constraint
uq_email_test06;
復習:
1、主鍵約束(primary key)
1)聯合主鍵
create table test(
id number(4),
name varchar2(30),
age number(3),
constraint pk_id_name_test priamry key(id,name)
);
2、唯一約束(unique)
l 主鍵約束一張表中只可以有一個,而唯一約束一張表中可以有多個
l 被主鍵約束所修飾的列,其列值是唯一且非空而唯一約束所修飾的列,列值是唯一的,可以為空
3、檢查約束(check)
check(age between 1 and 150)
check(sex in('男','女'))
check(email like '%@%')
7.3 檢查約束(check)
說明:檢查約束就是用於限定某列,必須滿足某種特定的條件,防止用戶輸入非法數據
1)創建表時,添加檢查約束
create table test08(
id number(4) primary key,
name varchar2(30) unique,
sex char(3) check(sex in('男','女')),
age number(3),
email varchar2(30)
);
insert into test08(id,name,sex) values(101,'東方不敗','中');
2)修改表時,添加檢查約束
格式:
alter table 表名 add conctraint 約束名 check(條件);
練習:對test08表中,age列,添加檢查約束,要求年齡在1~150之間,約束名chk_age_test08
alter table test08 add constraint chk_age_test08 check(age between 1 and 150);
insert into test08(id,name,sex,age) values(102,'陸小鳳','男',200);
練習:對test08表中,email列添加檢查約束,要求email中必須包含@符號,約束名為chk_email_test08,並驗證
alter table test08 add constraint chk_email_test08 check(email like '%@%');
3)刪除檢查約束
格式:
alter table 表名 drop constraint 約束名;
案例:刪除test08表中,email列上的檢查約束,約束名為chk_email_test08
alter table test08 drop constraint chk_email_test08;
7.4 默認值約束(default)
當執行插入操作的時候,被默認約束所修飾的列,如果沒有插入數據,系統會自動將默認值作為該列列值。
1)創建表時,添加默認值約束
create table test09(
id number(4) primary key,
name varchar2(30) unique,
sex char(3) check(sex in('男','女')),
hiredate date default sysdate,
age number(3) default 18,
address varchar2(50)
);
insert into test09(id,name,sex) values(101,'tom','男');
select * from test09;
2)修改表時,添加默認值約束
格式:
alter table 表名 modify 列名 數據類型 default 默認值;
案例:修改test09表中,age列上的默認值約束,將默認值修改為20
alter table test09 modify age number(3) default 20;
insert into test09(id,name,sex) values(111,'toms','男');
select * from test09;
練習:修改test09表,對address添加默認值約束,默認值設置為北京,並驗證
alter table test09 modify address varchar2(50) default '北京';
insert into test09(id,name,sex) values(112,'rose','女');
select * from test09;
3)刪除默認值約束
格式:
alter table 表名 modify 列名 數據類型 default null;
案例:刪除test09表中,age列上的默認值約束
alter table test09 modify age number(3) default null;
insert into test09(id,name,sex) values(119,'jack','男');
select * from test09;
練習:刪除test09表中,hiredate列上的默認值約束
alter table test09 modify hiredate date default null;
7.5 非空約束(not null)
當執行插入操作的時候,被非空約束所修飾的列,列值不能為空
1)創建表時,添加非空約束
create table test10(
id number(4) primary key,
name varchar2(30) unique,
sex char(3) check(sex in('男','女')),
hiredate date default sysdate,
age number(3) not null,
address varchar2(50)
);
insert into test10(id,name,sex) values(101,'西門吹雪','男');
2)修改表時,添加非空約束
格式:
alter table 表名
modify(列名1 not null)
modify(列名2 not null)
....
modify(列名n not null);
案例:修改test10表,對address列添加非空約束
alter table test10 modify(address not null);
insert into test10(id,name,sex,age) values(102,'葉孤城','男',20);
練習:創建一張表,表名test11,表中包含的字段有:
id number(4) pk
name varchar2(30)
sex char(3)
age number(3)
修改表時,對name和sex列添加非空約束
create table test11(
id number(4) primary key,
name varchar2(30),
sex char(3),
age number(3)
);
alter table test11
modify(name not null)
modify(sex not null);
3)刪除非空約束
格式:
alter table 表名
modify(列名1 null)
modify(列名2 null)
....
modify(列名n null);
案例:刪除test10表中,address列上的非空約束
alter table test10 modify(address null);
八、索引(index)
索引是建立在表中列上的,數據庫對象,索引可以提高查詢速度。
1)創建索引
格式:
create index 索引名稱 on表名(列名);
create table test12(
id number(4) primary key,
name varchar2(30),
address varchar2(50)
);
create index index_name_test12 on test12(name);
select id,name from test12 where name='rose'; 3s
說明:
l 被主鍵約束所修飾的列,自帶索引
l 被唯一約束所修飾的列,自帶索引
2)刪除索引
格式:
drop index 索引名稱;
案例:刪除test12表中的,索引,索引名稱為index_name_test12
drop index index_name_test12;
九、序列(sequence)
序列是數據庫中的一個對象,通過序列可以生成自動增長的數字,經常使用序列生成的數字,作為主鍵所修飾列的列值。
1)創建序列
create sequence 序列名稱;
2)nextval
生成一個新的數字,第1次執行的時候,默認值為1
案例:創建一個序列,序列名稱為seq_id01
create sequence seq_id01;
select seq_id01.nextval from dual;
案例:創建一張表,表名為test13,表中包含的字段有: id number(4) pk
name varchar2(30),使用序列生成自動增長的數字,作為主鍵所在的列值,序列名稱為seq_n01
create table test13(
id number(4) primary key,
name varchar2(30)
);
create sequence seq_n01;
insert into test13 values(seq_n01.nextval,'天蠶土豆絲');
insert into test13 values(seq_n01.nextval,'我吃西紅柿');
insert into test13 values(seq_n01.nextval,'辰東');
insert into test13 values(seq_n01.nextval,'魚人二代');
3)序列的屬性
l 序列的初始值
start with 初始值
l 序列的增長步長
increment by 步長
l 序列的最小值
minvalue 最小值
l 序列的最大值
maxvalue 最大值
案例:創建一個序列,序列名為seq_n02,初始值為:100,增長步長為:5,最小值為10,最大值為200
create sequence seq_n02
start with 100
increment by 5
minvalue 10
maxvalue 200;
select seq_n02.nextval from dual;
十、視圖(view)
視圖就是1張虛擬表,可以通過視圖查詢一張或者多張表的數據
10.1 創建視圖
create view 視圖名稱
as
查詢語句;
10.2 視圖查詢
案例:查詢emp表中的全部數據,將結果給視圖view_emp01
create view view_emp01
as
select * from emp;
select * from view_emp01;
練習:通過視圖view_emp01,查詢員工的編號,姓名,職位,工資,根據工資降序排列
select empno,ename,job,sal
from view_emp01
order by sal desc;
練習:通過視圖view_emp01,查詢工資大於1000的並且姓名中含有字母N的,員工的編號,姓名,職位,工資,根據編號升序排列
select empno,ename,job,sal
from view_emp01
where sal>1000 and ename like '%N%'
order by empno asc;
練習:創建一個視圖,視圖名稱為:view_emp_dept,查詢emp表中的
全部數據以及dept表中的,部門名稱(dname)和部門地址(loc),作為視圖view_emp_dept的結果
create view view_emp_dept
as
select e.*,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno;
select * from view_emp_dept;
練習:查詢工資在1000~5000之間的並且上級領導編號不為空的,員工的編號,姓名,職位,工資,上級領導編號(mgr),部門地址,首先根據工資降序排列,再次根據編號升序排列
select e.empno,e.ename,e.job,e.sal,e.mgr,d.loc
from emp e,dept d
where e.deptno=d.deptno and e.sal>1000 and e.sal<5000 and e.mgr is not null
order by e.sal desc,e.empno asc;
select empno,ename,job,sal,mgr,loc
from view_emp_dept
where sal>1000 and sal<5000 and mgr is not null
order by sal desc,empno asc;
練習:創建一個視圖,視圖名稱為view_emp_sal,查詢工資在1000~5000之間的,員工的編號,姓名,職位,工資,工資等級(grade),最低工資(losal),最高工資(hisal),作為視圖view_emp_sal結果
emp<------->salgrade
create view view_emp_sal
as
select e.empno,e.ename,e.job,e.sal,s.*
from emp e,salgrade s
where e.sal between s.losal and s.hisal and e.sal>1000 and e.sal<5000;
10.3 修改視圖
格式:
create or replace view 視圖名稱
as
查詢語句;
案例:修改view_emp01視圖,查詢10,30號部門的,員工的編號,姓名,職位,工資,部門編號,作為視圖結果
create or replace view view_emp01
as
select empno,ename,job,sal,deptno
from emp
where deptno in(10,30);
select * from view_emp01;
練習:修改視圖view_emp_dept,查詢dept表中全部數據,作為視圖結果
create or replace view view_emp_dept
as
select * from dept;
select * from view_emp_dept;
10.4 通過視圖實現對表的操作
create view view_dept01
as
select * from dept;
select * from view_dept01;
1)插入操作
insert into view_dept01 values(50,'TESTING','BEIJING');
insert into view_dept01 values(60,'DEVELOPER','SAHNHA');
insert into view_dept01 values(70,'UI','HANGZHOU');
select * from view_dept01;
select * from dept;
2)修改操作
案例:通過視圖view_dept01,修改部門編號是60的,將地址(loc)修改為SHENZHENG
update view_dept01 set loc='SHENZHENG' where deptno=60;
select * from view_dept01;
select * from dept;
練習:通過視圖view_dept01,將部門地址(loc)全部修改為BEIJING
update view_dept01 set loc='BEIJING';
3)刪除操作
練習:刪除view_dept01視圖中,50,60,70號部門的記錄
delete from view_dept01 where deptno in(50,60,70);
10.5 只讀視圖(-重點)
說明:只能查詢,不能修改
格式:
create view 視圖名稱
as
查詢語句
with read only;
案例:創建一個只讀視圖,視圖名稱為view_dept02,並驗證
create view view_dept02
as
select * from dept
with read only;
insert into view_dept02 values(50,'TEST','BEIJING');
10.6 刪除視圖
格式:
drop view 視圖名稱;
案例:刪除view_dept02視圖
drop view view_dept02;
select * from view_dept02;