分組函數
- AVG(平均值)
- SUM(合計)
- MIN(最小值)
- MAX(最大值)
- COUNT(計數)函數
例:計算不重複的記錄總數
SELECT COUNT(DISTINCT department_id) FROM employees
- 使用GROUP BY子句將表中的數據分成若干組
----求出emp表中的各部門的平均工資,按照平均工資從高往低排序
select a.deptno,avg(a.sal) avg_sal from emp a group by a.deptno order by avg_sal desc;
- 在GROUP BY子句中包含多個列
----求出emp表中的不同部門,不同職位的平均工資
select a.deptno,avg(a.sal) avg_sal,a.job from emp a group by a.deptno,a.job;
- 使用 HAVING 過濾分組:
①, 行已經被分組
②, 使用了組函數
③, 滿足HAVING 子句中條件的分組將被顯示
----求出emp表中的不同部門,不同職位的平均工資且平均工資大於1000
select a.deptno,avg(a.sal) avg_sal,a.job from emp a having avg(a.sal) > 1000 group by a.deptno,a.job;
子查詢
- 子查詢 (內查詢) 在主查詢之前一次執行完成。
- 子查詢的結果被主查詢(外查詢)使用 。
----查詢比ALLEN工資高的職工名字
select a.ename
from emp a
where a.sal > (select sal from emp where ename = 'ALLEN');
①,子查詢要包含在括號內。
②, 將子查詢放在比較條件的右側。
③,單行操作符對應單行子查詢,多行操作符對應多行子查詢。
- 只返回一行
- 使用單行比較操作符
- 返回多行
- 使用多行比較操作符
----根據部門編號分組,查詢部門中大於某一部門的平均工資的部門信息
select department_id
from employees
group by department_id
having avg(salary) >= any (select avg(salary)
from employees
group by department_id);
創建和管理表
---- 查看用戶定義的表
SELECT table_name FROM user_tables;
---- 查看用戶定義的各種數據庫
SELECT DISTINCT object_type FROM user_objects;
---- 查看用戶定義的表, 視圖, 同義詞和序列
SELECT * FROM user_catalog;
- 命名規則
- 語法
CREATE TABLE student (
sno NUMBER(20),
sname VARCHAR2(14),
sclass VARCHAR2(13)
); - 數據類型
- 使用子查詢創建表
create table emp1 as select * from emp;
創建的emp2是空表:
create table emp2 as select * from emp where 1=2;
- ALTER TABLE 語句
追加新的列:
alter table student add (sno varchar2(16));
修改現有的列:
alter table student modify (sno varchar2(30));
爲新追加的列定義默認值:
alter table student modify (sno varchar2(30) default '000');
刪除一個列:
alter table student drop column sno;
重命名錶的一個列名:
alter table student rename column sno to sid;
①,數據和結構都被刪除
②,所有正在運行的相關事務被提交
③,所有相關索引被刪除
④,DROP TABLE 語句不能回滾
DROP TABLE STUDENT;
- TRUNCATE TABLE 語句:
①,刪除表中所有的數據
②,釋放表的存儲空間
TRUNCATE TABLE student;
- TRUNCATE語句不能回滾
- 執行RENAME語句改變表, 視圖, 序列, 或同義詞的名稱
RENAME student TO student1;
數據處理
- INSERT 語句語法
INSERT INTO student (stuid, sname, gender) VALUES (11, 'Tommey周', '男');
- 在SQL 語句中使用 & 變量指定列值,& 變量放在VALUES子句中
INSERT INTO student (stuid) VALUES ('&stuid');
- 從其它表中拷貝數據
INSERT INTO student
(id, name, age, sclass)
SELECT id, last_name, age, sclass FROM teacher
- UPDATE 語句語法
update student set sname = 'Tommey周1' where stuid='1'
- DELETE 語句(如果條件省略,則刪除表中的所有數據)
DELETE FROM STUDENT WHRER STUID ='1'
- 刪除中的數據完整性錯誤(應先刪外鍵)
You cannot delete a row that contains a primary key that is used as a foreign key in another table.
①,確保數據完整性。
②,數據改變被提交之前預覽。
③,將邏輯上相關的操作分組。
- 使用 SAVEPOINT 語句在當前事務中創建保存點,使用 ROLLBACK TO SAVEPOINT 語句回滾到創建的保存點。
update student set sname = 'Tommey周1' where stuid='1';
SAVEPOINT update_done;
ROLLBACK TO update_done;
- 會話異常結束或系統異常會導致自動回滾。
- 提交或回滾前的數據狀態
改變前的數據狀態是可以恢復的,執行 DML 操作的用戶可以通過 SELECT 語句查詢之前的修正其他用戶不能看到當前用戶所做的改變,直到當前用戶結束事務。DML語句所涉及到的行被鎖定, 其他用戶不能操作。 - 提交後的數據狀態
數據的改變已經被保存到數據庫中。改變前的數據已經丟失。所有用戶可以看到結果。鎖被釋放,其他用戶可以操作涉及到的數據。所有保存點被釋放。