SQL note
先登陸服務器: telnet 192.168.0.23 公帳號: openlab-open123 tarena-tarena
再進入SQL:sqlplus sd0807/sd0807 帳號:sd0807-密碼同樣 公帳號:openlab-open123
設置環境變量:
ORACLE_SID=oral10g\ --變局部變量
export ORACLE_SID --變全局變量
unset ORACLE_SID --卸載環境變量
ORACLE_HOME=... --安裝路徑;直接用一句語句也可以,如下
export ORACLE_HOME=/oracledata/.../bin:
一、注意事項:
大小寫不敏感,即不區分大小寫。提倡關鍵字大寫,便於閱讀和調式。
“!”在SQL環境下執行Unix命令。
SQL語句是由簡單的英語單詞構成;這些英語單詞稱爲關鍵字/保留字,不做它用。SQL由多個關鍵字構成。
SQL語句由子句構成,有些子句是必須的,有些是可選的。
在處理SQL語句時,其中所有的空格都被忽略(空格只用來分開單詞,連續多個空格當一個用)。
SQL語句可以在一行上寫出,建議多行寫出,便於閱讀和調試。
多條SQL語句必須以分號分隔。多數DBMS不需要在單條SQL語句後加分號,但特定的DBMS可能必須在單條SQL語句後加分號。
SQL語句的最後一句要以 “;”號結束
二、寫子句順序
Select column,group_function
From table
[Where condition]
[Group by group_by_expression]
[Having group_condition]
……
[Order by column]; --最後
三、常用簡單語句:
clear screen:清屏
edit:編輯剛纔的一句。
desc/describe:(列出所有列名稱)
用法: DESCRIBE [schema.]object[@db_link]
dual:亞表,臨時用。如:desc dual;/from dual;
rollback:回溯,回溯到上次操作前的狀態,把這次事務操作作廢,只有一次(DDL和DCL語句會自動提交,不能回溯)。
可以用commit語句提交,這樣就回溯不回了。
set pause on\off :設置分屏(設置不分屏)
set pause "please put an enter key" 且 set pause on:設置帶有提示的分屏
oerr ora 904 :查看錯誤
set head off :去掉表頭
set feed off :去掉表尾
保存在oracle數據庫中的所有操作細節:
spool oracleday01.txt :開始記錄
spool off :開始保存細節
四、SELECT語句:選擇操作、投影操作。
select:從一個或多個表中檢索一個或多個數據列。包含信息:想選擇什麼表,從什麼地方選擇。必須要有From子句。(最常用)
當從多張表裏查詢的時候,會產生笛卡爾積;可用條件過濾它。
當兩個表有相同字段時必須加前綴,列名前需加表名和“.”,如“s_emp.id”。
1、用法:SELECT columns,prod2,prod3<列> FROM Table1,table2<表名> 分號結束
如: select id from s_emp;
select last_name,name from s_emp,s_dept where s_emp.dept_id=s_dept.id;--列表每人所在部門
SELECT * FROM Products; --檢索所有列。
數據太多時,最好別使用上句,會使DBMS降低檢索和應用程序的性能。(*通配符)
2、對數據類型的列可進行運算(如加減乘除)。
3、對列起別名:有直接起別名,加AS起別名,用雙引號起別名等三種方法
(單引號,引起字符串;雙引號,引起別名。起別名有符號,或者區分大小寫時,必須用雙引號)
多表查詢時,可給表起別名。(給列起別名,列<空格>列別名;給表起別名,表<空格>表別名;)。
如:Select first_name EMPLOYEES, 12*(salary+100) AS MONEY, manager_id "ID1" From s_emp E;
4、字段的拼接,可用雙豎線(雙豎線只能用於select語句裏)。不同的DBMS可能使用不同的操作符;拼接的字段同樣可以起別名。
如:Select first_name ||' '|| last_name || ', '|| title "Employees" From s_emp;
排他鎖:Select id,salary From s_emp where id=1 For Update;
可以阻止他人併發的修改,直到你解鎖。
如果已有鎖則自動退出:Select id,salary From s_emp where id=1 For Update NoWait;
FOR UPDATE :可以再加 OF 精確到某格。如: ... For Update OF salary ...
注意要解鎖。
五、ORDER BY 子句,排序
Order by:按某排序列表(默認升序 asc,由低到高;可加 desc,改成降序由高到低)
檢索返回數據的順序沒有特殊意義,爲了明確地排序用 SELECT 語句檢索出的數據,可使用 ORDER BY 子句。
ORDER BY 子句取一個或多個列的名字。
對空值,按無窮大處理(升序中,空值排最後;降序中排最前)。
1、用法:Select prod_id,prod_price,prod_name From Products Order By prod_price,prod_name;
(從左到右執行排序,先排price)
ORDER BY子句中使用的列將是爲顯示所選擇的列,但是實際上並不一定要這樣,用非檢索的列排序數據是完全合法的。
爲了按多個列排序,列名之間用逗號分開。
2、支持按相對列位置進行排序。
輸入 SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3 --(2指price,3指name)
3、升序、降序。默認是升序(asc,從小到大排序),想降序時用desc。
如:SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC;
注意:DESC 關鍵字只應用到直接位於其前面的列名。如果想在多個列上進行排序,必須對每個列指定DESC關鍵字。
升序是默認的,可不寫,但降序必須寫。
六、WHERE子句,選擇、過濾
其後只能跟邏輯語句,返回值只有ture或false
如: select last_name,salary from s_emp where salary=1000;--找出工資1000的人
WHERE子句操作符:
1、邏輯比較運算符
= 等於
!= 不等於,還有(<> ^= 這兩個同樣表示不等於)
> 大於
>= 大於等於
< 小於
<= 小於等於
2、SQL 比較運算符
between…and… :在兩者之間。(BETWEEN 小值 AND 大值)
如:select last_name,salary from s_emp where salary between 1000 and 1500;
--工資1000到1500的人,包括1000和1500。
in(列表):在列表裏面的。
如:select last_name,dept_id from s_emp where dept_id in(41,42);第41、42部門的人
like : 包含某內容的。模糊查詢
可以利用通配符創建比較特定數據的搜索模式,通配符只能用於文本,非文本數據類型不能使用通配符。
通配符在搜索模式中任意位置使用,並且可以使用多個通配符。
通配符%表示任何字符出現任意次數;還能代表搜索模式中給定位置的0個或多個字符。下劃線匹配單個任意字符。
如:select table_name from user_tables where table_name like 'S\_%' escape'\';
' 找出“S_“開頭的,由於下劃線有任意字符的含義,故需另外定義轉移符。
但習慣用“\”,爲方便其他程序員閱讀和檢測,一般不改用其他的。
like 'M%':M開頭的 like '_a%':第二個字符是a的 like '%a%'所有含a的
(“_”表示一個任意字符;“%”表示任意多個任意字符。)
單引號裏面的內容,大小寫敏感。單引號用來限定字符串,
如果將值與串類型的列進行比較,則需要限定引號;用來與數值列進行比較時,不用引號。
is null:是空。(NULL表示不包含值。與空格、0是不同的。)
如:SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL;
七、高級檢索(邏輯運算符):
通常我們需要根據多個條件檢索數據。可以使用AND或OR、NOT等連接相關的條件
計算次序可以通過圓括號()來明確地分組。不要過分依賴默認計算次序,使用圓括號()沒有壞處,它能消除二義性。
and:條件與
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 AND vend_id=‘DELL’
or:條件或 (注: and 的優先級比 or 更高,改變優先級可用括號)
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 OR vend_id=‘DELL’
not:條件非。否定它之後所跟的任何條件
否定的SQL 比較運算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL:
(注意,按英語習慣用 is not,而不是 not is)
NOT 與 IN 在一起使用時,NOT 是找出與條件列表不匹配的行。
IN 列表裏有 NULL 時不處理,不影響結果;用 NOT IN 時,有 NULL 則出錯,必須排除空值再運算。
in :選擇列表的條件
使用IN操作符的優點: 在長的選項清單時,語法直觀; 計算的次序容易管理;
比 OR 操作符清單執行更快;最大優點是可以包含其他 SELECT 語句,使用能夠動態地建立 WHERE 子句。
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id IN(‘DELL’,’RBER’,’TTSR’);
八、單行函數:
函數一般在數據上執行,它給數據的轉換和處理提供了方便。不同的DBMS提供的函數不同。
函數可能會帶來系統的不可移植性(可移植性:所編寫的代碼可以在多個系統上運行)。
加入註釋是一個使用函數的好習慣。
大多數SQL實現支持以下類型的函數: 文本處理, 算術運算, 日期和時間, 數值處理。
Null:空值
空值當成無窮大處理,所有空值參與的運算皆爲空。
空值與空值並不相等,因爲空值不能直接運算。
如:prod_price="" 這種寫法是錯的(不要受到corejava的影響)
prod_price=NULL 這種寫法是錯的(不要受到corejava的影響)
prod_price IS NULL 這種寫法纔是對的
NVL:處理空值,把空值轉化爲指定值。可轉化爲日期、字符、數值等三種(注意:轉化時,兩參數必須要同類型)
如:NVL(date, '01-JAN-95') NVL(title,'NO Title Yet') NVL(salary,0)
錯誤寫法:
Select last_name,title,salary*commission_pct/100 COMM From s_emp;--沒提成的人沒法顯示工資
正確寫法:
Select last_name,title,salary*NVL(commission_pct,0)/100 COMM From s_emp;--把提成是空值的轉化爲0
DISTINCT:過濾重複
把重複的行過濾掉;多個字段組合時,只排除組合重複的。
DISTINCT必須使用列名,不能使用計算或者表達式。
所有的聚合函數都可以使用。如果指定列名,則DISTINCT只能用於COUNT(列名),DISTINCT不能用於COUNT(*)。
如:Select Distinct name From s_dept; Select Distinct dept_id,title From s_emp;
文本處理:
TRIM()/LTRIM()/RTIRM():去空格。只能去掉頭和尾的空格,中間的不理。
trim(' heo Are fdou ') --> heo Are fdou
輸入:select trim(' heo Are fdou ') from dual; -->:heo Are fdou
LOWER:轉小寫
lower('SQL Course') --> sql course
UPPER:轉大寫
upper(' SQL Course') --->SQL COURSE
INITCAP:首字母轉大寫,其餘轉小寫
initcap(SQL Course') '--> Sql Course
CONCAT:合成。雙豎線只能在select語句裏面用,這個可用於任何語句。
Concat('Good','String') --> GoodString
SUBSTR:截取。
Substr('String', 1 ,3) --> Str
第一個數字“1”,表示從第幾個開始截取;若要從倒數第幾個開始,用負數,如“-2”表示倒數第2個。
上式中第2個數字“3”表示截取多少個。
LENGTH:統計長度。
Length('String') --> 6
NVL:轉換空值
日期和時間處理:
Oracle日期格式:DD-MMM-YYYY (D代表日期date,M代表月month,Y代表年year)
如:SELECT prod_name (DAY表示完整的星期幾,DY顯示星期的前三個字母)
FROM Products
WHERE prod_time BETWEEN
to_date(’01-JAN-2008’)
AND to_date(’31-DEC-2008’);
日期可以進行加減,默認單位是1天。日期與日期可以相減,得出天數;日期與日期但不能相加。
sysdate -> 系統的當天
Months_Between('01-Sep-95','11-Jan-94') --> 19.774194 相差多少個月,Between裏面也可以填函數。
Add_months('11-Jan-94',6) --> 11-Jul-94 增加多少個月
Next_day('01-Sep-95','Friday') --> '08-Sep-95' 下一個星期五。其中的'Friday'可用6替代,因爲星期日=1
Last_day('01-Sep-95') --> '30-Sep-95' 這個月的最後一天
數值處理:可以運用於代數,三角,幾何
ROUND:四捨五入
Round(45.925,2) -> 45.93 Round(45.925,0) -> 46 Round(45.925,-1) -> 50
逗號前一個數是要處理的數據源,後一個參數表示保留多少位小數。
後一參數是負數時,表示捨去小數點前的幾位,例3是捨去個位及其後的。不寫後一參數時,默認不保留小數。
TRUNC:捨去末位。直接捨去,不會進位。
Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92
日期的舍取:
常用的數值處理函數有:
ABS() 絕對值 ABS(-5741.5854) --> 5741.5854
PI() 圓周率 注意:oracle中不支持 PI()函數;MYSql 支持PI()函數。
SIN() 正統值 Oracle還支持COS()、ASIN()、ACOS()函數
SQRT() 平方根
轉化:
TO_CHAR(number,'fmt'):把數值轉換成字符串
顯示數字的命令
9:正常顯示數字;
0:顯示包括0的數值形式,空位強制補0;
$:以美元符號顯示貨幣;
L:按當前環境顯示相關的貨幣符號;
. 和,:在固定位置出現“.”點 和“,”逗號;不夠位時,四捨五入。
例題:SQL> select 'Order'||To_char(id)||
2 'was filled for a total of'
3 ||To_char(total,'fm$9,999,999')
4 from s_ord
5 where ship_date ='21-SEP-92';
TO_NUMBER(char):把字符轉換成數字
九、鏈接
內鏈接:嚴格匹配兩表的記錄。
外鏈接分左鏈接和右鏈接:
會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,
數據庫會模擬出記錄去和那些不匹配的記錄匹配。
左鏈接 加號在右面
如:有 TABLE1 TABLE2
1的一條記錄在2裏面沒有匹配上,那麼1裏面的記錄保留
2的一條記錄在1裏面沒有匹配上 ,那麼2丟棄
右鏈接正好相反
--例題:哪些人是領導。
select distinct b.id,b.last_name manager
from s_emp a,s_emp b
where a.manager_id=b.id(+);
左右順序有區別,這是另外新建一個表,要顯示的是第二個表格的內容。
+放在沒有匹配行的表一側,令表格能完整顯示出來。
標準寫法:內連接用INNER,左連接用LEFT,右連接用RIGHT。
select distinct b.id,b.last_name manager
from s_emp a LEFT join s_emp b
ON a.manager_id=b.id;
十、組函數:
分組允許將數據分爲多個邏輯組,以便能對每個組進行聚集計算。
Group:分組
Group by:分組。(默認按升序對所分的組排序;想要降序要用 order by)可以包括任意數目的列。
如果嵌入了分組,數據將在最後規定的分組上進行彙總。
GROUP BY 子句中列出的每個列都必須是檢索列或有效的表達式,但不能是聚集函數。
*如果在SELECT 中使用表達式,則必須在GROUP BY子句中指定相同的表達式,不能使用別名。
除聚合計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
如果分組列中具有NULL值,則NULL將作爲一個分組返回。如果列中有多行NULL,它們將分爲一組。
Having:過濾。分組之後,不能再用where,要用having 選擇過濾。Having不能單獨存在,必須跟在group by後面。
WHERE在數據分組前進行過濾,HAVING在數據分組後過濾。
可以在SQL中同時使用 WHERE和HAVING,先執行WHERE,再執行HAVING。
聚合函數:
AVG:平均值 (忽略值爲NULL的行,但不能用 AVG(*))
COUNT:計數 (Count(列)不計算空值;但 COUNT(*)表示統計表中所有行數,包含空值)
MAX:最大值 (忽略列值爲 NULL 的行。但有些DBMS還允許返回文本列中的最大值,
在作用於文本數據時,如果數據按照相應的列排序,則 MAX()返回最後一行。)
MIN:最小值 (忽略值爲 NULL 的行。不能用 MIN(*)。一般是找出數值或者日期值的最小值。
但有些DBMS還允許返回文本列中的最小值,這時返回文本最前一行)
SUM:求和 (忽略值爲 NULL 的值。SUM 不能作用於字符串類型,而 MAX(),MIN()函數能。也不能 SUM(*))
子查詢:查詢語句的嵌套
可以用於任意select 語句裏面,但子查詢不能出現 order by。
子查詢總是從內向外處理。作爲子查詢的SELECT 語句只能查詢單個列,企圖檢索多個列,將會錯誤。
如:找出工資最低的人select min(last_name),min(salary) from s_emp;
或者用子查詢select last_name,salary from s_emp where salary=(select min(salary) from s_emp);
E-R圖:屬性: E(Entity) -R(Relationship)
* (Mandatory marked 強制的) 強制的非空屬性
o (Optional marked 可選的) 可選屬性(可以有值也可以沒有)
#* (Primary marked ) 表示此屬性唯一且非空
約束:針對表中的字段進行定義的。
PK:primary key (主鍵約束,PK=UK+NN)保證實體的完整性,保證記錄的唯一
主鍵約束,唯一且非空,並且每一個表中只能有一個主鍵,有兩個字段聯合作爲主鍵,
只有兩個字段放在一起唯一標識記錄,叫做聯合主鍵(Composite Primary Key)。
FK:foreign key (外建約束)保證引用的完整性,外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值的約束,不能夠取其他值,
只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表);
child table(子表),要想創建子表,就要先創建父表,後創建子表,記錄的插入也是如此,先父表後子表,
刪除記錄,要先刪除子表記錄,後刪除父表記錄,
要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,後刪除父表。
U:unique key(唯一鍵 UK),值爲唯一,不能重複。
在有唯一性約束的列,可以有多個空值,因爲空值不相等。
NN:NOT NULL,不能爲空。
index(索引)是數據庫特有的一類對象,實際應用中一定要考慮索引,view(示圖)
數量關係: 一對一關係
多對一關係
一對多關係
多對多關係
範式:
好處:降低數據冗餘;減少完整性問題;標識實體,關係和表
第一範式(First normal form:1Nf),每一個屬性說一件事情。所有的屬性都必須是單值,也就是屬性只表示單一的意義。
(記錄可以重複,會有大量冗餘,沒有任何限制)
第二範式(2N範式),最少有一個屬性要求唯一且非空PK,其他跟他有關聯(記錄不可重複,但是數據可能會出現冗餘)。
第三範式(3N範式),非主屬性只能依賴於主屬性,不能依賴於其他非主屬性。(解決數據冗餘問題,不能存在推理能得出的數據)
一般情況會做到第三範式。
創建表: Create Table 表名
(字段名1 類型(數據長度)(default ...) 約束條件,
字段名2 類型(數據長度) 約束條件 );
建表的名稱:
必須字母開頭;最多30字符;只能使用“A~Z、a~z、0~9、_、$、#”;
同一目錄下不能有同名的表;表名不能跟關鍵字、特殊含意字符同樣。
如:create table number_1 (n1 number(2,4), n2 number(3,-1), n3 number);
create table t_sd0808(id number(12) primary key,name varchar(30) not null);
MySQL的: create table student (oid int primary key, ACTNO varchar(20) not null unique,
BALANCE double); --MySQL的number類型分小類了,Oracle只有number,且MySQL的數值型不用定大小
Oracle的: create table t_ad (oid number(15) primary key,
ACTNO varchar(20) not null unique,BALANCE number(20));
INSERT:插入(或添加)行到數據庫表中的關鍵字。
插入方式有以下幾種:插入完整的行;插入行的一部分;插入某些查詢的結果。
對於INSERT操作,可能需要客戶機/服務器的DBMS中的特定的安全權限。
插入行(方式一) INSERT INTO products VALUES(2008,’TV’,222.22,’US’);
依賴於表中定義的順序,不提倡使用。有空值時需要自己補上。
插入行(方式二) INSERT INTO products(id,name,price,vend_name) VALUES(2008,’TV’,222.22,’US’);
依賴於邏輯順序,會自動補上空值,提倡使用。
插入檢索出的數據:可以插入多條行到數據庫表中
INSERT INTO products(*,*,*,*)
SELECT *,*,*,*
FROM products_copy;
如果這個表爲空,則沒有行被插入,不會產生錯誤,因爲操作是合法的。
可以使用WHERE加以行過濾。
複製表: 將一個表的內容複製到一個全新的表(在運行中創建,開始可以不存在)
CREATE TABLE 新表名 AS
SELECT *
FROM 表名;
INSERT INTO 與 CREATE TABLE AS SELECT 不同,前者是導入數據,而後者是導入表。
任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY。
可利用聯接從多個表插入數據。不管從多少個表中檢索數據,數據都只能插入到單個表中。
更新數據 UPDATE 語句
需要提供以下信息:要更新的表;列名和新值;確定要更新的哪些行的過濾條件。
UPDATE 表名
SET vend_name = ‘HP’,
prod_name = ‘NEWCOMPUTER’
WHERE vend_name = ‘IBM’;
--UPDATE 語句中可以使用子查詢,使得能用SELECT語句檢索出的數據更新列數據。也可以將一個列值更新爲 NULL。
刪除數據 DELETE 語句
DELETE
FROM products
WHERE prod_name = ‘COMPUTER’;
全行刪除,不要省略WHERE,注意安全。
DELETE不需要列名或通配符。刪除整行而不是刪除列。DELETE是刪除表的內容而不是刪除表。
如果想從表中刪除所有內容,可以使用TRUNCATE TABLE語句(清空表格),它更快。
數字字典表:
Sequence:排列。存儲物理地址
Index:索引。依附於表,爲提高檢索速度。
View:視圖。看到表的一部分數據。
限制數據訪問。簡化查詢。數據獨立性。本質上是一個sql查詢語句。
Create[or Relace][Force|noForce] View 視圖名
[(alias[,alias]…)] 別名列表
As subquery
[With Check Option [Constraint ……]]
[With Read Only]
注意:有些DBMS不允許分組或排序視圖,不能有 Order by 語句。可以有 Select 語句。
刪除視圖: DROP VIEW 視圖名
Rownum:緯列。內存裏排序的前N個。
在where語句中,可以用=1,和<=N 或 <N;但不能用=N 或 >N。
因爲這是內存讀取,沒有1就丟棄再新建1。只能從1開始。需要從中間開始時,需二重子rownum語句需取別名。
經典應用: Top-n Analysis (求前N名或最後N名)
Select [查詢列表], Rownum
From (Select [查詢列表(要對應)]
From 表
Order by Top-N_字段)
Where Rownum <= N
分頁顯示:
--取工資第5~10名的員工(二重子rownum語句,取別名)
select rn,id,last_name,salary
From ( select id,last_name,salary,Rownum rn
From (Select id,last_name,salary
from s_emp
order by salary desc)
where rownum <= 10)
where rn between 5 and 10;
Union:合併表
Select … Union Select… 把兩個Select語句的表合併。
要求兩表的字段數目和類型按順序對應。合併後的表,自動過濾重複的行。
Intersect:交。 同上例,把兩個Select表相交。
Minus:減。 把相交的內容減去。
not exists 除運算。
添加字段(列):
Alter Table 表名
Add (column dataype [Default expr][Not Null]
[,column datatype]…);
添加有非空限制的字段時,要加Default語句
字段名字不可以直接改名,需要添加新字段,再複製舊字段後刪除舊字段。
添加約束: Alter Table 表名
Add [CONSTRAINT constraint] type (column);
添加非空約束時,要用Modify語句。
查看約束名時,可以違反約束再看出錯提示;或者查看約束字典desc user_constraints
減少字段:
Alter Table 表名
Drop (column [,column]…);
刪除約束: Alter Table 表名
Drop CONSTRAINT column;
或: Alter Table 表名
Drop Primary Key Cascade;
暫時關閉約束,並非刪除:
Alter Table 表名
Disable CONSTRAINT column Cascade;
打開剛纔關閉的約束:
Alter Table 表名
Enable CONSTRAINTcolumn;
修改字段:
Alter Table 表名
Modify (column dataype [Default expr][Not Null]
[,column datatype]…);
修改字段的類型、大小、約束、非空限制、空值轉換。
刪除表:
會刪除表的所有數據,所有索引也會刪除,約束條件也刪除,不可以roll back恢復。
Drop Table 表名 [Cascade Constraints];
加 [Cascade Constraints] 把子表的約束條件也刪除;但只加 [Cascade]會把子表也刪除。
改表名:
Rename 原表名 To 新表名;
清空表格:
TRUNCATE TABLE 表名;
相比Delete,Truncate Table清空很快,但不可恢復。清空後釋放內存。
Delete 刪除後可以roll back。清空後不釋放內存。
再進入SQL:sqlplus sd0807/sd0807 帳號:sd0807-密碼同樣 公帳號:openlab-open123
設置環境變量:
ORACLE_SID=oral10g\ --變局部變量
export ORACLE_SID --變全局變量
unset ORACLE_SID --卸載環境變量
ORACLE_HOME=... --安裝路徑;直接用一句語句也可以,如下
export ORACLE_HOME=/oracledata/.../bin:
一、注意事項:
大小寫不敏感,即不區分大小寫。提倡關鍵字大寫,便於閱讀和調式。
“!”在SQL環境下執行Unix命令。
SQL語句是由簡單的英語單詞構成;這些英語單詞稱爲關鍵字/保留字,不做它用。SQL由多個關鍵字構成。
SQL語句由子句構成,有些子句是必須的,有些是可選的。
在處理SQL語句時,其中所有的空格都被忽略(空格只用來分開單詞,連續多個空格當一個用)。
SQL語句可以在一行上寫出,建議多行寫出,便於閱讀和調試。
多條SQL語句必須以分號分隔。多數DBMS不需要在單條SQL語句後加分號,但特定的DBMS可能必須在單條SQL語句後加分號。
SQL語句的最後一句要以 “;”號結束
二、寫子句順序
Select column,group_function
From table
[Where condition]
[Group by group_by_expression]
[Having group_condition]
……
[Order by column]; --最後
三、常用簡單語句:
clear screen:清屏
edit:編輯剛纔的一句。
desc/describe:(列出所有列名稱)
用法: DESCRIBE [schema.]object[@db_link]
dual:亞表,臨時用。如:desc dual;/from dual;
rollback:回溯,回溯到上次操作前的狀態,把這次事務操作作廢,只有一次(DDL和DCL語句會自動提交,不能回溯)。
可以用commit語句提交,這樣就回溯不回了。
set pause on\off :設置分屏(設置不分屏)
set pause "please put an enter key" 且 set pause on:設置帶有提示的分屏
oerr ora 904 :查看錯誤
set head off :去掉表頭
set feed off :去掉表尾
保存在oracle數據庫中的所有操作細節:
spool oracleday01.txt :開始記錄
spool off :開始保存細節
四、SELECT語句:選擇操作、投影操作。
select:從一個或多個表中檢索一個或多個數據列。包含信息:想選擇什麼表,從什麼地方選擇。必須要有From子句。(最常用)
當從多張表裏查詢的時候,會產生笛卡爾積;可用條件過濾它。
當兩個表有相同字段時必須加前綴,列名前需加表名和“.”,如“s_emp.id”。
1、用法:SELECT columns,prod2,prod3<列> FROM Table1,table2<表名> 分號結束
如: select id from s_emp;
select last_name,name from s_emp,s_dept where s_emp.dept_id=s_dept.id;--列表每人所在部門
SELECT * FROM Products; --檢索所有列。
數據太多時,最好別使用上句,會使DBMS降低檢索和應用程序的性能。(*通配符)
2、對數據類型的列可進行運算(如加減乘除)。
3、對列起別名:有直接起別名,加AS起別名,用雙引號起別名等三種方法
(單引號,引起字符串;雙引號,引起別名。起別名有符號,或者區分大小寫時,必須用雙引號)
多表查詢時,可給表起別名。(給列起別名,列<空格>列別名;給表起別名,表<空格>表別名;)。
如:Select first_name EMPLOYEES, 12*(salary+100) AS MONEY, manager_id "ID1" From s_emp E;
4、字段的拼接,可用雙豎線(雙豎線只能用於select語句裏)。不同的DBMS可能使用不同的操作符;拼接的字段同樣可以起別名。
如:Select first_name ||' '|| last_name || ', '|| title "Employees" From s_emp;
排他鎖:Select id,salary From s_emp where id=1 For Update;
可以阻止他人併發的修改,直到你解鎖。
如果已有鎖則自動退出:Select id,salary From s_emp where id=1 For Update NoWait;
FOR UPDATE :可以再加 OF 精確到某格。如: ... For Update OF salary ...
注意要解鎖。
五、ORDER BY 子句,排序
Order by:按某排序列表(默認升序 asc,由低到高;可加 desc,改成降序由高到低)
檢索返回數據的順序沒有特殊意義,爲了明確地排序用 SELECT 語句檢索出的數據,可使用 ORDER BY 子句。
ORDER BY 子句取一個或多個列的名字。
對空值,按無窮大處理(升序中,空值排最後;降序中排最前)。
1、用法:Select prod_id,prod_price,prod_name From Products Order By prod_price,prod_name;
(從左到右執行排序,先排price)
ORDER BY子句中使用的列將是爲顯示所選擇的列,但是實際上並不一定要這樣,用非檢索的列排序數據是完全合法的。
爲了按多個列排序,列名之間用逗號分開。
2、支持按相對列位置進行排序。
輸入 SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3 --(2指price,3指name)
3、升序、降序。默認是升序(asc,從小到大排序),想降序時用desc。
如:SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC;
注意:DESC 關鍵字只應用到直接位於其前面的列名。如果想在多個列上進行排序,必須對每個列指定DESC關鍵字。
升序是默認的,可不寫,但降序必須寫。
六、WHERE子句,選擇、過濾
其後只能跟邏輯語句,返回值只有ture或false
如: select last_name,salary from s_emp where salary=1000;--找出工資1000的人
WHERE子句操作符:
1、邏輯比較運算符
= 等於
!= 不等於,還有(<> ^= 這兩個同樣表示不等於)
> 大於
>= 大於等於
< 小於
<= 小於等於
2、SQL 比較運算符
between…and… :在兩者之間。(BETWEEN 小值 AND 大值)
如:select last_name,salary from s_emp where salary between 1000 and 1500;
--工資1000到1500的人,包括1000和1500。
in(列表):在列表裏面的。
如:select last_name,dept_id from s_emp where dept_id in(41,42);第41、42部門的人
like : 包含某內容的。模糊查詢
可以利用通配符創建比較特定數據的搜索模式,通配符只能用於文本,非文本數據類型不能使用通配符。
通配符在搜索模式中任意位置使用,並且可以使用多個通配符。
通配符%表示任何字符出現任意次數;還能代表搜索模式中給定位置的0個或多個字符。下劃線匹配單個任意字符。
如:select table_name from user_tables where table_name like 'S\_%' escape'\';
' 找出“S_“開頭的,由於下劃線有任意字符的含義,故需另外定義轉移符。
但習慣用“\”,爲方便其他程序員閱讀和檢測,一般不改用其他的。
like 'M%':M開頭的 like '_a%':第二個字符是a的 like '%a%'所有含a的
(“_”表示一個任意字符;“%”表示任意多個任意字符。)
單引號裏面的內容,大小寫敏感。單引號用來限定字符串,
如果將值與串類型的列進行比較,則需要限定引號;用來與數值列進行比較時,不用引號。
is null:是空。(NULL表示不包含值。與空格、0是不同的。)
如:SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL;
七、高級檢索(邏輯運算符):
通常我們需要根據多個條件檢索數據。可以使用AND或OR、NOT等連接相關的條件
計算次序可以通過圓括號()來明確地分組。不要過分依賴默認計算次序,使用圓括號()沒有壞處,它能消除二義性。
and:條件與
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 AND vend_id=‘DELL’
or:條件或 (注: and 的優先級比 or 更高,改變優先級可用括號)
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 OR vend_id=‘DELL’
not:條件非。否定它之後所跟的任何條件
否定的SQL 比較運算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL:
(注意,按英語習慣用 is not,而不是 not is)
NOT 與 IN 在一起使用時,NOT 是找出與條件列表不匹配的行。
IN 列表裏有 NULL 時不處理,不影響結果;用 NOT IN 時,有 NULL 則出錯,必須排除空值再運算。
in :選擇列表的條件
使用IN操作符的優點: 在長的選項清單時,語法直觀; 計算的次序容易管理;
比 OR 操作符清單執行更快;最大優點是可以包含其他 SELECT 語句,使用能夠動態地建立 WHERE 子句。
如 SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id IN(‘DELL’,’RBER’,’TTSR’);
八、單行函數:
函數一般在數據上執行,它給數據的轉換和處理提供了方便。不同的DBMS提供的函數不同。
函數可能會帶來系統的不可移植性(可移植性:所編寫的代碼可以在多個系統上運行)。
加入註釋是一個使用函數的好習慣。
大多數SQL實現支持以下類型的函數: 文本處理, 算術運算, 日期和時間, 數值處理。
Null:空值
空值當成無窮大處理,所有空值參與的運算皆爲空。
空值與空值並不相等,因爲空值不能直接運算。
如:prod_price="" 這種寫法是錯的(不要受到corejava的影響)
prod_price=NULL 這種寫法是錯的(不要受到corejava的影響)
prod_price IS NULL 這種寫法纔是對的
NVL:處理空值,把空值轉化爲指定值。可轉化爲日期、字符、數值等三種(注意:轉化時,兩參數必須要同類型)
如:NVL(date, '01-JAN-95') NVL(title,'NO Title Yet') NVL(salary,0)
錯誤寫法:
Select last_name,title,salary*commission_pct/100 COMM From s_emp;--沒提成的人沒法顯示工資
正確寫法:
Select last_name,title,salary*NVL(commission_pct,0)/100 COMM From s_emp;--把提成是空值的轉化爲0
DISTINCT:過濾重複
把重複的行過濾掉;多個字段組合時,只排除組合重複的。
DISTINCT必須使用列名,不能使用計算或者表達式。
所有的聚合函數都可以使用。如果指定列名,則DISTINCT只能用於COUNT(列名),DISTINCT不能用於COUNT(*)。
如:Select Distinct name From s_dept; Select Distinct dept_id,title From s_emp;
文本處理:
TRIM()/LTRIM()/RTIRM():去空格。只能去掉頭和尾的空格,中間的不理。
trim(' heo Are fdou ') --> heo Are fdou
輸入:select trim(' heo Are fdou ') from dual; -->:heo Are fdou
LOWER:轉小寫
lower('SQL Course') --> sql course
UPPER:轉大寫
upper(' SQL Course') --->SQL COURSE
INITCAP:首字母轉大寫,其餘轉小寫
initcap(SQL Course') '--> Sql Course
CONCAT:合成。雙豎線只能在select語句裏面用,這個可用於任何語句。
Concat('Good','String') --> GoodString
SUBSTR:截取。
Substr('String', 1 ,3) --> Str
第一個數字“1”,表示從第幾個開始截取;若要從倒數第幾個開始,用負數,如“-2”表示倒數第2個。
上式中第2個數字“3”表示截取多少個。
LENGTH:統計長度。
Length('String') --> 6
NVL:轉換空值
日期和時間處理:
Oracle日期格式:DD-MMM-YYYY (D代表日期date,M代表月month,Y代表年year)
如:SELECT prod_name (DAY表示完整的星期幾,DY顯示星期的前三個字母)
FROM Products
WHERE prod_time BETWEEN
to_date(’01-JAN-2008’)
AND to_date(’31-DEC-2008’);
日期可以進行加減,默認單位是1天。日期與日期可以相減,得出天數;日期與日期但不能相加。
sysdate -> 系統的當天
Months_Between('01-Sep-95','11-Jan-94') --> 19.774194 相差多少個月,Between裏面也可以填函數。
Add_months('11-Jan-94',6) --> 11-Jul-94 增加多少個月
Next_day('01-Sep-95','Friday') --> '08-Sep-95' 下一個星期五。其中的'Friday'可用6替代,因爲星期日=1
Last_day('01-Sep-95') --> '30-Sep-95' 這個月的最後一天
數值處理:可以運用於代數,三角,幾何
ROUND:四捨五入
Round(45.925,2) -> 45.93 Round(45.925,0) -> 46 Round(45.925,-1) -> 50
逗號前一個數是要處理的數據源,後一個參數表示保留多少位小數。
後一參數是負數時,表示捨去小數點前的幾位,例3是捨去個位及其後的。不寫後一參數時,默認不保留小數。
TRUNC:捨去末位。直接捨去,不會進位。
Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92
日期的舍取:
常用的數值處理函數有:
ABS() 絕對值 ABS(-5741.5854) --> 5741.5854
PI() 圓周率 注意:oracle中不支持 PI()函數;MYSql 支持PI()函數。
SIN() 正統值 Oracle還支持COS()、ASIN()、ACOS()函數
SQRT() 平方根
轉化:
TO_CHAR(number,'fmt'):把數值轉換成字符串
顯示數字的命令
9:正常顯示數字;
0:顯示包括0的數值形式,空位強制補0;
$:以美元符號顯示貨幣;
L:按當前環境顯示相關的貨幣符號;
. 和,:在固定位置出現“.”點 和“,”逗號;不夠位時,四捨五入。
例題:SQL> select 'Order'||To_char(id)||
2 'was filled for a total of'
3 ||To_char(total,'fm$9,999,999')
4 from s_ord
5 where ship_date ='21-SEP-92';
TO_NUMBER(char):把字符轉換成數字
九、鏈接
內鏈接:嚴格匹配兩表的記錄。
外鏈接分左鏈接和右鏈接:
會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,
數據庫會模擬出記錄去和那些不匹配的記錄匹配。
左鏈接 加號在右面
如:有 TABLE1 TABLE2
1的一條記錄在2裏面沒有匹配上,那麼1裏面的記錄保留
2的一條記錄在1裏面沒有匹配上 ,那麼2丟棄
右鏈接正好相反
--例題:哪些人是領導。
select distinct b.id,b.last_name manager
from s_emp a,s_emp b
where a.manager_id=b.id(+);
左右順序有區別,這是另外新建一個表,要顯示的是第二個表格的內容。
+放在沒有匹配行的表一側,令表格能完整顯示出來。
標準寫法:內連接用INNER,左連接用LEFT,右連接用RIGHT。
select distinct b.id,b.last_name manager
from s_emp a LEFT join s_emp b
ON a.manager_id=b.id;
十、組函數:
分組允許將數據分爲多個邏輯組,以便能對每個組進行聚集計算。
Group:分組
Group by:分組。(默認按升序對所分的組排序;想要降序要用 order by)可以包括任意數目的列。
如果嵌入了分組,數據將在最後規定的分組上進行彙總。
GROUP BY 子句中列出的每個列都必須是檢索列或有效的表達式,但不能是聚集函數。
*如果在SELECT 中使用表達式,則必須在GROUP BY子句中指定相同的表達式,不能使用別名。
除聚合計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
如果分組列中具有NULL值,則NULL將作爲一個分組返回。如果列中有多行NULL,它們將分爲一組。
Having:過濾。分組之後,不能再用where,要用having 選擇過濾。Having不能單獨存在,必須跟在group by後面。
WHERE在數據分組前進行過濾,HAVING在數據分組後過濾。
可以在SQL中同時使用 WHERE和HAVING,先執行WHERE,再執行HAVING。
聚合函數:
AVG:平均值 (忽略值爲NULL的行,但不能用 AVG(*))
COUNT:計數 (Count(列)不計算空值;但 COUNT(*)表示統計表中所有行數,包含空值)
MAX:最大值 (忽略列值爲 NULL 的行。但有些DBMS還允許返回文本列中的最大值,
在作用於文本數據時,如果數據按照相應的列排序,則 MAX()返回最後一行。)
MIN:最小值 (忽略值爲 NULL 的行。不能用 MIN(*)。一般是找出數值或者日期值的最小值。
但有些DBMS還允許返回文本列中的最小值,這時返回文本最前一行)
SUM:求和 (忽略值爲 NULL 的值。SUM 不能作用於字符串類型,而 MAX(),MIN()函數能。也不能 SUM(*))
子查詢:查詢語句的嵌套
可以用於任意select 語句裏面,但子查詢不能出現 order by。
子查詢總是從內向外處理。作爲子查詢的SELECT 語句只能查詢單個列,企圖檢索多個列,將會錯誤。
如:找出工資最低的人select min(last_name),min(salary) from s_emp;
或者用子查詢select last_name,salary from s_emp where salary=(select min(salary) from s_emp);
E-R圖:屬性: E(Entity) -R(Relationship)
* (Mandatory marked 強制的) 強制的非空屬性
o (Optional marked 可選的) 可選屬性(可以有值也可以沒有)
#* (Primary marked ) 表示此屬性唯一且非空
約束:針對表中的字段進行定義的。
PK:primary key (主鍵約束,PK=UK+NN)保證實體的完整性,保證記錄的唯一
主鍵約束,唯一且非空,並且每一個表中只能有一個主鍵,有兩個字段聯合作爲主鍵,
只有兩個字段放在一起唯一標識記錄,叫做聯合主鍵(Composite Primary Key)。
FK:foreign key (外建約束)保證引用的完整性,外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值的約束,不能夠取其他值,
只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表);
child table(子表),要想創建子表,就要先創建父表,後創建子表,記錄的插入也是如此,先父表後子表,
刪除記錄,要先刪除子表記錄,後刪除父表記錄,
要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,後刪除父表。
U:unique key(唯一鍵 UK),值爲唯一,不能重複。
在有唯一性約束的列,可以有多個空值,因爲空值不相等。
NN:NOT NULL,不能爲空。
index(索引)是數據庫特有的一類對象,實際應用中一定要考慮索引,view(示圖)
數量關係: 一對一關係
多對一關係
一對多關係
多對多關係
範式:
好處:降低數據冗餘;減少完整性問題;標識實體,關係和表
第一範式(First normal form:1Nf),每一個屬性說一件事情。所有的屬性都必須是單值,也就是屬性只表示單一的意義。
(記錄可以重複,會有大量冗餘,沒有任何限制)
第二範式(2N範式),最少有一個屬性要求唯一且非空PK,其他跟他有關聯(記錄不可重複,但是數據可能會出現冗餘)。
第三範式(3N範式),非主屬性只能依賴於主屬性,不能依賴於其他非主屬性。(解決數據冗餘問題,不能存在推理能得出的數據)
一般情況會做到第三範式。
創建表: Create Table 表名
(字段名1 類型(數據長度)(default ...) 約束條件,
字段名2 類型(數據長度) 約束條件 );
建表的名稱:
必須字母開頭;最多30字符;只能使用“A~Z、a~z、0~9、_、$、#”;
同一目錄下不能有同名的表;表名不能跟關鍵字、特殊含意字符同樣。
如:create table number_1 (n1 number(2,4), n2 number(3,-1), n3 number);
create table t_sd0808(id number(12) primary key,name varchar(30) not null);
MySQL的: create table student (oid int primary key, ACTNO varchar(20) not null unique,
BALANCE double); --MySQL的number類型分小類了,Oracle只有number,且MySQL的數值型不用定大小
Oracle的: create table t_ad (oid number(15) primary key,
ACTNO varchar(20) not null unique,BALANCE number(20));
INSERT:插入(或添加)行到數據庫表中的關鍵字。
插入方式有以下幾種:插入完整的行;插入行的一部分;插入某些查詢的結果。
對於INSERT操作,可能需要客戶機/服務器的DBMS中的特定的安全權限。
插入行(方式一) INSERT INTO products VALUES(2008,’TV’,222.22,’US’);
依賴於表中定義的順序,不提倡使用。有空值時需要自己補上。
插入行(方式二) INSERT INTO products(id,name,price,vend_name) VALUES(2008,’TV’,222.22,’US’);
依賴於邏輯順序,會自動補上空值,提倡使用。
插入檢索出的數據:可以插入多條行到數據庫表中
INSERT INTO products(*,*,*,*)
SELECT *,*,*,*
FROM products_copy;
如果這個表爲空,則沒有行被插入,不會產生錯誤,因爲操作是合法的。
可以使用WHERE加以行過濾。
複製表: 將一個表的內容複製到一個全新的表(在運行中創建,開始可以不存在)
CREATE TABLE 新表名 AS
SELECT *
FROM 表名;
INSERT INTO 與 CREATE TABLE AS SELECT 不同,前者是導入數據,而後者是導入表。
任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY。
可利用聯接從多個表插入數據。不管從多少個表中檢索數據,數據都只能插入到單個表中。
更新數據 UPDATE 語句
需要提供以下信息:要更新的表;列名和新值;確定要更新的哪些行的過濾條件。
UPDATE 表名
SET vend_name = ‘HP’,
prod_name = ‘NEWCOMPUTER’
WHERE vend_name = ‘IBM’;
--UPDATE 語句中可以使用子查詢,使得能用SELECT語句檢索出的數據更新列數據。也可以將一個列值更新爲 NULL。
刪除數據 DELETE 語句
DELETE
FROM products
WHERE prod_name = ‘COMPUTER’;
全行刪除,不要省略WHERE,注意安全。
DELETE不需要列名或通配符。刪除整行而不是刪除列。DELETE是刪除表的內容而不是刪除表。
如果想從表中刪除所有內容,可以使用TRUNCATE TABLE語句(清空表格),它更快。
數字字典表:
Sequence:排列。存儲物理地址
Index:索引。依附於表,爲提高檢索速度。
View:視圖。看到表的一部分數據。
限制數據訪問。簡化查詢。數據獨立性。本質上是一個sql查詢語句。
Create[or Relace][Force|noForce] View 視圖名
[(alias[,alias]…)] 別名列表
As subquery
[With Check Option [Constraint ……]]
[With Read Only]
注意:有些DBMS不允許分組或排序視圖,不能有 Order by 語句。可以有 Select 語句。
刪除視圖: DROP VIEW 視圖名
Rownum:緯列。內存裏排序的前N個。
在where語句中,可以用=1,和<=N 或 <N;但不能用=N 或 >N。
因爲這是內存讀取,沒有1就丟棄再新建1。只能從1開始。需要從中間開始時,需二重子rownum語句需取別名。
經典應用: Top-n Analysis (求前N名或最後N名)
Select [查詢列表], Rownum
From (Select [查詢列表(要對應)]
From 表
Order by Top-N_字段)
Where Rownum <= N
分頁顯示:
--取工資第5~10名的員工(二重子rownum語句,取別名)
select rn,id,last_name,salary
From ( select id,last_name,salary,Rownum rn
From (Select id,last_name,salary
from s_emp
order by salary desc)
where rownum <= 10)
where rn between 5 and 10;
Union:合併表
Select … Union Select… 把兩個Select語句的表合併。
要求兩表的字段數目和類型按順序對應。合併後的表,自動過濾重複的行。
Intersect:交。 同上例,把兩個Select表相交。
Minus:減。 把相交的內容減去。
not exists 除運算。
添加字段(列):
Alter Table 表名
Add (column dataype [Default expr][Not Null]
[,column datatype]…);
添加有非空限制的字段時,要加Default語句
字段名字不可以直接改名,需要添加新字段,再複製舊字段後刪除舊字段。
添加約束: Alter Table 表名
Add [CONSTRAINT constraint] type (column);
添加非空約束時,要用Modify語句。
查看約束名時,可以違反約束再看出錯提示;或者查看約束字典desc user_constraints
減少字段:
Alter Table 表名
Drop (column [,column]…);
刪除約束: Alter Table 表名
Drop CONSTRAINT column;
或: Alter Table 表名
Drop Primary Key Cascade;
暫時關閉約束,並非刪除:
Alter Table 表名
Disable CONSTRAINT column Cascade;
打開剛纔關閉的約束:
Alter Table 表名
Enable CONSTRAINTcolumn;
修改字段:
Alter Table 表名
Modify (column dataype [Default expr][Not Null]
[,column datatype]…);
修改字段的類型、大小、約束、非空限制、空值轉換。
刪除表:
會刪除表的所有數據,所有索引也會刪除,約束條件也刪除,不可以roll back恢復。
Drop Table 表名 [Cascade Constraints];
加 [Cascade Constraints] 把子表的約束條件也刪除;但只加 [Cascade]會把子表也刪除。
改表名:
Rename 原表名 To 新表名;
清空表格:
TRUNCATE TABLE 表名;
相比Delete,Truncate Table清空很快,但不可恢復。清空後釋放內存。
Delete 刪除後可以roll back。清空後不釋放內存。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.