1. 程式人生 > >我的SQL筆記&一些練習題(一)

我的SQL筆記&一些練習題(一)

eat sid UNC score server 隔離性 回退 sql命令 sql數據庫

Oracle 數據庫使用的端口為:1521

在Windows平臺下需保證 Oracle server xeOraclelistener 服務正常運行才可以連接到數據庫

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筆記&一些練習題(一)