(3)Oracle——————分組函數,子查詢,創建和管理表和數據處理

1,分組函數

2,子查詢

3,創建和管理表

4,數據處理

分組函數

1,常用的函數
  • AVG(平均值)
  • SUM(合計)
  • MIN(最小值)
  • MAX(最大值)
  • COUNT(計數)函數

例:計算不重複的記錄總數

SELECT COUNT(DISTINCT department_id) FROM   employees
2,分組數據
  • 使用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; 
3,過濾分組
  • 使用 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; 

子查詢

1,子查詢的使用
  • 子查詢 (內查詢) 在主查詢之前一次執行完成。
  • 子查詢的結果被主查詢(外查詢)使用 。

----查詢比ALLEN工資高的職工名字

select a.ename
  from emp a
 where a.sal > (select sal from emp where ename = 'ALLEN');
2,使用子查詢應注意的事項:

        ①,子查詢要包含在括號內。

        ②, 將子查詢放在比較條件的右側。

        ③,單行操作符對應單行子查詢,多行操作符對應多行子查詢。

3,單行子查詢:
  • 只返回一行
  • 使用單行比較操作符
    在這裏插入圖片描述
4,多行子查詢:
  • 返回多行
  • 使用多行比較操作符
    在這裏插入圖片描述
    ----根據部門編號分組,查詢部門中大於某一部門的平均工資的部門信息
select department_id
  from employees
 group by department_id
having avg(salary) >= any (select avg(salary)
                             from employees
                            group by department_id);

創建和管理表

1,常見的數據庫對象

在這裏插入圖片描述

2,查詢數據字典

---- 查看用戶定義的表

SELECT table_name FROM user_tables;

---- 查看用戶定義的各種數據庫

SELECT DISTINCT object_type FROM user_objects;

---- 查看用戶定義的表, 視圖, 同義詞和序列

SELECT * FROM user_catalog;
  • 命名規則
    在這裏插入圖片描述
3,創建表
  • 語法
    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;
4,修改表
  • 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;
5,刪除表

①,數據和結構都被刪除
②,所有正在運行的相關事務被提交
③,所有相關索引被刪除
④,DROP TABLE 語句不能回滾

DROP TABLE STUDENT;
6,清空表
  • TRUNCATE TABLE 語句:

    ①,刪除表中所有的數據
    ②,釋放表的存儲空間

  TRUNCATE TABLE student;
  • TRUNCATE語句不能回滾
7,改變對象的名稱
  • 執行RENAME語句改變表, 視圖, 序列, 或同義詞的名稱
 RENAME student TO student1;

數據處理

1,插入數據
  • INSERT 語句語法
   INSERT INTO student (stuid, sname, gender) VALUES (11, 'Tommey周', '男');
2,創建腳本
  • 在SQL 語句中使用 & 變量指定列值,& 變量放在VALUES子句中
INSERT INTO student (stuid) VALUES ('&stuid');

在這裏插入圖片描述

  • 從其它表中拷貝數據
INSERT INTO student
  (id, name, age, sclass)
  SELECT id, last_name, age, sclass FROM teacher
3,更新數據
  • UPDATE 語句語法
   update student set sname = 'Tommey周1' where stuid='1'
4,刪除數據
  • 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.
5,COMMIT和ROLLBACK語句的優點

①,確保數據完整性。
②,數據改變被提交之前預覽。
③,將邏輯上相關的操作分組。

  • 使用 SAVEPOINT 語句在當前事務中創建保存點,使用 ROLLBACK TO SAVEPOINT 語句回滾到創建的保存點。
update student set sname = 'Tommey周1' where stuid='1'; 
SAVEPOINT update_done;
ROLLBACK TO update_done;
  • 會話異常結束或系統異常會導致自動回滾。
  • 提交或回滾前的數據狀態
    改變前的數據狀態是可以恢復的,執行 DML 操作的用戶可以通過 SELECT 語句查詢之前的修正其他用戶不能看到當前用戶所做的改變,直到當前用戶結束事務。DML語句所涉及到的行被鎖定, 其他用戶不能操作。
  • 提交後的數據狀態
    數據的改變已經被保存到數據庫中。改變前的數據已經丟失。所有用戶可以看到結果。鎖被釋放,其他用戶可以操作涉及到的數據。所有保存點被釋放。

下一章,(4)Oracle——————約束,視圖,序列和索引

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章