1. 程式人生 > >oracle之子查詢、創建用戶、創建表、約束

oracle之子查詢、創建用戶、創建表、約束

pre 條件 不為 varchar 作用 rim 修改 特點 刪除一個用戶

子查詢

子查詢可以分為單行子查詢和多行子查詢

單行子查詢

  [1] 將一個查詢的結果作為另外一個查詢的條件來使用

  特點:

    子查詢在主查詢前執行一次

    主查詢使用子查詢的結果

1 SELECT * FROM EMP 
2 WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME=CLARK);

  [2] 子查詢可以作為insert語句的值來使用

1 -- 今天來了一個新員工,將他添加到與SCOTT同一個部門
2 
3 INSERT
INTO EMP (EMPNO, ENAME, DEPTNO) 4 VALUES(1001ALEX, (SELECT DEPTNO FROM EMP WHERE ENAME=SCOTT));

  [3] 子查詢可以作為update的條件或者修改的值來使用

1 -- 作為修改的值
2 -- 將新員工ALEX的工作修改為與‘SMITH‘的工作相同
3 UPDATE EMP SET JOB=(SELECT JOB FROM EMP WHERE ENAME=SMITH) WHERE ENAME=ALEX;
4 
5 -- 作為條件
6 -- 將比FORM工資低的員工的薪資都加1000塊
7 UPDATE EMP SET SAL=SAL+1000 WHERE SAL<(SELECT SAL FROM EMP WHERE ENAME=FROM);

  [4] 子查詢可以作為delete的條件使用

1 DELETE EMP WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME=FORM);

  [5] 子查詢的結果可以作為一個表來使用

1 -- 查詢員工的編號,姓名,經理姓名
2 SELECT E.ENAME, E.EMPNO, M.MNAME
3 FROM EMP E, (SELECT EMPNO, ENAME FROM
EMP) M 4 WHERE E.MGR = M.MNAME;

多行子查詢

子查詢的結果返回是 多行數據
  all:和子查詢返回的所有值比較

1 -- 查詢工資低於任何一個‘CLERK‘崗位的工資的雇員信息
2 
3 SELECT * FROM EMP WHERE SAL < ANY(SELECT SAL FROM EMP WHERE JOB=CLERK);

  any:和子查詢返回的任意一個值比較

1 -- 查詢工資比所有的‘SALESMAN‘職位都高的雇員的編號,名字和工資
2 SELECT EMPNO, ENAME, SAL FROM EMP WHERE SAL > ALL(SELECT SAL FROM EMP WHERE JOB = SALESMAN);

  in :等於列表中的任何一個

1 -- 查詢部門20中的職務同部門10的雇員一樣的雇員信息
2 SELECT * FROM EMP WHERE JOB IN(SELECT JOB FROM EMP WHERE DEPTNO = 10) AND DEPTNO = 20;

創建用戶

創建

1 -- CREATE USER 用戶名 IDENTIFIED BY 密碼
2 -- 使用SCOTT用戶無法創建,因為權限不足,登錄sys賬戶創建即可
3 CREATE USER ABC IDENTIFIED BY 123;

給用戶賦予權限 ——權限是執行特定類型的sql命令或者訪問其他對象的權利

 1 -- 賦予ABC臨時用戶
 2 GRANT CONNECT TO ABC;   -- CONNECT: 臨時用戶
 3 
 4 -- 給ABC賦予DBA角色   角色是具有名稱的一組權限的組合
 5 GRANT DBA TO ABC;
 6 
 7 -- 撤銷權限
 8 REVOKE CONNECT FROM ABC;   -- 撤銷ABC的臨時權限
 9 
10 -- 刪除一個用戶
11 DROP USER ABC;   -- 刪除用戶ABC

系統常用的預定義角色

CONNECT: 臨時用戶
RESOURCE: 更為可靠的正式用戶
DBA: 數據庫管理員角色,擁有管理員的最高權限

創建表

 1 /*
 2     CREATE TABLE 表名(
 3         列名 數據類型 [默認  表達式], ...
 4     );
 5 */
 6 
 7 -- 創建一個表
 8 CREATE TABLE STUDENT(
 9     SNO NUMBER(6),
10     NAME VARCHAR2(20),
11     SEX VARCHAR2(2),
12     AGE VARCHAR2(3) 
13 );

對表的一些常用操作

 1 -- 向已有的表中插入一個列
 2 ALTER TABLE STUDENT ADD ADDRESS VARCHAR2(20);  -- 插入ADDRESS列
 3 
 4 -- 將已有表中的列刪除
 5 ALTER TABLE STUDENT DROP COLUMN SNO;  -- 刪除SNO列
 6 
 7 -- 將已有表中的列進行修改(默認只對新添加的數據有效,對已經添加的數據無效)
 8 ALTER TABLE STUDENT MODIFY(SEX VARCHAR2(4) DEFAULT );
 9 
10 -- 對已有表中的列重命名
11 ALTER TABLE STUDENT RENAME COLUMN NAME TO SNAME;  -- 將NAME列的名字改為SNAME
12 
13 -- 給表重命名
14 RENAME STUDENT TO STU;  -- 將表STUDENT重命名為STU

約束

數據完整性約束
1.表的數據有一定的取值範圍和聯系,多表之間的數據有時也有一定的參照關系。
2.在創建表和修改表時,可通過定義約束條件來保證數據的完整性和一致性。
3.約束條件是一些規則,在對數據進行插入、刪除和修改時要對這些規則進行驗證,從而起到約束作用。

完整性約束分類
域完整性約束(非空not null,檢查check)字段約束
實體完整性約束(唯一unique,主鍵primary key) 行和行之間的約束
參照(引用)完整性約束(外鍵foreign key) 表和表之間的約束

主鍵約束 (primary key) PK_表名_字段名
要求主鍵類數據唯一,並且不允許為空,主鍵可以包含表的一列或多列,多列組成的主鍵稱之為-復合主鍵
唯一約束(unique) UK_表名_字段名
要求該列值唯一,允許為空,而且null可以是多個
檢查約束 (check) CK_表名_字段名
某列取值範圍顯示,格式限制等,如年齡拘束,郵件限制 email like ‘%@%‘ --length (pwd) =6
非空約束(not null) NN_表名_字段名
某列內容(值)不為空
外鍵約束(foreign key) FK_表名_字段名
用於兩個表之間建立關系,需要制定引用主表的那列,外鍵同創是用來約束兩個表之間的數據關系
定義外鍵的那張表稱之為子表,另一張表稱之為主表,在表的創建過程中,應該先創建主表,後創建子表

在創建表時創建約束

1 CREATE TABLE STU(
2     STUNO NUMBER(3) CONSTRAINT PK_STU_ID PRIMARY KEY,  -- 學號長度是3,為主鍵約束,約束名是PK_STU_ID
3     STUNAME VARCHAR2(20) NOT NULL  -- 名字不能為空
4 );
5 
6 -- 查看表中的約束
7 SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = STU;

先創建表,然後再添加約束

1 CREATE TABLE STU(
2     STUNO NUMBER(3),
3     STUNAME VARCHAR2(20)
4 );    
5 
6 -- 添加主鍵約束
7 ALTER TABLE STU ADD CONSTRAINT PK_STU_STUNO PRIMARY KEY(STUNO);

添加復合主鍵

 1 -- 創建表
 2 CREATE TABLE STU(
 3     STUNO NUMBER(3),
 4     STUNAME VARCHAR2(20)
 5 );
 6 
 7 -- 添加符合主鍵
 8 ALTER TABLE STU ADD CONSTRAINT PK_STU_STUNO PRIMARY KEY(STUNO, STUNAME);
 9 
10 /*
11     根據主鍵唯一的性質,往STU裏面添加的數據不能有STUNO和STUNAME同 
12     時一致的情況, 但是單個STU或STUNAME相同時允許的
13 */

創建一張表,並創建主鍵、唯一、非空、檢查約束

1 CREATE TABLE STUDENT(
2     STUNO NUMBER(4) CONSTRAINT PK_STU_STUNO PRIMARY KEY, -- 主鍵約束
3     SNAME VARCHAR2(10) CONSTRAINT NN_STU_SNAME NOT NULL,  -- 非空
4     SEX VARCHAR2(3) DEFAULT ,  -- 默認值
5     AGE NUMBER(3) CONSTRAINT CK_STU_AGE CHECK(AGE BETWEEN 18 AND 30),  -- CHECK約束,添加的年齡必須是18到30歲的
6     EMAIL VARCHAR2(20) CONSTRAINT CK_STU_EMAIL CHECK(EMAIL LIKE %@%),  -- CHECK約束,添加的郵箱中必須有@符號
7     PSWD VARCHAR2(10) CONSTRAINT CK_STU_PSWD CHECK(LENGTH(PSWD) >= 6)  -- CHECK約束,添加的密碼必須大於等於6位
8 );

外鍵

 1 -- 創建一張表作為主表
 2 CREATE TABLE GRADE(
 3     GRADEID NUMBER(2) CONSTRAINT PK_GRADEID PRIMARY KEY, -- 添加主鍵約束
 4     GRADENAME VARCHAR2(20) NOT NULL
 5 );
 6 
 7 -- 再創建一張表作為子表
 8 CREATE TABLE STUDENT(
 9     STUNO NUMBER(4) CONSTRAINT PK_STU_STUNO PRIMARY KEY,
10     SNAME VARCHAR2(10) CONSTRAINT NN_STU_SNAME NOT NULL,
11     SEX VARCHAR2(3) DEFAULT .
12     CLASSID NUMBER(10)
13 );
14 
15 /*
16     添加外鍵,將兩張表聯系起來
17     將STUDENT表的CLASSID與GRADE表的GRADEID項建立連接
18     所以CLASSID是STUDENT表的外鍵
19 */
20 ALTER TABLE STUDENT ADD CONSTRAINT FK_STUDENT_CLASSID FOREIGN KEY(CLASSID) REFERENCE GRADE(GRADEID);

oracle之子查詢、創建用戶、創建表、約束