我的SQL筆記&一些練習題(一)
在Windows平臺下需保證 Oracle server xe 和 Oraclelistener 服務正常運行才可以連接到數據庫
MySQL數據庫使用的端口為:3306
連接數據庫可以使用CML模式,或者使用Navicat,一個第三方數據庫管理工具,支持連接Oracle SQL,MySQL,Windows SQL Server
---------------------------------
SQL語句的分類:
SQL語言共分為四大類:數據查詢語言DQL,數據操縱語言DML,數據定義語言DDL,數據控制語言DCL。
1. 數據查詢語言DQL
數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE
子句組成的查詢塊:
SELECT <字段名表>
FROM <表或視圖名>
WHERE <查詢條件>
2 .數據操縱語言DML
數據操縱語言DML主要有三種形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 刪除:DELETE
3. 數據定義語言DDL
數據定義語言DDL用來創建數據庫中的各種對象-----表、視圖、
索引、同義詞、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
表/視圖/索引/同義詞/簇
DDL操作是隱性提交的!不能rollback
4. 數據控制語言DCL
數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制
數據庫操縱事務發生的時間及效果,對數據庫實行監視等。如:
1.GRANT:授權。
2. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。
回滾---ROLLBACK
回滾命令使數據庫狀態回到上次最後提交的狀態。其格式為:
SQL>ROLLBACK;
3.COMMIT [WORK]:提交。
在數據庫的插入、刪除和修改操作時,只有當事務在提交到數據
庫時才算完成。在事務提交前,只有操作數據庫的這個人才能有權看
到所做的事情,別人只有在最後提交完成後才可以看到。
提交數據有三種類型:顯式提交、隱式提交及自動提交。
下面分別說明這三種類型。
(1) 顯式提交
用COMMIT命令直接完成的提交為顯式提交。其格式為:
SQL>COMMIT;
(2) 隱式提交
用SQL命令間接完成的提交為隱式提交。這些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自動提交
若把AUTOCOMMIT設置為ON,則在插入、修改、刪除語句執行後,
系統將自動進行提交,這就是自動提交。其格式為:
SQL>SET AUTOCOMMIT ON;
---------------------------------
Oracle常見的數據類型:
Varchar2(N):長度可變,最小1個字符,最大4000字符
Char(N):長度固定,最小1個字符,最大2000字符
Number(N, M):數值類型,N的長度為1-38字符之間,M不超過N
DATE:日期類型
Long:字符串類型,最大可以存儲2G可變長度字符類型(不常用)
Long raw:字符串類型,最大可以存儲2G可變長度的二進制字符 (不常用 )
CLOB: 最大可以存儲4G可變長度字符類型
BLOB:最大可以存儲4G可變長度二進制字符
---------------------------------
Oracle對象命名規則
1:必須以字母開頭,不能使用數字開頭,長度在1-30位字符間
2:對象名可以出現的字符為字母(大小寫都可),數字,下劃線 _ $ #
3:同一個Oracle服務器用戶所擁有的對象名不可以重復
4:名字不能是Oracle保留字(關鍵字)
5:名字中字母大小寫不敏感
---------------------------------
建立數據庫要遵循的三個範式
1NF:表中列不可分割
2NF:表中每行數據不可重復
3NF:當兩張表有主外鍵關系,其中一張表不能出現另一張表的非主鍵列
---------------------------------
數據庫事務ACID基本概念(原子性、一致性、隔離性、持久性)
1.原子性(Atomicity):事務要麽成功(可見),要麽失敗(不可見)。不存在事務部分成功的情況。
2.一致性(Consistency):數據庫在事務開始前和結束後都應該是一致的。
3.隔離性(Isolation):一個事務不會看到另外一個還未完成的事務產生的結果。每個事務就像在單獨、隔離的環境下運行一樣。
4.持久性(Durability):成功提交的事務,數據是持久保留,不會因為系統失敗而丟失。
---------------------------------
建立一個簡單的Stuent表
CREATE TABLE student --CREATE TABLE 創建表格 ( stuNo VARCHAR2(10) --學號字符串類型 ,stuName VARCHAR2(30) --學員姓名,字符串類型 ,stuAge NUMBER(3) --學員年齡,整數類型,3位長度 ,stuScore NUMBER(3, 1) --學員成績,浮點類型 ); /*為student表添加數據*/ INSERT INTO student --插入數據到表中 VALUES('TX1001', 'TOM', 20, 99.5); /* 查詢student表中數據*/ SELECT stuNo, StuName, StuAge FROM student; SELECT * FROM student; /*刪除student表*/ DROP TABLE student;
SQL關鍵字
AS:用於為字段取別名
DISTINCT:去除重復記錄,用於查詢語句
/*查詢員工從事工作類型*/ SELECT DISTINCT empDep As 部門 FROM emp; /* 去除重復記錄 */ SELECT DISTINCT eAge FROM employee;
數據庫數據約束
Not null :數據非空
Unique:唯一約束
Primary key:主鍵約束(非空+唯一,一個表格只能最多有一個主鍵約束)
Foreign key:外鍵約束(通過此約束為兩表建立關系)
Check:檢查約束 例:CHECK(tAge >10 AND tAge <30)
Oracle比較運算符:
=等於,>大於, <小於, >=大於等於,<=小於等於 <>不等於 Oracle其他關鍵字及運算符 AND OR NOT BETWEEN ......AND /* WHERE tAge BETWEEN '10' AND '30';數字類型 */ IN, NOT IN IS NULL, (IS NOT NULL)
示例:
/*查詢參加工作時間在1997-7-9之後,不從事IT_PROG工作的員工信息*/ SELECT * FROM emp WHERE hireDate > '09-9月-1997' AND empDep NOT IN('IT_PROG'); 或者 SELECT * FROM emp WHERE hireDate > '09-9月-1997' AND empDep NOT IN('IT_PROG');
數據庫中的模糊查詢
LIKE(模糊查詢需要加 % ), NOT LIKE
小% --表示‘小‘開頭的模糊匹配
%明 --表示’明‘結尾的模糊匹配
%小明% --表示字符內包含’小明‘即匹配
特殊字符:%(任意多個字符) _(代表一個字符)
排序查詢:
ORDER BY…ASC(升序)默認情況,此關鍵字可不寫
DESC(降序)排序 ORDER BY tAge DESC;
ORDER BY 後面可出現字段。表達式和別名 ORDER BY tAge;
SELECT * FROM emp ORDER BY empId DESC; --DESC降序排序
ALTER關鍵字,對表進行修改
ALTER TABLE emp ADD(列 字符格式); (address VARCHAR(100)); --表示添加字段 ALTER TABLE emp MODIFY(列 字符格式); (address VARCHAR(50)); --修改字段 ALTER TABLE emp DROP CLOUMN address; --刪除字段
RENAME 關鍵字
RENAME emp TO employee; --把emp表修改為employee
TRUNCATE 關鍵字 刪除表內數據
TRUNCATE TABLE employee --刪除表內所有數據
CONSTRAINT 約束關鍵字
用於建立約束
ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 增加的約束類型 (列名)
/*主外鍵關系一對多*/ CREATE TABLE student ( stuId VARCHAR2(10) PRIMARY KEY ----行級約束 ,Name VARCHAR2(30) NOT NULL ,age VARCHAR2(3) NOT NULL ,address VARCHAR2(100) ,subId VARCHAR2(10) NOT NULL /*創建外鍵將本表subId字段的取值引用(主表)至subject表的subId列*/ ,CONSTRAINT fk_student_subId FOREIGN KEY(subid) REFERENCE subject(subId) --表級約束 ); ------------------------- /*主外鍵關系多對多*/ CREATE TABLE student ( stuId VARCHAR2(10) PRIMARY KEY ----行級約束 ,Name VARCHAR2(30) NOT NULL ,age VARCHAR2(3) NOT NULL ,address VARCHAR2(100) /*創建外鍵將本表subId字段的取值引用(主表)至subject表的subId列*/ ,CONSTRAINT fk_student_subId FOREIGN KEY(subid) REFERENCE subject(subId) --表級約束 ); CREATE TABLE subject ( subId VARCHAR2(10) PRIMARY KEY ,name VARCHAR2(30) NOT NULL ,description VARCHAR2(100) NOT NULL ,CONSTRAINT fk_relation_subId FOREIGN KEY(stuid) REFERENCE student(stuId) ,CONSTRAINT fk_relation_subId FOREIGN KEY(subid) REFERENCE subject(subId) ); CREATE TABLE relation ( rId VARCHAR2(10) PRIMARY KEY ,stuId VARCHAR2(10) NOT NULL ,subId VARCHAR2(10) NOT NULL ); ------------------------ CREATE TABLE student --CREATE TABLE 創建表格 ( stuNo VARCHAR2(10) --學號字符串類型 ,stuName VARCHAR2(30) --學員姓名,字符串類型 ,stuAge NUMBER(3) --學員年齡,整數類型,3位長度 ,stuScore NUMBER(3, 1) --學員成績,浮點類型 ); /*為student表添加數據*/ INSERT INTO student --插入數據到表中 VALUES('TX1001', 'TOM', 20, 99.5); INSERT INTO student VALUES('TX1002', 'aa', 20, 99); INSERT INTO student VALUES('TX1003', 'bb', 20, 98); /* 查詢student表中數據*/ SELECT stuNo AS 學生編號, StuName AS 學生姓名, StuAge AS 學生年齡, stuScore / 10 AS 成績 FROM student WHERE stuNo = 'TX1001'; -------修改-------------- UPDATE student SET stuScore = 8 WHERE stuNo = 'TX1001'; -------刪除數據---------- DELETE FROM student WHERE stuNo = 'TX1003'; /*查詢全表數據*/ SELECT * FROM student; /*刪除student表*/ DROP TABLE student; /* 創建員工表 */9000 CREATE TABLE employee ( eId VARCHAR2(10) ,eName VARCHAR2(30) ,eAge NUMBER(2) ,eSalary NUMBER(7, 2) ); /* 為員工表添加數據 */ INSERT INTO employee VALUES('EMP1001', 'Tom', 25, 5000.00); INSERT INTO employee VALUES('EMP1002', 'Jim', 25, 6000.00); INSERT INTO employee VALUES('EMP1003', 'Rose', 30, 8000.00); /* 全表查詢 */ SELECT * FROM employee; /* 查詢列為表達式,並為列取別名 */ SELECT eName AS 姓名, eAge 年齡, eSalary * 12 年薪 FROM employee WHERE eId = 'EMP1001'; /* 去除重復記錄 */ SELECT DISTINCT eAge FROM employee; /* 修改數據 */ UPDATE employee SET eSalary = 9000.00, eAge = 28 WHERE eId = 'EMP1003'; /* 刪除記錄 */ DELETE FROM employee WHERE eId = 'EMP1003'; /* 創建表,使用約束 */ CREATE TABLE teacher ( tId VARCHAR2(10) PRIMARY KEY ,tName VARCHAR2(30) UNIQUE NOT NULL ,tAge NUMBER(2) CHECK(tAge >= 22 AND tAge <= 65) NOT NULL -- CHECK(tAge BETEEN 22 AND 65) - tAge <> 30 ); INSERT INTO teacher VALUES('TEA1001', 'Tom', 25); INSERT INTO teacher VALUES('TEA1002', 'Tim', 20); /* IN關鍵字 */ SELECT eId, eName, eSalary FROM employee WHERE deptId NOT IN('DEPT1001', 'DEPT1002'); CREATE TABLE emp ( eId VARCHAR2(10) PRIMARY KEY ,eName VARCHAR2(30) NOT NULL ,eMail VARCHAR2(30) ); INSERT INTO emp VALUES('emp1001', 'Tom', '[email protected]'); INSERT INTO emp(eId, eName) VALUES('emp1002', 'Tim'); /*查詢emp表中eMail非空的列*/ SELECT * FROM emp WHERE eMail IS NOT NULL; CREATE TABLE stu ( sId VARCHAR2(10) PRIMARY KEY ,sName VARCHAR2(30) NOT NULL ,sAddress VARCHAR2(30) NOT NULL ); INSERT INTO stu VALUES('stu1001', 'Tom', '天津市河西區'); INSERT INTO stu VALUES('stu1002', 'Tim', '北京市豐臺區'); /* 模糊查詢 */ SELECT * FROM stu WHERE sAddress NOT LIKE '%天津%'; DROP TABLE stu; CREATE TABLE stu ( sId VARCHAR2(10) PRIMARY KEY ,sName VARCHAR2(30) NOT NULL ,sScore NUMBER(3) NOT NULL ); INSERT INTO stu VALUES('stu1001', 'Tom', 95); INSERT INTO stu VALUES('stu1002', 'Tim', 98); INSERT INTO stu VALUES('stu1003', 'Jim', 58); SELECT * FROM stu ORDER BY sScore ASC; SELECT * FROM stu ORDER BY sScore DESC; SELECT sName, sScore + 5 AS Score FROM stu ORDER BY Score DESC; DROP TABLE student; /* 主外鍵關系,一對多 */ CREATE TABLE student ( stuId VARCHAR2(10) PRIMARY KEY ,name VARCHAR2(30) NOT NULL ,age NUMBER(3) NOT NULL ,address VARCHAR2(100) ,subId VARCHAR2(10) NOT NULL --創建外鍵,本表subId字段的取值應取自subject表subId列的值 ,CONSTRAINT fk_student_subId FOREIGN KEY(subId) REFERENCES subject(subId) ); CREATE TABLE subject ( subId VARCHAR2(10) PRIMARY KEY ,name VARCHAR2(30) NOT NULL ,description VARCHAR2(100) NOT NULL ); INSERT INTO subject VALUES('1001', 'JAVA', 'DESC'); INSERT INTO subject VALUES('1002', 'ANDROID', 'DESC'); INSERT INTO subject VALUES('1003', 'PHP', 'DESC'); INSERT INTO student VALUES('101', 'Tom', 18, 'Tianjin', '1001'); INSERT INTO student VALUES('102', 'Tim', 19, 'Beijing', '1002'); SELECT * FROM student; DROP TABLE subject; /* 主外鍵關系,多對多 */ CREATE TABLE student ( stuId VARCHAR2(10) PRIMARY KEY ,name VARCHAR2(30) NOT NULL ,age NUMBER(3) NOT NULL ,address VARCHAR2(100) ); CREATE TABLE subject ( subId VARCHAR2(10) PRIMARY KEY ,name VARCHAR2(30) NOT NULL ,description VARCHAR2(100) NOT NULL ); CREATE TABLE relation ( rId VARCHAR2(10) PRIMARY KEY ,stuId VARCHAR2(10) NOT NULL ,subId VARCHAR2(10) NOT NULL ,CONSTRAINT fk_relation_stuId FOREIGN KEY(stuId) REFERENCES student(stuId) ,CONSTRAINT fk_relation_subId FOREIGN KEY(subId) REFERENCES subject(subId) );
我的SQL筆記&一些練習題(一)