from http://www.dofactory.com/sql/full-outer-join



SQL FULL JOIN Statement

  • FULL JOIN returns all matching records from both tables whether the other table matches or not.
  • FULL JOIN can potentially return very large datasets.
  • FULL JOIN and FULL OUTER JOIN are the same.



The SQL FULL JOIN syntax


The general syntax is: 

  1. SELECT column-names
  2. FROM table-name1 FULL JOIN table-name2
  3. ON column-name1 = column-name2
  4. WHERE condition


The general FULL OUTER JOIN syntax is: 

  1. SELECT column-names
  2. FROM table-name1 FULL OUTER JOIN table-name2
  3. ON column-name1 = column-name2
  4. WHERE condition





SQL FULL JOIN Examples



Problem: Match all customers and suppliers by country 


  1. SELECT C.FirstName, C.LastName, C.Country AS CustomerCountry,
  2. S.Country AS SupplierCountry, S.CompanyName
  3. FROM Customer C FULL JOIN Supplier S
  4. ON C.Country = S.Country
  5. ORDER BY C.Country, S.Country


This returns suppliers that have no customers in their country, 
and customers that have no suppliers in their country, 
and customers and suppliers that are from the same country. 

Results: 195 records 

FirstNameLastNameCustomerCountrySupplierCountryCompanyName
NULLNULLNULLAustraliaPavlova, Ltd.
NULLNULLNULLAustraliaG'day, Mate
NULLNULLNULLJapanTokyo Traders
NULLNULLNULLJapanMayumi's
NULLNULLNULLNetherlandsZaanse Snoepfabriek
NULLNULLNULLSingaporeLeka Trading
PatricioSimpsonArgentinaNULLNULL
YvonneMoncadaArgentinaNULLNULL
SergioGutiérrezArgentinaNULLNULL
GeorgPippsAustriaNULLNULL
RolandMendelAustriaNULLNULL
PascaleCartrainBelgiumNULLNULL
CatherineDeweyBelgiumNULLNULL
BernardoBatistaBrazilBrazilRefrescos Americanas LTDA
LúciaCarvalhoBrazilBrazilRefrescos Americanas LTDA
JaneteLimeiraBrazilBrazilRefrescos Americanas LTDA
AriaCruzBrazilBrazilRefrescos Americanas LTDA
AndréFonsecaBrazilBrazilRefrescos Americanas LTDA
MarioPontesBrazilBrazilRefrescos Americanas LTDA
PedroAfonsoBrazilBrazilRefrescos Americanas LTDA
PaulaParenteBrazilBrazilRefrescos Americanas LTDA
AnabelaDominguesBrazilBrazilRefrescos Americanas LTDA
ElizabethLincolnCanadaCanadaMa Maison
ElizabethLincolnCanadaCanadaForêts d'érables
YoshiTannamuriCanadaCanadaMa Maison
YoshiTannamuriCanadaCanadaForêts d'érables
JeanFresnièreCanadaCanadaMa Maison





from https://www.tutorialspoint.com/sql/sql-full-joins.htm


The SQL FULL JOIN combines the results of both left and right outer joins.

The joined table will contain all records from both the tables and fill in NULLs for missing matches on either side.

Syntax

The basic syntax of a FULL JOIN is as follows −

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

Here, the given condition could be any given expression based on your requirement.

Example

Consider the following two tables.

Table 1 − CUSTOMERS Table is as follows.

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

Table 2 − ORDERS Table is as follows.

+-----+---------------------+-------------+--------+
|OID  | DATE                | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

Now, let us join these two tables using FULL JOIN as follows.

SQL> SELECT  ID, NAME, AMOUNT, DATE
   FROM CUSTOMERS
   FULL JOIN ORDERS
   ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

This would produce the following result −

+------+----------+--------+---------------------+
| ID   | NAME     | AMOUNT | DATE                |
+------+----------+--------+---------------------+
|    1 | Ramesh   |   NULL | NULL                |
|    2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|    3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|    3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|    4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
|    5 | Hardik   |   NULL | NULL                |
|    6 | Komal    |   NULL | NULL                |
|    7 | Muffy    |   NULL | NULL                |
|    3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|    3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|    2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|    4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+

If your Database does not support FULL JOIN (MySQL does not support FULL JOIN), then you can use UNION ALL clause to combine these two JOINS as shown below.

SQL> SELECT  ID, NAME, AMOUNT, DATE
   FROM CUSTOMERS
   LEFT JOIN ORDERS
   ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION ALL
   SELECT  ID, NAME, AMOUNT, DATE
   FROM CUSTOMERS
   RIGHT JOIN ORDERS
   ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID





Quest 사의 Toad 가 앱스토어에??

제가 처음 현업에 왔을때, 어느 개발자든간에 깔려있던 툴이 있었습니다. 바로Quest 사의 Toad!

그때 당시에는 라이센스에 대한 개념들이 지금보다 더 없었던때인지라; 무료 유료를 생각하지도 않고 그냥 주니까 잘 깔아서 썼죠. 기능도 좋았습니다.

허나 나중에 보니 이게 가격이 꽤나 비싼 툴이란걸 알았죠; 그러면서 Toad 말고 무료를 찾아서 대충 때우면 살아왔습니다. 지금이야 sql developer 가 워낙 좋아져서? 괜찮았지만 초기에는 쓸만한 제품을 찾는것도 쉽지 않았습니다.

오늘 우연히 맥 앱스토어 들어갔다가... 카테고리 란에 어디서 많이본 두꺼비 모양이 있는걸 봤습니다.

예.. 바로 Toad 입니다. 맥 앱 스토어 링크







혹시나 해서 들어갔더니, Toad 가 맞고, 거기에 무려... 무료 입니다 무료. 물론 고급기능은 빠졌을 수 있으나, 설치하고 테스트 해보니 이거 쓸만해 보입니다. 앞으로 이걸 써보려고 합니다.

시작할때 뜨는 화면중에 .. Dell .. 이 나와서 확인해보니, 이미 몇년전에 Dell 에서 Quest 를 인수했었군요?

참고로 쿼리를 날리면 숫자가 ',' 단위로 끊어서 보여줍니다. 이건 옵션에 가셔서 Grid Options 에 가서 Data and number format 의 Digit grouping symbol 을 none 으로 해놓으시면 됩니다. 

여하튼 Dell 에 감사를!





SQL DEVELOPER 를 한국어 OS 에서 실행하면 각종 명령들이 한글로 나온다.

SQL 포맷을 맞추는걸 하고 실행하고 싶어도 번역된 단어가 뭔지 모르면 뭘 할 수 가 없다. 차라리 안하는게 나을까 -ㅅ-;?

format 을 형식으로 번역했고, 키맵핑에서 형식으로 검색하면된다. 거기에 키맵핑해두면된다.

사실 윈도버전은 ctrl+f7 로 이미 되어있는걸로 기억하는데, 맥은 키 맵핑이 안되어있다 -ㅅ-; 해서 맵핑하려고 찾다보면 혈압오른다 -ㅅ-; 



이게 참...
jdk 1.7버전을 사용하면 나오는 문제이다. 이게 왜이렇나 했음.

1. jdk 1.6을 설치한다.

2. /opt/sqldeveloper/sqldeveloper/bin ... 즉 자신이 설치한 sqldeveloper 위치로 가서 해당 위치로 이동한다.

3. sqldeveloper.conf 를 열어서 SetJavaHome 값을 jdk 1.6설치한 홈디렉토리로 해놓는다.
ex) SetJavaHome /opt/jdk1.6.0_32

4. 해본다.. -ㅅ- 본인의 경우는 50개 넘게 이제 잘 나온다... 


근데 이제 또 문제가 생기는분들이 있는데 .. 한그리 깨지는거; 그건 따로 올려놓은 포스팅을 보고 해결하라.

깨지는 이유는 jdk 를 바꾼것의 영향을 받은 결과이다. jdk에 뭔가 설정이 필요하다.



from http://chuudok.cafe24.com/blog/246

1. ttf-unfonts를 설치 한다.
sudo apt-get install ttf-unfonts
--> 하면 안될수 있다. 패키지가 이제 존재 하지 않나보다. 우선 저렇게 하면 2개가 나오는데 core, extra 를 발견했다고 나온다.
      각각을 설치하자. 

2. 소프트링크로 sqldeveloper 가 사용할 jdk 이하 jre/lib/fonts  에 위에설치한 폰트디렉토리를 소프트링크 생성한다.
ex) sudo ln -s 
/usr/share/fonts/truetype/unfonts-core /opt/jdk  /opt/jdk1.6.0_32/jre/lib/fonts/fallback

해놓으면된다. 만약 extra를 하겠다면 core 대신 그걸로 소프트링크 만들어도 된다.


SELECT * 

FROM

(

SELECT '10' 원본컬럼값,'100' 컬럼2  FROM dual UNION ALL 

SELECT '20' 원본컬럼값,null 컬럼2  FROM dual UNION ALL

SELECT '30' 원본컬럼값,'300' 컬럼2  FROM dual

);

결과

원본컬럼값    컬럼2

--------------------

10         100

20         (null)

30         300


흐음.. 이런식으로 테스트용도의 테이블 형태 구조 생성 가능


from SQL의 컨셉 책...

http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=183005
 


SELECT TO_CHAR(yyyymmdd, 'YYYYMMDD') yyyymmdd 

  FROM ( 
        SELECT start_date + level - 1 yyyymmdd 
          FROM (SELECT TO_DATE('20110101', 'YYYYMMDD') start_date, TO_DATE('20111231', 'YYYYMMDD') end_date FROM DUAL) 
        CONNECT BY level <= end_date - start_date + 1 
      ) 
 WHERE TO_CHAR(yyyymmdd, 'd') in (1,7)

mysql 을 db로 하고 jdbc로 접속하여 insert 를 한다고 가정하자.


이런 경우는 토비의 스프링의 예제로 나오는데 ... 그대로 생성했다간

Exception in thread "main" java.sql.SQLException: Incorrect string value: '\xEB\xB0\xB1\xEA\xB8\xB0...' for column 'name' at row 1
이런 에러가 나와버린다. 딱봐도... 한글캐릭터 문제인데, 토비의 예제에서 접속캐릭터셋을 UTF8 로 해놓은걸 볼 수 있다.

해서 찾아보니... 생성시에 해당 컬럼에 대해서 문제셋지정이 가능했다. 아래와같이 처리해서 테스트 결과는 성공.

create table users (
id varchar(10) primary key,
name varchar(20) character set utf8 not null,
password varchar(10) not null
)


이게 아니면 varchar 대신 다른 타입을 써도된다. 다만... 그렇게 큰 타입을 지정할 필요가 있을지 의문된다면 위와같이 처리해도 된다. 


+ Recent posts