?? 02. sql note.txt
字號:
外鏈接分左鏈接和右鏈接:
會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,
數(shù)據(jù)庫會模擬出記錄去和那些不匹配的記錄匹配。
左鏈接 加號在右面
如:有 TABLE1 TABLE2
1的一條記錄在2里面沒有匹配上,那么1里面的記錄保留
2的一條記錄在1里面沒有匹配上 ,那么2丟棄
右鏈接正好相反
--例題:哪些人是領(lǐng)導(dǎo)。
select distinct b.id,b.last_name manager
from s_emp a,s_emp b
where a.manager_id=b.id(+);
左右順序有區(qū)別,這是另外新建一個表,要顯示的是第二個表格的內(nèi)容。
+放在沒有匹配行的表一側(cè),令表格能完整顯示出來。
標(biāo)準(zhǔn)寫法:內(nèi)連接用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;
十、組函數(shù):
分組允許將數(shù)據(jù)分為多個邏輯組,以便能對每個組進行聚集計算。
Group:分組
Group by:分組。(默認(rèn)按升序?qū)λ值慕M排序;想要降序要用 order by)可以包括任意數(shù)目的列。
如果嵌入了分組,數(shù)據(jù)將在最后規(guī)定的分組上進行匯總。
GROUP BY 子句中列出的每個列都必須是檢索列或有效的表達式,但不能是聚集函數(shù)。
*如果在SELECT 中使用表達式,則必須在GROUP BY子句中指定相同的表達式,不能使用別名。
除聚合計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列中有多行NULL,它們將分為一組。
Having:過濾。分組之后,不能再用where,要用having 選擇過濾。Having不能單獨存在,必須跟在group by后面。
WHERE在數(shù)據(jù)分組前進行過濾,HAVING在數(shù)據(jù)分組后過濾。
可以在SQL中同時使用 WHERE和HAVING,先執(zhí)行WHERE,再執(zhí)行HAVING。
聚合函數(shù):
AVG:平均值 (忽略值為NULL的行,但不能用 AVG(*))
COUNT:計數(shù) (Count(列)不計算空值;但 COUNT(*)表示統(tǒng)計表中所有行數(shù),包含空值)
MAX:最大值 (忽略列值為 NULL 的行。但有些DBMS還允許返回文本列中的最大值,
在作用于文本數(shù)據(jù)時,如果數(shù)據(jù)按照相應(yīng)的列排序,則 MAX()返回最后一行。)
MIN:最小值 (忽略值為 NULL 的行。不能用 MIN(*)。一般是找出數(shù)值或者日期值的最小值。
但有些DBMS還允許返回文本列中的最小值,這時返回文本最前一行)
SUM:求和 (忽略值為 NULL 的值。SUM 不能作用于字符串類型,而 MAX(),MIN()函數(shù)能。也不能 SUM(*))
子查詢:查詢語句的嵌套
可以用于任意select 語句里面,但子查詢不能出現(xiàn) order by。
子查詢總是從內(nèi)向外處理。作為子查詢的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)保證實體的完整性,保證記錄的唯一
主鍵約束,唯一且非空,并且每一個表中只能有一個主鍵,有兩個字段聯(lián)合作為主鍵,
只有兩個字段放在一起唯一標(biāo)識記錄,叫做聯(lián)合主鍵(Composite Primary Key)。
FK:foreign key (外建約束)保證引用的完整性,外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值的約束,不能夠取其他值,
只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表);
child table(子表),要想創(chuàng)建子表,就要先創(chuàng)建父表,后創(chuàng)建子表,記錄的插入也是如此,先父表后子表,
刪除記錄,要先刪除子表記錄,后刪除父表記錄,
要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,后刪除父表。
U:unique key(唯一鍵 UK),值為唯一,不能重復(fù)。
在有唯一性約束的列,可以有多個空值,因為空值不相等。
NN:NOT NULL,不能為空。
index(索引)是數(shù)據(jù)庫特有的一類對象,實際應(yīng)用中一定要考慮索引,view(示圖)
數(shù)量關(guān)系: 一對一關(guān)系
多對一關(guān)系
一對多關(guān)系
多對多關(guān)系
范式:
好處:降低數(shù)據(jù)冗余;減少完整性問題;標(biāo)識實體,關(guān)系和表
第一范式(First normal form:1Nf),每一個屬性說一件事情。所有的屬性都必須是單值,也就是屬性只表示單一的意義。
(記錄可以重復(fù),會有大量冗余,沒有任何限制)
第二范式(2N范式),最少有一個屬性要求唯一且非空PK,其他跟他有關(guān)聯(lián)(記錄不可重復(fù),但是數(shù)據(jù)可能會出現(xiàn)冗余)。
第三范式(3N范式),非主屬性只能依賴于主屬性,不能依賴于其他非主屬性。(解決數(shù)據(jù)冗余問題,不能存在推理能得出的數(shù)據(jù))
一般情況會做到第三范式。
創(chuàng)建表: Create Table 表名
(字段名1 類型(數(shù)據(jù)長度)(default ...) 約束條件,
字段名2 類型(數(shù)據(jù)長度) 約束條件 );
建表的名稱:
必須字母開頭;最多30字符;只能使用“A~Z、a~z、0~9、_、$、#”;
同一目錄下不能有同名的表;表名不能跟關(guān)鍵字、特殊含意字符同樣。
如: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的數(shù)值型不用定大小
Oracle的: create table t_ad (oid number(15) primary key,
ACTNO varchar(20) not null unique,BALANCE number(20));
INSERT:插入(或添加)行到數(shù)據(jù)庫表中的關(guān)鍵字。
插入方式有以下幾種:插入完整的行;插入行的一部分;插入某些查詢的結(jié)果。
對于INSERT操作,可能需要客戶機/服務(wù)器的DBMS中的特定的安全權(quán)限。
插入行(方式一) INSERT INTO products VALUES(2008,’TV’,222.22,’US’);
依賴于表中定義的順序,不提倡使用。有空值時需要自己補上。
插入行(方式二) INSERT INTO products(id,name,price,vend_name) VALUES(2008,’TV’,222.22,’US’);
依賴于邏輯順序,會自動補上空值,提倡使用。
插入檢索出的數(shù)據(jù):可以插入多條行到數(shù)據(jù)庫表中
INSERT INTO products(*,*,*,*)
SELECT *,*,*,*
FROM products_copy;
如果這個表為空,則沒有行被插入,不會產(chǎn)生錯誤,因為操作是合法的。
可以使用WHERE加以行過濾。
復(fù)制表: 將一個表的內(nèi)容復(fù)制到一個全新的表(在運行中創(chuàng)建,開始可以不存在)
CREATE TABLE 新表名 AS
SELECT *
FROM 表名;
INSERT INTO 與 CREATE TABLE AS SELECT 不同,前者是導(dǎo)入數(shù)據(jù),而后者是導(dǎo)入表。
任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY。
可利用聯(lián)接從多個表插入數(shù)據(jù)。不管從多少個表中檢索數(shù)據(jù),數(shù)據(jù)都只能插入到單個表中。
更新數(shù)據(jù) UPDATE 語句
需要提供以下信息:要更新的表;列名和新值;確定要更新的哪些行的過濾條件。
UPDATE 表名
SET vend_name = ‘HP’,
prod_name = ‘NEWCOMPUTER’
WHERE vend_name = ‘IBM’;
--UPDATE 語句中可以使用子查詢,使得能用SELECT語句檢索出的數(shù)據(jù)更新列數(shù)據(jù)。也可以將一個列值更新為 NULL。
刪除數(shù)據(jù) DELETE 語句
DELETE
FROM products
WHERE prod_name = ‘COMPUTER’;
全行刪除,不要省略WHERE,注意安全。
DELETE不需要列名或通配符。刪除整行而不是刪除列。DELETE是刪除表的內(nèi)容而不是刪除表。
如果想從表中刪除所有內(nèi)容,可以使用TRUNCATE TABLE語句(清空表格),它更快。
數(shù)字字典表:
Sequence:排列。存儲物理地址
Index:索引。依附于表,為提高檢索速度。
View:視圖??吹奖淼囊徊糠?jǐn)?shù)據(jù)。
限制數(shù)據(jù)訪問。簡化查詢。數(shù)據(jù)獨立性。本質(zhì)上是一個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èi)存里排序的前N個。
在where語句中,可以用=1,和<=N 或 <N;但不能用=N 或 >N。
因為這是內(nèi)存讀取,沒有1就丟棄再新建1。只能從1開始。需要從中間開始時,需二重子rownum語句需取別名。
經(jīng)典應(yīng)用: Top-n Analysis (求前N名或最后N名)
Select [查詢列表], Rownum
From (Select [查詢列表(要對應(yīng))]
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語句的表合并。
要求兩表的字段數(shù)目和類型按順序?qū)?yīng)。合并后的表,自動過濾重復(fù)的行。
Intersect:交。 同上例,把兩個Select表相交。
Minus:減。 把相交的內(nèi)容減去。
not exists 除運算。
添加字段(列):
Alter Table 表名
Add (column dataype [Default expr][Not Null]
[,column datatype]…);
添加有非空限制的字段時,要加Default語句
字段名字不可以直接改名,需要添加新字段,再復(fù)制舊字段后刪除舊字段。
添加約束: 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;
暫時關(guān)閉約束,并非刪除:
Alter Table 表名
Disable CONSTRAINT column Cascade;
打開剛才關(guān)閉的約束:
Alter Table 表名
Enable CONSTRAINTcolumn;
修改字段:
Alter Table 表名
Modify (column dataype [Default expr][Not Null]
[,column datatype]…);
修改字段的類型、大小、約束、非空限制、空值轉(zhuǎn)換。
刪除表:
會刪除表的所有數(shù)據(jù),所有索引也會刪除,約束條件也刪除,不可以roll back恢復(fù)。
Drop Table 表名 [Cascade Constraints];
加 [Cascade Constraints] 把子表的約束條件也刪除;但只加 [Cascade]會把子表也刪除。
改表名:
Rename 原表名 To 新表名;
清空表格:
TRUNCATE TABLE 表名;
相比Delete,Truncate Table清空很快,但不可恢復(fù)。清空后釋放內(nèi)存。
Delete 刪除后可以roll back。清空后不釋放內(nèi)存。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -