SQL(Structured Query Language,結(jié)構(gòu)化的查詢語言)睦尽,用來實現(xiàn)關(guān)系數(shù)據(jù)運算的查詢,只要是關(guān)系型數(shù)據(jù)庫SQL語言就是一條標準的語言系統(tǒng)
SQL語言分類
- 查詢語言
用于檢索數(shù)據(jù)庫表中存儲的行,可以使用SQL中的Select語句編寫查詢 - 數(shù)據(jù)操作語言(DML)
insert 添加
update 修改
delete 刪除
merge 合并 - 數(shù)據(jù)定義語言(DDL)
create 創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的時候使用
alter 修改數(shù)據(jù)庫結(jié)構(gòu)
drop 刪除數(shù)據(jù)庫結(jié)構(gòu)
rename 修改表名
truncate 截斷表(刪除表中的全部數(shù)據(jù)) - 數(shù)據(jù)控制語言(DCL)權(quán)限
grant 授予其他用戶/角色 數(shù)據(jù)結(jié)構(gòu)的操作權(quán)限
revoke 收回..... - 事務(wù)控制(TC[L])
將修改的數(shù)據(jù)永久的保存到表中
commit 永久性保存
rollback 取消所做的修改(回滾)
savepoint 設(shè)置保存點,可以回滾到指定的位置
編寫SQL語句的規(guī)則 - SQL關(guān)鍵字不區(qū)分大小寫的.
- 對象名和列不區(qū)分大小寫
- 列中的值區(qū)分大小寫
邏輯操作符 - and : 條件都為true才為true 否則都為false
- or : 如果任意一個條件為true都為true,否則返回false
- not : 條件是false,返回true,如果條件是true就返回false
SCOTT 用戶
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
SALGRADE
BONUS
EMP 員工表
DEPT 部門表
SQL> desc dept;
名稱 是否為空? 類型
----------------------------------------- -------- ----------------------------
DEPTNO NOT NULL NUMBER(2) 部門編號
DNAME VARCHAR2(14) 部門名稱
LOC VARCHAR2(13) 部門地址
SQL> desc emp
名稱 是否為空? 類型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4) 員工編號
ENAME VARCHAR2(10) 員工姓名
JOB VARCHAR2(9) 工種
MGR NUMBER(4) 上司編號
HIREDATE DATE 入職時間
SAL NUMBER(7,2) 工資
COMM NUMBER(7,2) 獎金
DEPTNO NUMBER(2) 部門編號
select * from table_name;
select : 用于指定要檢索的列(用于展示的列)
* : 表示所有列
from : 用于指定檢索的表
table_name : 查詢的表名
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
select <column1,column2,....> from table_name
where expression
where : 用于指定條件語句,如果條件語句返回為true,返回當前行數(shù)據(jù),如果為false,這不會顯示
expression : 表示條件語句
=
<>,!=
>=
<=
<
between ... and ... 在兩個值直接
in 匹配列表中的值
like 模糊查詢
isnull 檢查null
時間類型比較
-
以O(shè)racle默認時間格式查詢(dd-MM月-YY)
SQL> select ename,sal,hiredate from emp where hiredate >'01-1月-82';ENAME SAL HIREDATE ---------- ---------- -------------- SCOTT 3000 19-4月 -87 ADAMS 1100 23-5月 -87 MILLER 1300 23-1月 -82
-
時間轉(zhuǎn)換將字符串轉(zhuǎn)換成時間格式
to_date('1982-01-01','yyyy-MM-dd') 將字符串轉(zhuǎn)換成時間類型
SQL> select ename,sal,hiredate from emp where hiredate >to_date('1982-01-01','yyyy-MM-dd');ENAME SAL HIREDATE ---------- ---------- -------------- SCOTT 3000 19-4月 -87 ADAMS 1100 23-5月 -87 MILLER 1300 23-1月 -82
between...and...
SQL> select ename,sal,hiredate from emp where sal between 1100 and 3000;ENAME SAL HIREDATE ---------- ---------- -------------- ALLEN 1600 20-2月 -81 WARD 1250 22-2月 -81 JONES 2975 02-4月 -81 MARTIN 1250 28-9月 -81 BLAKE 2850 01-5月 -81 CLARK 2450 09-6月 -81 SCOTT 3000 19-4月 -87 TURNER 1500 08-9月 -81 ADAMS 1100 23-5月 -87 FORD 3000 03-12月-81 MILLER 1300 23-1月 -82 已選擇11行型雳。
SQL> select ename,sal,hiredate from emp where sal >= 1100 and sal<= 3000;
ENAME SAL HIREDATE
ALLEN 1600 20-2月 -81 WARD 1250 22-2月 -81 JONES 2975 02-4月 -81 MARTIN 1250 28-9月 -81 BLAKE 2850 01-5月 -81 CLARK 2450 09-6月 -81 SCOTT 3000 19-4月 -87 TURNER 1500 08-9月 -81 ADAMS 1100 23-5月 -87 FORD 3000 03-12月-81 MILLER 1300 23-1月 -82 已選擇11行当凡。
like "%": 0個到多個字符 "_"單個字符
SQL> select ename,sal,hiredate from emp where ename like 'S%';
ENAME SAL HIREDATE ---------- ---------- -------------- SMITH 800 17-12月-80 SCOTT 3000 19-4月 -87
SQL> select ename,sal,hiredate from emp where ename like '__A%';
ENAME SAL HIREDATE ---------- ---------- -------------- BLAKE 2850 01-5月 -81 CLARK 2450 09-6月 -81 ADAMS 1100 23-5月 -87
邏輯操作符
1. and : 條件都為true才為true 否則都為false 2. or : 如果任意一個條件為true都為true,否則返回false 3. not : 條件是false,返回true,如果條件是true就返回false
查詢部門編號20 工種為CLERK
SQL> select ename,job,deptno from emp where deptno = 20 and job='CLERK';ENAME JOB DEPTNO ---------- --------- ---------- SMITH CLERK 20 ADAMS CLERK 20
崗位,MANAGER 工資高于2500
SQL> select ename,job,deptno from emp where sal>2500 or job='MANAGER';
ENAME JOB DEPTNO ---------- --------- ---------- JONES MANAGER 20 BLAKE MANAGER 30 CLARK MANAGER 10 SCOTT ANALYST 20 KING PRESIDENT 10 FORD ANALYST 20 已選擇6行。
工種為CLERK,部門編號不是10,30,40
SQL> select ename,sal,hiredate from emp where deptno not in(10,30,40) and job = 'CLERK'
2 ;ENAME SAL HIREDATE ---------- ---------- -------------- SMITH 800 17-12月-80 ADAMS 1100 23-5月 -87
Order By 子句,對行進行排序
select <cloumn1,...> from table_name
where expression
order by column1[,column2...] [asc | desc]
order by : 表示按列名進行排序
asc 升序(默認)
desc 降序
查詢部門編號30,安裝工資升序排序
SQL> select ename,sal,comm from emp where deptno = 30 order by sal asc;
ENAME SAL COMM
---------- ---------- ----------
JAMES 950
WARD 1250 500
MARTIN 1250 1400
TURNER 1500 0
ALLEN 1600 300
BLAKE 2850
已選擇6行纠俭。
多列排序
SQL> select ename,sal,comm from emp where deptno = 30 order by sal asc,comm desc;
ENAME SAL COMM
---------- ---------- ----------
JAMES 950
MARTIN 1250 1400
WARD 1250 500
TURNER 1500 0
ALLEN 1600 300
BLAKE 2850
已選擇6行沿量。
如果在select語句中同時包含group by,having以及order by ,則必須將order by 放在最后
group by 分組
select <cloumn1,...> from table_name
group by column1[,column2...]
多列分組:
SQL> select job,deptno,count(1) from emp group by job,deptno order by deptno;
JOB DEPTNO COUNT(1)
--------- ---------- ----------
CLERK 10 1
MANAGER 10 1
PRESIDENT 10 1
ANALYST 20 2
CLERK 20 2
MANAGER 20 1
CLERK 30 1
MANAGER 30 1
SALESMAN 30 4
已選擇9行。
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
1 7369 SMITH CLERK 7902 1980-12-17 800 20
2 7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
3 7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
4 7566 JONES MANAGER 7839 1981-4-2 2975 20
5 7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
6 7698 BLAKE MANAGER 7839 1981-5-1 2850 30
7 7782 CLARK MANAGER 7839 1981-6-9 2450 10
8 7788 SCOTT ANALYST 7566 1987-4-19 3000 20
9 7839 KING PRESIDENT 1981-11-17 5000 10
10 7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
11 7876 ADAMS CLERK 7788 1987-5-23 1100 20
12 7900 JAMES CLERK 7698 1981-12-3 950 30
13 7902 FORD ANALYST 7566 1981-12-3 3000 20
14 7934 MILLER CLERK 7782 1982-1-23 1300 10
部門編號分組
10 20 JOB 30
CLARK SMITH CLERK ALLEN
KING JONES MANAGER WARD
MILLER SCOTT ANALYST MARTIN
ADAMS CLERK BLAKE
FORD ANALYST TURNER
JAMES
根據(jù)部門編號工種分組
20 JOB
SMITH CLERK ADAMS CLERK
JONES MANAGER
SCOTT ANALYST FORD ANALYST
having 子句過濾組
顯示平均工資高于2000的部門編號,平均工資,最高工資..
SQL> select deptno,avg(sal) from emp group by deptno having avg(sal) >2000;
DEPTNO AVG(SAL)
---------- ----------
20 2175
10 2916.66667
只保留工資大于1000的行,根據(jù)部門分組,保留部門平均工資高于2000的行
SQL> select deptno,avg(sal) from emp where sal > 1000 group by deptno having avg(sal)>2000 order by deptno;
DEPTNO AVG(SAL)
---------- ----------
10 2916.66667
20 2518.75
使用 distinct 來檢索唯一的列值
去除列中的重復值
SQL> select job,count(1) from emp group by job;
JOB COUNT(1)
--------- ----------
CLERK 4
SALESMAN 4
PRESIDENT 1
MANAGER 3
ANALYST 2
SQL> select distinct job from emp;
JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
使用運算符:
(+,-,,/)
SQL> select ename,sal(1.2) from emp;
ENAME SAL*(1.2)
---------- ----------
SMITH 960
ALLEN 1920
WARD 1500
JONES 3570
MARTIN 1500
BLAKE 3420
CLARK 2940
SCOTT 3600
KING 6000
TURNER 1800
ADAMS 1320
ENAME SAL*(1.2)
---------- ----------
JAMES 1140
FORD 3600
MILLER 1560
已選擇14行冤荆。
DML語句
-
insert
insert into table_name [column1,column2,....] values(value1,value2,....);
insert into table_name [column1,column2,...] select (column1,column2,....) from table_name2;insert into : 指明要插入表中的字段
values : 插入相應(yīng)字段中的值
SQL> create table dept4 as select * from dept where 1!=1;表已創(chuàng)建朴则。
Update
update table_name set column1 = value1[,column2=value2,....] where expression;
SQL> update newemp set sal = sal*1.1 ;
已更新14行钓简。
SQL> select ename,sal from newemp;
ENAME SAL
---------- ----------
SMITH 880
ALLEN 1760
WARD 1375
JONES 3272.5
MARTIN 1375
BLAKE 3135
CLARK 2695
SCOTT 3300
KING 5500
TURNER 1650
ADAMS 1210
ENAME SAL
---------- ----------
JAMES 1045
FORD 3300
MILLER 1430
已選擇14行。
SQL> update newemp set sal = sal*1.2 where ename = 'WARD' ;
已更新 1 行撤蚊。
SQL> select ename,sal from newemp;
ENAME SAL
---------- ----------
SMITH 880
ALLEN 1760
WARD 1650
JONES 3272.5
MARTIN 1375
BLAKE 3135
CLARK 2695
SCOTT 3300
KING 5500
TURNER 1650
ADAMS 1210
ENAME SAL
---------- ----------
JAMES 1045
FORD 3300
MILLER 1430
已選擇14行侦啸。
-
delete
delete from table_name [where expression];使用delete語句刪除表中的數(shù)據(jù),并不能釋放被善用的數(shù)據(jù)塊空間,它只是把哪些被刪除的數(shù)據(jù)塊標記為 Unused,將來還可以回退(rollback)操作.
-
merge
把數(shù)據(jù)從一個表中復制到另一個表,插入新數(shù)據(jù)或替換掉舊數(shù)據(jù).merge into table11 using table2 on expression
when matched then update..
when not matched then insert ..;SQL> merge into newemp ne
2 using emp e
3 on (ne.empno = e.empno)
4 when matched then
5 update set ne.sal = e.sal
6 when not matched then
7 insert values(e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno);14 行已合并。
表連接查詢
連接查詢是指將兩個或兩個以上的表或試圖的查詢.在實際應(yīng)用中,查詢單個表可能無法滿足需要.
-
簡單連接
使用逗號將兩個或多個表進行連接.自然連接
自然連接是指使用相等比較(=)指定連接條件,主要用于檢索主從表之間的關(guān)聯(lián)數(shù)據(jù)
select table1.column,table2.column... from table1,table2
where table1.column1 = table2.column2;顯示部門名稱,員工名稱,工資 只顯示部門編號為10的
表的別名:
SQL> select dname as 部門名稱,ename "員工姓名",sal 員工工資 from dept d,emp e where e.deptno = d.deptno and d.deptno = 10;
部門名稱 員工姓名 員工工資 -------------- ---------- ---------- ACCOUNTING CLARK 2450 ACCOUNTING KING 5000 ACCOUNTING MILLER 1300
內(nèi)連接
內(nèi)連接用于返回滿足條件的記錄
select table1.column,table2.column...
from table1 [inner] join table2
on table1.column1 = table2.column2;
SQL> select d.dname,e.ename from dept d inner join emp e on d.deptno = e.deptno;
DNAME ENAME
-------------- ----------
SALES ALLEN
SALES WARD
RESEARCH JONES
SALES MARTIN
SALES BLAKE
ACCOUNTING CLARK
RESEARCH SCOTT
ACCOUNTING KING
SALES TURNER
RESEARCH ADAMS
SALES JAMES
DNAME ENAME
-------------- ----------
RESEARCH FORD
ACCOUNTING MILLER
已選擇13行。
外連接
select table1.column,table2.column...
from table1 [left | right] join table2
on table1.column1 = table2.column2;
外連接是內(nèi)連接的擴展,它不僅會返回滿足條件的所有記錄,也會返回不滿足條件的記錄,如果連接表中(主表)有一列空值,也會被顯示.
SQL> select d.dname,e.ename from dept d left join emp e on d.deptno = e.deptno;
DNAME ENAME
-------------- ----------
SALES ALLEN
RESEARCH JONES
SALES MARTIN
SALES BLAKE
ACCOUNTING CLARK
RESEARCH SCOTT
ACCOUNTING KING
SALES TURNER
RESEARCH ADAMS
SALES JAMES
DNAME ENAME
-------------- ----------
RESEARCH FORD
ACCOUNTING MILLER
吃飯部
OPERATIONS
已選擇15行服赎。
SQL> select d.dname,e.ename from dept d ,emp e where d.deptno = e.deptno(+);
DNAME ENAME
-------------- ----------
SALES ALLEN
SALES WARD
RESEARCH JONES
SALES MARTIN
SALES BLAKE
ACCOUNTING CLARK
RESEARCH SCOTT
ACCOUNTING KING
SALES TURNER
RESEARCH ADAMS
SALES JAMES
DNAME ENAME
-------------- ----------
RESEARCH FORD
ACCOUNTING MILLER
吃飯部
OPERATIONS
已選擇15行。
自連接
同一張表之間的連接查詢
SQL> select m.ename||' 是 '||e.ename||' 領(lǐng)導!' from emp m,emp e where m.mgr = e.empno;
M.ENAME||'是'||E.ENAME||'領(lǐng)導!
------------------------------
FORD 是 JONES 領(lǐng)導!
SCOTT 是 JONES 領(lǐng)導!
JAMES 是 BLAKE 領(lǐng)導!
TURNER 是 BLAKE 領(lǐng)導!
MARTIN 是 BLAKE 領(lǐng)導!
WARD 是 BLAKE 領(lǐng)導!
ALLEN 是 BLAKE 領(lǐng)導!
MILLER 是 CLARK 領(lǐng)導!
ADAMS 是 SCOTT 領(lǐng)導!
CLARK 是 KING 領(lǐng)導!
BLAKE 是 KING 領(lǐng)導!
M.ENAME||'是'||E.ENAME||'領(lǐng)導!
------------------------------
JONES 是 KING 領(lǐng)導!
SMITH 是 FORD 領(lǐng)導!
已選擇13行。
SQL> select m.ename,e.ename from emp m,emp e where m.mgr = e.empno;
ENAME ENAME
---------- ----------
FORD JONES
SCOTT JONES
JAMES BLAKE
TURNER BLAKE
MARTIN BLAKE
WARD BLAKE
ALLEN BLAKE
MILLER CLARK
ADAMS SCOTT
CLARK KING
BLAKE KING
ENAME ENAME
---------- ----------
JONES KING
SMITH FORD
已選擇13行永高。
交叉連接(笛卡爾積)
數(shù)據(jù)庫事務(wù)
事務(wù)的開始于結(jié)束:
連接到數(shù)據(jù)庫上,并執(zhí)行一條DML語句(insert,update或delete)
前一個事務(wù)結(jié)束后,又輸入一個DML語句.
事務(wù)(Transaction) 是由一組(多條)SQL語句組成的最小邏輯工作單元.
事務(wù)是為了保證數(shù)據(jù)的一致性.
事務(wù)的提交和回滾
要永久性的記錄事務(wù)中SQL語句的結(jié)果,需要執(zhí)行commit語句,從而提交事務(wù).
事務(wù)結(jié)束:
執(zhí)行commit或rollback語句.
執(zhí)行一條DDL語句,create table,都會自動提交commit;
斷開數(shù)據(jù)庫的連接,退出sqlplus時,輸入exit的時候 都會被commit.
如果sqlplus 被意外終止了,計算機藍屏,會自動執(zhí)行rollback語句.
執(zhí)行一條DML語句,該語句失敗,這種情況,會執(zhí)行rollback語句;
只有DML存在事務(wù)的概念,DDL和DCL沒有事務(wù)的概念,執(zhí)行就被提交.
設(shè)置保存點:
保存點就是事務(wù)中標記.把一個較長的事務(wù)分為多個較短的事務(wù).可以回滾到制定的保存點.
savepoint savepoint_name;
事務(wù)的ACID特性:
- 事務(wù)的概念命爬;事務(wù)是把對數(shù)據(jù)庫的一系列操作都看做一個整體饲宛,要么全部成功艇抠,要么全部失敗家淤,利用事務(wù)我們可以保證數(shù)據(jù)庫的完整性絮重,
- 原子性(Atomic) 事務(wù)是原子的,這就是說事務(wù)中包含的所有SQL語句都是一個不可分割的工作單元.
- 一致性(Consist) 事務(wù)必須確保數(shù)據(jù)庫的狀態(tài)保存一致,事務(wù)開始時,數(shù)據(jù)庫的狀態(tài)是一致的,事務(wù)結(jié)束時,數(shù)據(jù)庫的狀態(tài)也必須是一致的.
- 隔離性(Isolated) 多個事務(wù)可以獨立運行,而不會彼此影響.
- 持久性(Durable) 一旦事務(wù)被提交后,數(shù)據(jù)庫的變化就會被永久記錄,即使數(shù)據(jù)庫軟件崩潰.
并發(fā)事務(wù):
數(shù)據(jù)庫支持多個用戶同時對數(shù)據(jù)庫進行交互,每個用戶都可以同時運行自己的事務(wù),這種事務(wù)就稱為并發(fā)事務(wù)
用戶同時運行多個事務(wù),而這些事務(wù)對同一張表產(chǎn)生影響.那么這些事務(wù)是互相獨立的.
直達執(zhí)行一條commit才會彼此產(chǎn)生影響.
事務(wù)鎖:
當多個事務(wù)對同一條數(shù)據(jù)進行操作的時候,就會產(chǎn)生事務(wù)鎖.
第二個事務(wù)必須等待第一個事務(wù)釋放該鎖(提交/回滾);
并發(fā)事務(wù)會產(chǎn)生的問題:
事務(wù)隔離級別:
是一個事務(wù)對數(shù)據(jù)庫的修改與并行的另外一個事務(wù)的隔離程度.
兩個并發(fā)事務(wù)T1和T2正在訪問相同的行數(shù)據(jù).
幻象讀取:
事務(wù)T1讀取一條指定的where子句返回的結(jié)果集.然后事務(wù)T2新插入一行數(shù)據(jù),這行
恰好可以滿足T1查詢的where條件.然后T1又使用相同的查詢再次對表進行查詢,但
此時看到了事務(wù)T2剛才插入的新行,這個新行就稱為"幻象"
不可重復讀:
事務(wù)T1讀取一行數(shù)據(jù),緊接著T2修改了T1剛才讀取的哪一行數(shù)據(jù).然后T1再次讀取的時候,
發(fā)現(xiàn)剛才讀取的結(jié)果不同的了.這種現(xiàn)象稱為 " 不可重復讀".
臟讀:
事務(wù)T1更新了一行數(shù)據(jù),但是并沒有提交所修改的內(nèi)容,事務(wù)T2讀取更新后的行,然后T1回滾操作,
取消了剛才所做的修改,先T2所讀取的行就無效了.這種現(xiàn)象"臟讀".
因為在T2讀取這行數(shù)據(jù)的時候,T1所做的修改并沒有提交.
隔離級別 從低到高
read uncommitted 幻讀,不可重復讀和臟讀都允許
read committed 允許幻讀和不可重復讀,但是不允許臟讀
reoeatabke read 允許幻讀,但是不允許不可重復讀和臟讀
serializable 幻象讀,不可重復讀和臟讀都不允許
Oracle 數(shù)據(jù)庫只支持read committed和serializable兩種事務(wù)隔離級別.
set transaction isolation level
{
read committed|
serializable
}