sql與oracle的外連接
❶ sql 連接oracle的幾種方式
1、相等連接
通過兩個表具有相同意義的列,可以建立相等連接條件。
只有連接列上在兩個表中都出現且值相等的行才會出現在查詢結果中。
例 查詢員工信息以及對應的員工所在的部門信息;
SELECT * FROM EMP,DEPT;
SELECT * FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
REM 顯示工資超過2000的員工信息以及對應的員工的部門名稱。
2、
外連接
對於外連接,Oracle中可以使用「(+)」來表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面將配合實例一一介紹。除了顯示匹配相等連接條件的信息之外,還顯示無法匹配相等連接條件的某個表的信息。
外連接採用(+)來識別。
A) 左條件(+) = 右條件;
代表除了顯示匹配相等連接條件的信息之外,還顯示右條件所在的表中無法匹配相等連接條件的信息。
此時也稱為"右外連接".另一種表示方法是:
SELECT ... FROM 表1 RIGHT OUTER JOIN 表2 ON 連接條件
B) 左條件 = 右條件(+);
代表除了顯示匹配相等連接條件的信息之外,還顯示左條件所在的表中無法匹配相等連接條件的信息。
此時也稱為"左外連接".
SELECT ... FROM 表1 LEFT OUTER JOIN 表2 ON 連接條件
例 顯示員工信息以及所對應的部門信息
--無法顯示沒有部門的員工信息
--無法顯示沒有員工的部門信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
--直接做相等連接:
SELECT * FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
REM 顯示員工信息以及所對應的部門信息,顯示沒有員工的部門信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;
SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
REM 顯示員工信息以及所對應的部門信息,顯示沒有部門的員工信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+);
SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;
3、不等連接
兩個表中的相關的兩列進行不等連接,比較符號一般為>,<,...,BETWEEN.. AND..
REM SALGRADE
--DESC SALGRADE;
--SELECT * FROM SALGRADE;
REM 顯示員工的編號,姓名,工資,以及工資所對應的級別。
SELECT EMPNO,ENAME,SAL,SALGRADE.* FROM SALGRADE,EMP
WHERE EMP.SAL BETWEEN LOSAL AND HISAL;
REM 顯示雇員的編號,姓名,工資,工資級別,所在部門的名稱;
SELECT EMPNO,ENAME,SAL,GRADE,DNAME FROM EMP,DEPT,SALGRADE
WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.SAL BETWEEN LOSAL AND HISAL;
4、自連接
自連接是資料庫中經常要用的連接方式,使用自連接可以將自身表的一個鏡像當作另一個表來對待,從而能夠得到一些特殊的數據。下面介紹一下自連接的方法:
將原表復制一份作為另一個表,兩表做笛卡兒相等連接。
例:顯示雇員的編號,名稱,以及該雇員的經理名稱
SELECT WORKER.ENAME,WORKER.MGR,MANAGER.EMPNO,MANAGER.ENAME FROM EMP WORKER,EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO;
❷ 如何使用PL/SQL 11.0連接遠程Oracle12c伺服器
ORACLE客戶端連伺服器注意事項
1. 通SQL*NET協議ORACLE客戶端連伺服器般需要配置sqlnet.oratnsnames.ora,init.ora
默認目錄$ORACLE_HOME/network/admin 目錄
設置環境變數TNS_ADMIN指向想用sqlnet.oratnsnames.ora目錄
例:
TNS_ADMIN=/home/oracle/config/9.0.1;export TNS_ADMIN
sqlnet.ora文件決定找資料庫伺服器別名式
默認參數
參數SQLNET.AUTHENTICATION_SERVICES= (NONE,NTS)表明用戶連接Oracle伺服器使用哪種驗證式NONE表示Oracle身份驗證NTS表示操 作系統身份驗證兩種式並用
ORA_DBA組域用戶本用戶需要Oracle用戶名密碼登錄Oracle且該組用戶登錄資料庫都具SYSDBA許可權(實 例建立類似組ORA_SID_DBA其SID指實例名)同理:ORA_OPER組員具SYSOPER角色許可權
登錄式 sqlplus / as sysdba
或者sqlplus nolog,SQL>connect / as sysdba
NAMES.DEFAULT_DOMAIN = WORLD
NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)
表明解析客戶端連接所用主機字元串式
TNSNAMES表示採用TNSNAMES.ORA文件解析;
ONAMES表示使用自名稱伺服器(Oracle Name Server)解析目前Oracle建議使用輕量目錄訪問協議LDAP取代ONAMES;
HOSTNAME表示使用host文件DNSNIS等解析;
ORACLE客戶端伺服器默認域名需要用#號注釋第行
#NAMES.DEFAULT_DOMAIN = WORLD
使起作用
NAMES.DIRECTORY_PATH指定找伺服器別名順序 (本tnsnames.ora文件, 命名伺服器, 主機名式)
伺服器sqlnet.ora設置檢查客戶端否alive間間隔
sqlnet.expire_time = 10
init.oraRemote_Login_Passwordfile身份驗證影響
三選值:
NONE:默認值指示Oracle系統使用密碼文件通操作系統進行身份驗證特權用戶擁SYSORASYSOPER許可權EXCLUSIVE:
1.表示資料庫實例使用密碼文件
2.允許SYSORASYSOPER許可權賦值給SYS外其用戶
SHARED:
1.表示資料庫實例使用密碼文件
2.允許SYSORASYSOPER許可權賦值給SYS外其用戶
所要操作系統身份登錄Remote_Login_Passwordfile應該設置NONE
登錄用戶ORA_DBA組ORA_OPER組員登錄資料庫需要Oracle創建前操作系統用戶相同用戶名前用戶域用 戶則名稱:domainname\yourname,本計算機用戶則名稱:computername\yourname
創建:
create "domainname\yourname" identified externally;
操作系統修改HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0面添加AUTH_PREFIX_DOMAIN值設FALSE,創建Oracle用戶忽略 掉域名
種式init.ora參數影響資料庫何匹配windows用戶Oracle用戶os_authent_prefix = ""
預設空Oracle8i前該參數使用OPS$作用戶名前綴.(Oracle用戶名度限制30字元)
tnsnames.ora文件寫資料庫伺服器別名詳細內容幾種寫:
# 般寫
APPDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = appdb)
)
)
# 明確標明用dedicated式連接資料庫
APPD=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.35)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=appdb)
(SERVER=DEDICATED)))
# listener埠做均衡負載式連接資料庫
APPS =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1856))
)
(CONNECT_DATA =
(SERVICE_NAME = appdb)
)
)
# 注意:資料庫伺服器用MTS客戶端程序需要用database link明確指明客戶端用dedicated直連式,
# 遇跟布式環境關ORACLE BUG
# 般情況資料庫伺服器用直接連接些除非實資料庫連接數接近1000
2. /etc/hosts (UNIX)
或者windows\hosts(WIN98) winnt\system32\drivers\etc\hosts (WIN2000)
客戶端需要寫入資料庫伺服器IP址主機名應關系
127.0.0.1 localhost
192.168.0.35 oracledb oracledb
192.168.0.45 tomcat tomcat
202.84.10.193 bj_db bj_db
些候我配置第步tnsping 資料庫伺服器別名顯示功
sqlplus username/password@servicename通,jdbc thin link 通候,
定要忘客戶端做步原能DNS伺服器沒設置伺服器IP址主機名應關系
同私IPInternet公IP私IP寫前面公IP寫面
編輯前留備份增加行用復制粘貼避免編輯hosts空格或者tab字元錯誤
3. UNIXORACLE資料庫環境OS客戶端需要配置面兩環境變數
ORACLE_SID=appdb;export ORACLE_SID
TWO_TASK=appdb;export TWO_TASK
指定默認目標資料庫
享:
1
喜歡
0
贈金筆
閱讀(2478)┊ 評論 (0)┊ 收藏(0) ┊禁止轉載 ┊ 喜歡▼ ┊列印┊舉報
已投稿:
排行榜
前篇:Delphi IdHTTP1載文件防止假死
篇:我博客今6歲246我領取元博主徽章北京科蘭
❸ 濡備綍閫氳繃PLSQL榪炴帴oracle鏁版嵁搴
閫氳繃Oracle Net Configuration Assistant錛坥racle緗戠粶閰嶇疆鍔╂墜錛夛紝閰嶇疆鏈鍦扮綉緇滄湇鍔″悕錛屼粠鑰屽疄鐜拌繛鎺oracle鏁版嵁搴
鎸塛indows寰芥爣閿錛岃繘鍏ュ紑濮嬬晫闈錛屾壘鍒癗et Configuration Assistant錛屽崟鍑昏繍琛屼箣
榪涘叆 Oracle Net Configuration Assistant閰嶇疆鍚戝礆紝鍕鵑 鏈鍦扮綉緇滄湇鍔″悕閰嶇疆錛屽崟鍑諱笅涓姝ワ紱 鍦ㄧ綉緇滄湇鍔″悕閰嶇疆涓錛屽嬀閫 娣誨姞錛屽崟鍑諱笅涓姝
杈撳叆鏈嶅姟鍚嶏細dbname錛坥racle鏁版嵁搴撶殑鏈嶅姟鍚嶉氬父鏄鍏ㄥ矓鏁版嵁搴撳悕錛屽嵆杈撳叆鍒涘緩鐨勬暟鎹搴撳悕縐幫級
❹ SQL中的左外連接和+號的用法
SQL中的左外連接和+號的用法
Oracle 左連接、右連接、全外連接、(+)號作用
Oracle 外連接
(1)左外連接 (左邊的表不加限制)
(2)右外連接(右邊的表不加限制)
(3)全外連接(左右兩表都不加限制)
外連接(Outer Join)
outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外連接分為三種: 左外連接,右外連接,全外連接。 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我們省略outer 這個關鍵字。 寫成:LEFT/RIGHT/FULL JOIN。
在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。 如果基表的數據在另一張表沒有記錄。 那麼在相關聯的結果集行中列顯示為空值(NULL)。
對於外連接, 也可以使用「(+) 」來表示。 關於使用(+)的一些注意事項:
1.(+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
2. 當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
3.(+)操作符只適用於列,而不能用在表達式上。
4.(+)操作符不能與or和in操作符一起使用。
5.(+)操作符只能用於實現左外連接和右外連接,而不能用於實現完全外連接。
在做實驗之前,我們先將dave表和bl里加一些不同的數據。 以方便測試。
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 懷寧
SQL> select * from dave;
ID NAME
---------- ----------
8 安慶
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
2.1 左外連接(Left outer join/ left join)
left join是以左表的記錄為基礎的,示例中Dave可以看成左表,BL可以看成右表,它的結果集是Dave表中的數據,在加上Dave表和BL表匹配的數據。換句話說,左表(Dave)的記錄將會全部表示出來,而右表(BL)只會顯示符合搜索條件的記錄。BL表記錄不足的地方均為NULL.
示例:
SQL> select * from dave a left join bl b on a.id = b.id;
ID NAME ID NAME
--------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm -- 此處B表為null,因為沒有匹配到
8 安慶 -- 此處B表為null,因為沒有匹配到
SQL> select * from dave a left outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在右表,左表就是全部顯示,故是左連接。
SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用關鍵字where
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
2.2 右外連接(right outer join/ right join)
和left join的結果剛好相反,是以右表(BL)為基礎的, 顯示BL表的所以記錄,在加上Dave和BL 匹配的結果。 Dave表不足的地方用NULL填充.
示例:
SQL> select * from dave a right join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
SQL> select * from dave a right outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在左表,右表就是全部顯示,故是右連接。
SQL> Select * from dave a,bl b where a.id(+)=b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧
2.3 全外連接(full outer join/ full join)
左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null 填充。 全外連接不支持(+)這種寫法。
示例:
SQL> select * from dave a full join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 懷寧
已選擇9行。
SQL> select * from dave a full outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
最初由 ghc_x 發布
[B]有兩個表T1和T2,兩個表除了主鍵索引外均無其他索引,這兩個表由T1.F1(主鍵),T2.F2(主鍵)進行左連接,SQL語句有兩種寫法:
1. SELECT * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
當查看1的執行計劃時發現T1為全表掃描,T2為索引掃描。
當查看2的執行計劃時發現兩個表均為全表掃描。
有人知道這是為什麼嗎? [/B]
我一直以來也是認為這兩種寫法是一樣的,沒想到樓主特意去看了它們的執行計劃,而且發現了它們的不同,這使得我比較驚訝。
按照書上的講法,這兩種寫法是沒有什麼區別的,後一種寫法只不過是前一種寫法的新版本。
為什麼兩者的執行計劃會不一樣呢?
我仔細看了一下兩者的執行計劃,發現了為什麼後一種要兩個表都全表 掃描,而前一個表有一個索引掃描。
原來前者選擇的優化器是RULE,而後者選擇的優化器是CBO的ALL ROWS。
不過,似乎要後者的效率高。
1. SELECT /*+RULE*/ * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT /*+RULE*/ * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
這樣再看下執行計劃吧