oracle之子查詢、創建用戶、創建表、約束
子查詢
子查詢可以分為單行子查詢和多行子查詢
單行子查詢
[1] 將一個查詢的結果作為另外一個查詢的條件來使用
特點:
子查詢在主查詢前執行一次
主查詢使用子查詢的結果
1 SELECT * FROM EMP 2 WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME=‘CLARK‘);
[2] 子查詢可以作為insert語句的值來使用
1 -- 今天來了一個新員工,將他添加到與SCOTT同一個部門 2 3 INSERTINTO EMP (EMPNO, ENAME, DEPTNO) 4 VALUES(1001, ‘ALEX‘, (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 FROMEMP) 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之子查詢、創建用戶、創建表、約束