Skip to content

Latest commit

Β 

History

History

06. Basic SQL

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 
Β 
Β 
  1. Basic SQL
  2. Practice

Basic SQL

SQL의 μ œμ•½ 쑰건 지정

NOT NULL, DEFAULT

μ†μ„±μ—μ„œμ˜ NOT NULL μ œμ•½ 쑰건은 κ·Έ 속성에 λŒ€ν•΄ NULL 값이 ν—ˆλ½λ˜μ§€ μ•ŠμŒμ„ λͺ…μ‹œν•œλ‹€. 달리 λ§ν•˜λ©΄, μ œμ•½μ‘°κ±΄μ€ κ·Έ μ†μ„±μ˜ λ„λ©”μΈμ—μ„œ NULL 값을 μ œμ™Έμ‹œν‚¨λ‹€.

  • 기본적으둜 PKλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ• νŠΈλ¦¬λ·°νŠΈλŠ” NULL을 ν—ˆμš©ν•¨
    • FK도 NULL 값을 κ°€μ§ˆ 수 있음
    • PK 속성듀은 NULL 값을 갖지 μ•Šκ³  μœ μΌν•¨
  • NOT NULL μ œμ•½μ‘°κ±΄μ„ μ§€μ •ν•˜μ—¬ μ• νŠΈλ¦¬λ·°νŠΈμ— NULL 값을 ν—ˆμš©ν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있음
    •  CREATE TABLE DEPARTMENT (DNUMBER INT NOT NULL, ... );
  • DEFAULT 문을 μ΄μš©ν•˜μ—¬ μ• νŠΈλ¦¬λ·°νŠΈμ˜ λ””ν΄νŠΈ 값을 λͺ…μ‹œ
    •  CREATE TABLE EMPLOYEE (DNO INT DEFAULT 1, ... );

SQLμ—μ„œμ˜ κΈ°λ³Έ 검색 질의

SQL ν‘œν˜„μ˜ κΈ°λ³Έ κ΅¬μ‘°λŠ” SELECT, FROM, WHERE의 μ„Έ 개의 절둜 이루어진닀. μ§ˆμ˜λŠ” FROM μ ˆμ— λ‚˜μ—΄λœ λ¦΄λ ˆμ΄μ…˜λ“€μ„ μž…λ ₯으둜 λ°›κ³ , WHEREκ³Ό SELECT μ ˆμ— λͺ…μ‹œλœ λ™μž‘μ„ μˆ˜ν–‰ν•΄ 결과둜 λ¦΄λ ˆμ΄μ…˜μ„ λ§Œλ“€μ–΄ λ‚Έλ‹€.

  • SQL은 SQL ν‘œν˜„μ˜ κ²°κ³Όμ—μ„œ 뿐만 μ•„λ‹ˆλΌ λ¦΄λ ˆμ΄μ…˜μ—λ„ 쀑볡을 ν—ˆμš©ν•œλ‹€.
    • 쀑볡이 μ œκ±°λ˜λ„λ‘ ν•˜κ³  싢은 κ²½μš°μ—λŠ” SELECT 뒀에 DISTINCTλΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ‚½μž…ν•œλ‹€.
    • DISTINCTλŠ” 질의 κ²°κ³Όμ—μ„œ μœ μΌν•œ νŠœν”Œλ“€λ§Œ λ‚¨κΈ°λΌλŠ” 의미의 ν‚€μ›Œλ“œμž„
      • λ§Œμ•½ SELECT DISTINCT DEPT_NAME, SALARY ꡬ문이면, SALARYλŠ” DISTINCT 효과λ₯Ό 받지 μ•Šκ³ , DEPT_NAMEμ—μ„œ κ²ΉμΉ˜λŠ” 것듀쀑 λ¨Όμ € λ‚˜μ˜¨ νŠœν”Œλ§Œ 좜λ ₯λœλ‹€.

JOIN의 μ’…λ₯˜

JOIN (쑰인)μ΄λž€?

두 개 μ΄μƒμ˜ ν…Œμ΄λΈ”μ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ—°κ²°ν•˜μ—¬ ν•˜λ‚˜λ‘œ λ§Œλ“€κ³ , 데이터λ₯Ό κ²€μƒ‰ν•˜λŠ” 방법

  1. Inner Join
  2. Outer Join
  3. Cross Join
  4. Self Join
  5. Anti Join
  6. Semi Join

Inner Join

  • κ΅μ§‘ν•©μœΌλ‘œ, κΈ°μ€€ ν…Œμ΄λΈ”κ³Ό 쑰인할 ν…Œμ΄λΈ”μ˜ μ€‘λ³΅λœ 값을 보여쀀닀.

SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
  • 문법 1 : λͺ…μ‹œμ  쑰인 ν‘œν˜„ (Explicit Notation)
    • ν…Œμ΄λΈ”μ— 쑰인을 ν•˜λΌλŠ” 것을 μ§€μ •ν•˜κΈ° μœ„ν•΄ 'JOIN' ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  ON의 ν‚€μ›Œλ“œλ₯Ό 쑰인에 λŒ€ν•œ ꡬ문을 μ§€μ •ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.
    •  SELECT * FROM EMPLOYEE
       INNER JOIN DEPARTMENT
       ON EMPLOYEE.DepartmentID = DEPARTMENT.DepartmentID;
  • 문법 2 : μ•”μ‹œμ  쑰인 ν‘œν˜„ (Implicit Notation)
    • SELECT ꡬ문의 FROMμ ˆμ—μ„œ 콀마(,)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹¨μˆœνžˆ 쑰인을 μœ„ν•œ μ—¬λŸ¬ ν…Œμ΄λΈ”μ„ λ‚˜μ—΄ν•œλ‹€.
    • SELECT * FROM EMPLOYEE, DEPARTMENT
      WHERE EMPLOYEE.DepartmentID = DEPARTMENT.DepartmentID;

Equi Join

  • EQUAL μ—°μ‚°μž(=)λ₯Ό μ‚¬μš©ν•΄μ„œ Equi Join이라고 ν•œλ‹€.Β WHERE μ ˆμ— κΈ°μˆ λ˜λŠ” JOIN 쑰건을 κ²€μ‚¬ν•΄μ„œ μ–‘μͺ½ ν…Œμ΄λΈ”μ— 같은 쑰건의 값이 μ‘΄μž¬ν•  경우 ν•΄λ‹Ή 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 쑰인 방법이닀.

Natural Join

  • Natural Join은 Equi Join의 κ²°κ³Όμ—μ„œ μ€‘λ³΅λ˜λŠ” 속성(λ™μΌν•œ 이름과 νƒ€μž…)을 μ œκ±°ν•œ λ¦΄λ ˆμ΄μ…˜μ΄λ‹€.
    • λ™μΌν•œ 이름을 κ°–λŠ” 칼럼이 μžˆμ§€λ§Œ, 데이터 νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
  • 쑰인 쑰건이 ν•„μš” μ—†λ‹€.

Outer Join

Outer Joinμ΄λž€ 쑰인 μ‘°κ±΄μ—μ„œ λ™μΌν•œ 값이 μ—†λŠ” 행도 λ°˜ν™˜ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

Left Outer Join

  • κΈ°μ€€ν…Œμ΄λΈ”κ°’κ³Ό μ‘°μΈν…Œμ΄λΈ”κ³Ό μ€‘λ³΅λœ 값을 보여쀀닀.
  • μ™Όμͺ½ν…Œμ΄λΈ” κΈ°μ€€μœΌλ‘œ JOIN을 ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€.
  • λ§€μΉ­λ˜λŠ” 데이터가 μ—†λŠ” 경우 NULL을 ν‘œμ‹œν•œλ‹€.
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

Right Outer Join

  • LEFT OUTER JOINκ³ΌλŠ” λ°˜λŒ€λ‘œ 였λ₯Έμͺ½ ν…Œμ΄λΈ” κΈ°μ€€μœΌλ‘œ JOINν•˜λŠ” 것이닀. LEFT의 λ°˜λŒ€ 버전.
  • λ§€μΉ­λ˜λŠ” 데이터가 μ—†λŠ” 경우 NULL을 ν‘œμ‹œν•œλ‹€.
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

Full Outer Join

  • 합집합을 λ§ν•œλ‹€. A와 B ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터가 κ²€μƒ‰λœλ‹€. λ§€μΉ­λ˜λŠ” 데이터가 μ—†λŠ” 경우 NULL을 ν‘œμ‹œν•œλ‹€.
  • MySQLμ—μ„œλŠ” Full Join을 μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ, UNION ꡬ문으둜 κ΅¬ν˜„ν•  수 μžˆλ‹€.
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

Cross Join

  • Cross Join은 λͺ¨λ“  경우의 수λ₯Ό μ „λΆ€ ν‘œν˜„ν•΄μ£ΌλŠ” 방식이닀.
  • Cartesian Product(μΉ΄λ””μ…˜ κ³±)이라고도 ν•˜λ©° μ‘°μΈλ˜λŠ” 두 ν…Œμ΄λΈ”μ—μ„œ 곱집합을 λ°˜ν™˜ν•œλ‹€.
    • 예λ₯Ό λ“€μ–΄ m열을 가진 ν…Œμ΄λΈ”κ³Ό n열을 가진 ν…Œμ΄λΈ”μ΄ ꡐ차 쑰인되면 m*n 개의 열을 μƒμ„±ν•œλ‹€.
SELECT
A.NAME, B.AGE
FROM TABLE_A A, TABLE_A B

Self Join

  • Self Join은 자기 μžμ‹ κ³Ό 자기 μžμ‹ μ„ μ‘°μΈν•˜λŠ” κ²ƒμœΌλ‘œ, ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ„ μ—¬λŸ¬λ²ˆ λ³΅μ‚¬ν•΄μ„œ μ‘°μΈν•œλ‹€κ³  μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€. 같은 ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— ν…Œμ΄λΈ”μ— λ°˜λ“œμ‹œ 별λͺ…을 λΆ™μ—¬μ•Όν•œλ‹€.
    • λͺ…λ Ήμ–΄κ°€ λ”°λ‘œ μžˆλŠ”κ²Œ μ•„λ‹ˆλΌ outer join이던 inner join이던 자기 μžμ‹ μ˜ ν…Œμ΄λΈ”κ³Ό 쑰인할 경우 SELF JOIN이라고 μƒκ°ν•˜λ©΄ λœλ‹€.
  • μžμ‹ μ΄ 가지고 μžˆλŠ” μΉΌλŸΌμ„ λ‹€μ–‘ν•˜κ²Œ λ³€ν˜•μ‹œμΌœ ν™œμš©ν•  κ²½μš°μ— 자주 μ‚¬μš©λœλ‹€.

Anti Join

  • Anti Join은 μ„œλΈŒ 쿼리 κ²°κ³Όμ—λŠ” μ—†λŠ” 메인 쿼리 κ²°κ³Ό λ°μ΄ν„°λ§Œ μΆ”μΆœν•˜λŠ” 쑰인이닀. (Semi Joinκ³Ό λ°˜λŒ€)
    • ν•œμͺ½ ν…Œμ΄λΈ”μ—λ§Œ μžˆλŠ” 데이터λ₯Ό μΆ”μΆœν•œλ‹€.
    • NOT INμ΄λ‚˜ NOT EXISTS μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€.
SELECT *
FROM employee a, department b WHERE a.dno = b.dnumber AND a.dno
NOT IN
      ( SELECT dnumber
      FROM department
      WHERE mgr_ssn IS NULL) ;

Semi Join

  • Semi Join은 μ„œλΈŒ 쿼리 κ²°κ³Όμ—μ„œ μ‘΄μž¬ν•˜λŠ” 메인 쿼리 κ²°κ³Ό λ°μ΄ν„°λ§Œ μΆ”μΆœν•˜λŠ” 쑰인이닀. (Anti Joinκ³Ό λ°˜λŒ€)
    • INμ΄λ‚˜ EXISTS μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€.
SELECT *
FROM employee a, department b WHERE a.dno = b.dnumber AND a.dno
IN
 ( SELECT dnumber
   FROM department
   WHERE mgr_ssn IS NOT NULL ) ;

SQLμ—μ„œμ˜ 집합 μ—°μ‚°

  • 합집합(UNION), 차집합(EXCEPT), ꡐ집합(INTERSECT)
    • λ¦΄λ ˆμ΄μ…˜μ— λŒ€ν•œ 집합 μ—°μ‚°μ˜ κ²°κ³ΌλŠ” νŠœν”Œλ“€μ˜ λ‹€μ€‘μ§‘ν•©μž„
    • μ°Έκ³  : UNION μ—°μ‚°μžλŠ” 기본적으둜 κ³ μœ ν•œ(distinct) κ°’λ§Œ μ„ νƒν•œλ‹€. μ€‘λ³΅λœ 값을 ν—ˆμš©ν•˜λ €λ©΄ UNION ALL을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.
  • 닀쀑집합 μ—°μ‚°: UNION ALL, EXCEPT ALL, INTERSECT ALL
    • μ—°μ‚° κ²°κ³ΌλŠ” 쀑볡을 μ œκ±°ν•˜μ§€ μ•Šμ€ λ‹€μ€‘μ§‘ν•©μž„

λ¬Έμžμ—΄μ— λŒ€ν•œ 비ꡐ

  • SQL은 LIKE 비ꡐ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄(ν˜Ήμ€ λΆ€λΆ„ λ¬Έμžμ—΄)에 λŒ€ν•΄ 비ꡐ쑰건을 μ μš©ν•  수 μžˆλ‹€.
  • λΆ€λΆ„ λ¬Έμžμ—΄μ„ ν‘œν˜„ν•  λ•Œ %λŠ” μž„μ˜μ˜ 개수의 문자λ₯Ό μ˜λ―Έν•˜κ³ , _λŠ” μž„μ˜μ˜ ν•œ 문자λ₯Ό μ˜λ―Έν•œλ‹€.

질의 결과의 μ •λ ¬

  • ORDER BY 절
    • ν•˜λ‚˜ μ΄μƒμ˜ μ• νŠΈλ¦¬λ·°νŠΈ κ°’ μˆœμ„œλ‘œ 질의 κ²°κ³Ό νŠœν”Œμ„ μ •λ ¬
      • e.g., ORDER BY DNAME DESC, LNAME ASC, FNAME ASC
    • ν‚€μ›Œλ“œ DESC: λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ – Descending
    • ν‚€μ›Œλ“œ ASC: μ˜€λ¦„μ°¨μˆœ μ •λ ¬ – Ascending
    • Default 정렬은 μ˜€λ¦„μ°¨μˆœ(ASC)μž„

SQLμ—μ„œμ˜ INSERT, DELETE, UPDATE ꡬ문

INSERT INTO VALUE

  • INSERT문으둜 λ¦΄λ ˆμ΄μ…˜μ— νŠœν”Œ ν•˜λ‚˜λ₯Ό μΆ”κ°€
    • μ‚½μž…ν•˜λŠ” νŠœν”Œ 값은 CREATE TABLE λͺ…λ Ήμ—μ„œ μ§€μ •ν•œ μ• νŠΈλ¦¬λ·°νŠΈ μˆœμ„œμ™€ λ™μΌν•˜κ²Œ 지정해야 함
      •  INSERT INTO EMPLOYEE
         VALUES (β€˜Richard’,β€˜K’,β€˜Marini’,β€˜653298653’,’30-DEC-52’,
            ’98 Oak Forest, Katy, TX’,β€˜M’,37000,β€˜987654321’,4) ;
    • κ°’λ“€μ˜ μˆœμ„œλ₯Ό μ• νŠΈλ¦¬λ·°νŠΈ μˆœμ„œμ™€ λ‹€λ₯΄κ²Œ μ§€μ •ν•˜λ €λ©΄ INSERT λ¬Έμž₯μ—μ„œ μ• νŠΈλ¦¬λ·°νŠΈ 이름을 λͺ…μ‹œν•΄μ•Ό 함
      •  INSERT INTO EMPLOYEE (FNAME, LNAME, DNO, SSN)
         VALUES (FNAME=β€˜Richard’, LNAME=β€˜Marini’,DNO= 4, SSN=β€˜653298653’) ;
      • 이름을 λͺ…μ‹œν•˜μ§€ μ•Šμ€ μ• νŠΈλ¦¬λ·°νŠΈλ“€μ€ NULLμ΄λ‚˜ DEFAULT 값을 가짐
    • 무결성 쑰건
      • DDLμ—μ„œ μ§€μ •ν•œ 무결성 μ œμ•½μ‘°κ±΄μ„ λ§Œμ‘±ν•΄μ•Ό 함
    • κ·ΈλŸ¬λ‚˜ DBMS에 λ”°λΌμ„œ νš¨μœ¨μ„± λ•Œλ¬Έμ— 일뢀 μ œμ•½μ‘°κ±΄λ“€μ„ μ§€μ›ν•˜μ§€ μ•Šμ„ 수 있음

SELECT와 κ²°ν•©λœ INSERT λͺ…λ Ή

  • 질의의 결과둜 μƒμ„±λœ 닀쀑 νŠœν”Œμ„ 또 λ‹€λ₯Έ λ¦΄λ ˆμ΄μ…˜μ— μ‚½μž…ν•˜λŠ” κ²½μš°μ— SELECT와 INSERTκ°€ κ²°ν•©λœ λ¬Έμž₯을 μ‚¬μš©ν•¨
CREATE TABLE WORKS_ON_INFO
(  EMP_NAME       VARCHAR(15),
   PROJ_NAME      VARCHAR(15),
   HOURS_PER_WEEK DECIMAL(3,1) );
INSERT INTO WORKS_ON_INFO (EMP_NAME, PROJ_NAME, HOURS_PER_WEEK)
SELECT E.LNAME, P.PNAME, W.HOURS
FROM PROJECT P, WORKS_ON W, EMPLOYEE E
WHERE P.PNUMBER=W.PNO AND W.ESSN=E.SSN;

DELETE λ¬Έ

  • DELETE λͺ…령은 λ¦΄λ ˆμ΄μ…˜μ—μ„œ νŠœν”Œ(λ“€)을 μ œκ±°ν•˜λŠ” λͺ…령이닀.
    • μ‚­μ œν•  νŠœν”Œμ— λŒ€ν•œ 쑰건은 WHERE μ ˆμ—μ„œ λͺ…μ‹œν•œλ‹€.
    • WHERE μ ˆμ„ μƒλž΅ν•œ κ²½μš°μ—λŠ” ν…Œμ΄λΈ” λ‚΄μ˜ λͺ¨λ“  νŠœν”Œμ„ μ‚­μ œν•˜λ©°, ν…Œμ΄λΈ”μ€ λ°μ΄ν„°λ² μ΄μŠ€ λ‚΄μ—μ„œ 빈 ν…Œμ΄λΈ”λ‘œ λ‚¨κ²Œ λœλ‹€.
      •  DELETE FROM EMPLOYEE;
    • ν•œλ²ˆμ˜ DELETE λͺ…λ ΉμœΌλ‘œ WHERE 절의 쑰건을 λ§Œμ‘±ν•˜λŠ” νŠœν”Œμ„ λͺ¨λ‘ μ‚­μ œν•¨
      •  DELETE FROM EMPLOYEE WHERE LNAME=β€˜Brown’ ;
      •  DELETE FROM EMPLOYEE WHERE SSN=β€˜123456789’ ;
      •  DELETE FROM EMPLOYEE WHERE DNO=5;

UPDATE λ¬Έ

  • UPDATE λͺ…령은 νŠœν”Œμ˜ μ• νŠΈλ¦¬λ·°νŠΈ 값을 μˆ˜μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
    • WHERE μ ˆμ€ ν•œ λ¦΄λ ˆμ΄μ…˜μ—μ„œ μˆ˜μ •ν•  νŠœν”Œμ„ μ„ νƒν•˜λŠ”λ° μ‚¬μš©λœλ‹€.
    • SETμ ˆμ€ λ³€κ²½ν•  μ• νŠΈλ¦¬λ·°νŠΈμ™€ κ·Έλ“€μ˜ μƒˆλ‘œμš΄ 값을 λͺ…μ‹œν•œλ‹€.

Basic SQL Practice

Company Database

Go to Problems

mysql> use company;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| DEPARTMENT        |
| DEPENDENT         |
| DEPT_LOCATIONS    |
| EMPLOYEE          |
| PROJECT           |
| WORKS_ON          |
+-------------------+
6 rows in set (0.00 sec)

mysql> desc department;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| Dname          | varchar(15) | NO   | UNI | NULL    |       |
| Dnumber        | int         | NO   | PRI | NULL    |       |
| Mgr_ssn        | char(9)     | NO   | MUL | NULL    |       |
| Mgr_start_date | date        | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> desc dependent;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| Essn           | char(9)     | NO   | PRI | NULL    |       |
| Dependent_name | varchar(15) | NO   | PRI | NULL    |       |
| Sex            | char(1)     | YES  |     | NULL    |       |
| Bdate          | date        | YES  |     | NULL    |       |
| Relationship   | varchar(8)  | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> desc dept_locations;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| Dnumber   | int         | NO   | PRI | NULL    |       |
| Dlocation | varchar(15) | NO   | PRI | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc employee;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| Fname     | varchar(10)  | NO   |     | NULL    |       |
| Minit     | char(1)      | YES  |     | NULL    |       |
| Lname     | varchar(20)  | NO   |     | NULL    |       |
| Ssn       | char(9)      | NO   | PRI | NULL    |       |
| Bdate     | date         | YES  |     | NULL    |       |
| Address   | varchar(30)  | YES  |     | NULL    |       |
| Sex       | char(1)      | YES  |     | NULL    |       |
| Salary    | decimal(5,0) | YES  |     | NULL    |       |
| Super_ssn | char(9)      | YES  | MUL | NULL    |       |
| Dno       | int          | NO   | MUL | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
10 rows in set (0.00 sec)

mysql> desc project;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| Pname     | varchar(15) | NO   | UNI | NULL    |       |
| Pnumber   | int         | NO   | PRI | NULL    |       |
| Plocation | varchar(15) | YES  |     | NULL    |       |
| Dnum      | int         | NO   | MUL | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> desc works_on;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| Essn  | char(9)      | NO   | PRI | NULL    |       |
| Pno   | int          | NO   | PRI | NULL    |       |
| Hours | decimal(3,1) | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from department;
+----------------+---------+-----------+----------------+
| Dname          | Dnumber | Mgr_ssn   | Mgr_start_date |
+----------------+---------+-----------+----------------+
| Headquarters   |       1 | 888665555 | 1981-06-19     |
| Administration |       4 | 987654321 | 1995-01-01     |
| Research       |       5 | 333445555 | 1988-05-22     |
+----------------+---------+-----------+----------------+
3 rows in set (0.01 sec)

mysql> select * from dependent;
+-----------+----------------+------+------------+--------------+
| Essn      | Dependent_name | Sex  | Bdate      | Relationship |
+-----------+----------------+------+------------+--------------+
| 123456789 | Alice          | F    | 1988-12-30 | Daughter     |
| 123456789 | Elizabeth      | F    | 1967-05-05 | Spouse       |
| 123456789 | Michael        | M    | 1988-01-04 | Son          |
| 333445555 | Alice          | F    | 1986-04-04 | Daughter     |
| 333445555 | Joy            | F    | 1958-05-03 | Spouse       |
| 333445555 | Theodore       | M    | 1983-10-25 | Son          |
| 987654321 | Abner          | M    | 1942-02-28 | Spouse       |
+-----------+----------------+------+------------+--------------+
7 rows in set (0.00 sec)

mysql> select * from dept_locations;
+---------+-----------+
| Dnumber | Dlocation |
+---------+-----------+
|       1 | Houston   |
|       4 | Stafford  |
|       5 | Bellaire  |
|       5 | Houston   |
|       5 | Sugarland |
+---------+-----------+
5 rows in set (0.00 sec)

mysql> select * from employee;
+----------+-------+---------+-----------+------------+-------------------------+------+--------+-----------+-----+
| Fname    | Minit | Lname   | Ssn       | Bdate      | Address                 | Sex  | Salary | Super_ssn | Dno |
+----------+-------+---------+-----------+------------+-------------------------+------+--------+-----------+-----+
| John     | B     | Smith   | 123456789 | 1965-01-09 | 731 Fondren, Houston TX | M    |  30000 | 333445555 |   5 |
| Franklin | T     | Wong    | 333445555 | 1965-12-08 | 638 Voss, Houston TX    | M    |  40000 | 888665555 |   5 |
| Joyce    | A     | English | 453453453 | 1972-07-31 | 5631 Rice, Houston TX   | F    |  25000 | 333445555 |   5 |
| Ramesh   | K     | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble TX | M    |  38000 | 333445555 |   5 |
| James    | E     | Borg    | 888665555 | 1937-11-10 | 450 Stone, Houston TX   | M    |  55000 | NULL      |   1 |
| Jennifer | S     | Wallace | 987654321 | 1941-06-20 | 291 Berry, Bellaire TX  | F    |  43000 | 888665555 |   4 |
| Ahmad    | V     | Jabbar  | 987987987 | 1969-03-29 | 980 Dallas, Houston TX  | M    |  25000 | 987654321 |   4 |
| Alicia   | J     | Zelaya  | 999887777 | 1968-01-19 | 3321 Castle, Spring TX  | F    |  25000 | 987654321 |   4 |
+----------+-------+---------+-----------+------------+-------------------------+------+--------+-----------+-----+
8 rows in set (0.01 sec)

mysql> select * from project;
+-----------------+---------+-----------+------+
| Pname           | Pnumber | Plocation | Dnum |
+-----------------+---------+-----------+------+
| ProductX        |       1 | Bellaire  |    5 |
| ProductY        |       2 | Sugarland |    5 |
| ProductZ        |       3 | Houston   |    5 |
| Computerization |      10 | Stafford  |    4 |
| Reorganization  |      20 | Houston   |    1 |
| Newbenefits     |      30 | Stafford  |    4 |
+-----------------+---------+-----------+------+
6 rows in set (0.00 sec)

mysql> select * from works_on;
+-----------+-----+-------+
| Essn      | Pno | Hours |
+-----------+-----+-------+
| 123456789 |   1 |  32.5 |
| 123456789 |   2 |   7.5 |
| 333445555 |   2 |  10.0 |
| 333445555 |   3 |  10.0 |
| 333445555 |  10 |  10.0 |
| 333445555 |  20 |  10.0 |
| 453453453 |   1 |  20.0 |
| 453453453 |   2 |  20.0 |
| 666884444 |   3 |  40.0 |
| 888665555 |  20 |  16.0 |
| 987654321 |  20 |  15.0 |
| 987654321 |  30 |  20.0 |
| 987987987 |  10 |  35.0 |
| 987987987 |  30 |   5.0 |
| 999887777 |  10 |  10.0 |
| 999887777 |  30 |  30.0 |
+-----------+-----+-------+
16 rows in set (0.00 sec)

Problems

  1. 성이 'Borg'인 사원(λ“€)의 전체 이름(Fname, Minit, Lname)κ³Ό 생년월일(Bdate)κ³Ό μ£Όμ†Œ(Address)λ₯Ό κ²€μƒ‰ν•˜λΌ.

    mysql> select Fname, Minit, Lname, Bdate, Address from employee WHERE Lname='Borg';
    +-------+-------+-------+------------+-----------------------+
    | Fname | Minit | Lname | Bdate      | Address               |
    +-------+-------+-------+------------+-----------------------+
    | James | E     | Borg  | 1937-11-10 | 450 Stone, Houston TX |
    +-------+-------+-------+------------+-----------------------+
    1 row in set (0.00 sec)
  2. λ¦΄λ ˆμ΄μ…˜ EMPLOYEE와 DEPARTMENT의 μΉ΄ν‹°μ…˜ 곱을 κ²€μƒ‰ν•˜λΌ.

    mysql> select * from Employee, Department;
    +----------+-------+---------+-----------+------------+-------------------------+------+--------+-----------+-----+----------------+---------+-----------+----------------+
    | Fname    | Minit | Lname   | Ssn       | Bdate      | Address                 | Sex  | Salary | Super_ssn | Dno | Dname          | Dnumber | Mgr_ssn   | Mgr_start_date |
    +----------+-------+---------+-----------+------------+-------------------------+------+--------+-----------+-----+----------------+---------+-----------+----------------+
    | John     | B     | Smith   | 123456789 | 1965-01-09 | 731 Fondren, Houston TX | M    |  30000 | 333445555 |   5 | Research       |       5 | 333445555 | 1988-05-22     |
    | John     | B     | Smith   | 123456789 | 1965-01-09 | 731 Fondren, Houston TX | M    |  30000 | 333445555 |   5 | Administration |       4 | 987654321 | 1995-01-01     |
    | John     | B     | Smith   | 123456789 | 1965-01-09 | 731 Fondren, Houston TX | M    |  30000 | 333445555 |   5 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    | Franklin | T     | Wong    | 333445555 | 1965-12-08 | 638 Voss, Houston TX    | M    |  40000 | 888665555 |   5 | Research       |       5 | 333445555 | 1988-05-22     |
    | Franklin | T     | Wong    | 333445555 | 1965-12-08 | 638 Voss, Houston TX    | M    |  40000 | 888665555 |   5 | Administration |       4 | 987654321 | 1995-01-01     |
    | Franklin | T     | Wong    | 333445555 | 1965-12-08 | 638 Voss, Houston TX    | M    |  40000 | 888665555 |   5 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    | Joyce    | A     | English | 453453453 | 1972-07-31 | 5631 Rice, Houston TX   | F    |  25000 | 333445555 |   5 | Research       |       5 | 333445555 | 1988-05-22     |
    | Joyce    | A     | English | 453453453 | 1972-07-31 | 5631 Rice, Houston TX   | F    |  25000 | 333445555 |   5 | Administration |       4 | 987654321 | 1995-01-01     |
    | Joyce    | A     | English | 453453453 | 1972-07-31 | 5631 Rice, Houston TX   | F    |  25000 | 333445555 |   5 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    | Ramesh   | K     | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble TX | M    |  38000 | 333445555 |   5 | Research       |       5 | 333445555 | 1988-05-22     |
    | Ramesh   | K     | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble TX | M    |  38000 | 333445555 |   5 | Administration |       4 | 987654321 | 1995-01-01     |
    | Ramesh   | K     | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble TX | M    |  38000 | 333445555 |   5 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    | James    | E     | Borg    | 888665555 | 1937-11-10 | 450 Stone, Houston TX   | M    |  55000 | NULL      |   1 | Research       |       5 | 333445555 | 1988-05-22     |
    | James    | E     | Borg    | 888665555 | 1937-11-10 | 450 Stone, Houston TX   | M    |  55000 | NULL      |   1 | Administration |       4 | 987654321 | 1995-01-01     |
    | James    | E     | Borg    | 888665555 | 1937-11-10 | 450 Stone, Houston TX   | M    |  55000 | NULL      |   1 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    | Jennifer | S     | Wallace | 987654321 | 1941-06-20 | 291 Berry, Bellaire TX  | F    |  43000 | 888665555 |   4 | Research       |       5 | 333445555 | 1988-05-22     |
    | Jennifer | S     | Wallace | 987654321 | 1941-06-20 | 291 Berry, Bellaire TX  | F    |  43000 | 888665555 |   4 | Administration |       4 | 987654321 | 1995-01-01     |
    | Jennifer | S     | Wallace | 987654321 | 1941-06-20 | 291 Berry, Bellaire TX  | F    |  43000 | 888665555 |   4 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    | Ahmad    | V     | Jabbar  | 987987987 | 1969-03-29 | 980 Dallas, Houston TX  | M    |  25000 | 987654321 |   4 | Research       |       5 | 333445555 | 1988-05-22     |
    | Ahmad    | V     | Jabbar  | 987987987 | 1969-03-29 | 980 Dallas, Houston TX  | M    |  25000 | 987654321 |   4 | Administration |       4 | 987654321 | 1995-01-01     |
    | Ahmad    | V     | Jabbar  | 987987987 | 1969-03-29 | 980 Dallas, Houston TX  | M    |  25000 | 987654321 |   4 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    | Alicia   | J     | Zelaya  | 999887777 | 1968-01-19 | 3321 Castle, Spring TX  | F    |  25000 | 987654321 |   4 | Research       |       5 | 333445555 | 1988-05-22     |
    | Alicia   | J     | Zelaya  | 999887777 | 1968-01-19 | 3321 Castle, Spring TX  | F    |  25000 | 987654321 |   4 | Administration |       4 | 987654321 | 1995-01-01     |
    | Alicia   | J     | Zelaya  | 999887777 | 1968-01-19 | 3321 Castle, Spring TX  | F    |  25000 | 987654321 |   4 | Headquarters   |       1 | 888665555 | 1981-06-19     |
    +----------+-------+---------+-----------+------------+-------------------------+------+--------+-----------+-----+----------------+---------+-----------+----------------+
    24 rows in set (0.00 sec)
  3. λͺ¨λ“  μ‚¬μ›λ“€μ˜ μ‚¬λ²ˆ(SSN)κ³Ό 그듀이 μ†ν•œ μ†Œμ† λΆ€μ„œ(DNAME)듀을 λͺ¨λ‘ κ²€μƒ‰ν•˜λΌ.

    mysql> select Ssn, Dname from employee, department WHERE Dno=Dnumber;
    +-----------+----------------+
    | Ssn       | Dname          |
    +-----------+----------------+
    | 987654321 | Administration |
    | 987987987 | Administration |
    | 999887777 | Administration |
    | 888665555 | Headquarters   |
    | 123456789 | Research       |
    | 333445555 | Research       |
    | 453453453 | Research       |
    | 666884444 | Research       |
    +-----------+----------------+
    8 rows in set (0.00 sec)
  4. Headquarters λΆ€μ„œμ—μ„œ κ·Όλ¬΄ν•˜λŠ” λͺ¨λ“  μ‚¬μ›μ˜ 이름(Fname, Lname)κ³Ό μ£Όμ†Œ(Address)λ₯Ό κ²€μƒ‰ν•˜λΌ.

    mysql> select Fname, Lname, Address from employee, department WHERE Dno=Dnumber AND Dname='Headquarters';
    +-------+-------+-----------------------+
    | Fname | Lname | Address               |
    +-------+-------+-----------------------+
    | James | Borg  | 450 Stone, Houston TX |
    +-------+-------+-----------------------+
    1 row in set (0.00 sec)
  5. Administration λΆ€μ„œμ—μ„œ μΌν•˜λŠ” μ‚¬μ›λ“€μ˜ μ„±(Lname)κ³Ό 이름(Fname), 그리고 κ΄€λ¦¬μžλ₯Ό μ‹œμž‘ν•œ λ‚ (mgr_start_date)을 κ²€μƒ‰ν•˜λΌ.

    mysql> select Lname, Fname, Mgr_start_date from employee, department WHERE Dno=Dnumber AND Dname='Administration';
    +---------+----------+----------------+
    | Lname   | Fname    | Mgr_start_date |
    +---------+----------+----------------+
    | Wallace | Jennifer | 1995-01-01     |
    | Jabbar  | Ahmad    | 1995-01-01     |
    | Zelaya  | Alicia   | 1995-01-01     |
    +---------+----------+----------------+
    3 rows in set (0.00 sec)
  6. 각 사원에 λŒ€ν•΄ μ‚¬μ›μ˜ 이름(Fname)κ³Ό μ„±(Lname), 직속 μƒμ‚¬μ˜ 이름 (Fname)κ³Ό μ„±(Lname)을 κ²€μƒ‰ν•˜λΌ.

    mysql> select E.Fname, E.Lname, S.Fname, S.Lname from Employee AS E, Employee AS S WHERE E.Super_ssn = S.Ssn;
    +----------+---------+----------+---------+
    | Fname    | Lname   | Fname    | Lname   |
    +----------+---------+----------+---------+
    | John     | Smith   | Franklin | Wong    |
    | Franklin | Wong    | James    | Borg    |
    | Joyce    | English | Franklin | Wong    |
    | Ramesh   | Narayan | Franklin | Wong    |
    | Jennifer | Wallace | James    | Borg    |
    | Ahmad    | Jabbar  | Jennifer | Wallace |
    | Alicia   | Zelaya  | Jennifer | Wallace |
    +----------+---------+----------+---------+
    7 rows in set (0.01 sec)
    
    mysql> select E.Fname AS Employee_Fname, E.Lname AS Employee_Lname, S.Fname AS Super_Fname, S.Lname AS Super_Lname from Employee AS E, Employee AS S WHERE E.Super_ssn = S.Ssn;
    +----------------+----------------+-------------+-------------+
    | Employee_Fname | Employee_Lname | Super_Fname | Super_Lname |
    +----------------+----------------+-------------+-------------+
    | John           | Smith          | Franklin    | Wong        |
    | Franklin       | Wong           | James       | Borg        |
    | Joyce          | English        | Franklin    | Wong        |
    | Ramesh         | Narayan        | Franklin    | Wong        |
    | Jennifer       | Wallace        | James       | Borg        |
    | Ahmad          | Jabbar         | Jennifer    | Wallace     |
    | Alicia         | Zelaya         | Jennifer    | Wallace     |
    +----------------+----------------+-------------+-------------+
    7 rows in set (0.00 sec)
  7. 'Houston'에 μœ„μΉ˜ν•œ λͺ¨λ“  ν”„λ‘œμ νŠΈμ— λŒ€ν•΄μ„œ ν”„λ‘œμ νŠΈ 번호(Pnumber), λ‹΄λ‹Ή λΆ€μ„œ 번호(Dnum), λΆ€μ„œ κ΄€λ¦¬μžμ˜ μ„±(Lname), μ£Όμ†Œ(Address), 생년월일 (Bdate)을 κ²€μƒ‰ν•˜λΌ.

    mysql> select P.Pnumber, P.Dnum, E.Lname, E.Address, E.Bdate from project as P, employee as E, department as D WHERE P.Plocation='Houston' AND P.Dnum=D.Dnumber AND D.Mgr_ssn = E.Ssn;
    +---------+------+-------+-----------------------+------------+
    | Pnumber | Dnum | Lname | Address               | Bdate      |
    +---------+------+-------+-----------------------+------------+
    |       3 |    5 | Wong  | 638 Voss, Houston TX  | 1965-12-08 |
    |      20 |    1 | Borg  | 450 Stone, Houston TX | 1937-11-10 |
    +---------+------+-------+-----------------------+------------+
    2 rows in set (0.00 sec)
  8. 일반 사원이든 κ΄€λ¦¬μžμ΄λ“  간에 μ„±(Lname)이 'Smith'인 사원이 μˆ˜ν–‰ν•˜λŠ” ν”„λ‘œμ νŠΈ 번호(Pnumber)의 리슀트λ₯Ό κ²€μƒ‰ν•˜λΌ. (hint : UNION)

    mysql> (select Pnumber from project, works_on, employee where Pnumber=Pno and Essn=Ssn and Lname='Smith')
       -> UNION
       -> (select Pnumber from project, department, employee where Dnum=Dnumber and Mgr_ssn=Ssn and Lname='Smith');
    +---------+
    | Pnumber |
    +---------+
    |       1 |
    |       2 |
    +---------+
    2 rows in set (0.00 sec)
  9. μ£Όμ†Œμ— 'Houston TX'κ°€ ν¬ν•¨λ˜λŠ” λͺ¨λ“  사원(Fname, Lname)을 κ²€μƒ‰ν•˜λΌ.

    mysql> select Fname, Lname from Employee where Address LIKE '%Houston TX%';
    +----------+---------+
    | Fname    | Lname   |
    +----------+---------+
    | John     | Smith   |
    | Franklin | Wong    |
    | Joyce    | English |
    | James    | Borg    |
    | Ahmad    | Jabbar  |
    +----------+---------+
    5 rows in set (0.00 sec)
    
    mysql> -- 확인 및 κ²€μ¦ν•˜κΈ° --
    mysql> select Fname, Lname, Address from Employee where Address LIKE '%Houston TX%';
    +----------+---------+-------------------------+
    | Fname    | Lname   | Address                 |
    +----------+---------+-------------------------+
    | John     | Smith   | 731 Fondren, Houston TX |
    | Franklin | Wong    | 638 Voss, Houston TX    |
    | Joyce    | English | 5631 Rice, Houston TX   |
    | James    | Borg    | 450 Stone, Houston TX   |
    | Ahmad    | Jabbar  | 980 Dallas, Houston TX  |
    +----------+---------+-------------------------+
    5 rows in set (0.00 sec)
  10. 1960λ…„λŒ€ νƒœμ–΄λ‚œ λͺ¨λ“  μ‚¬μ›μ˜ 전체 이름(Fname, Lname)을 κ²€μƒ‰ν•˜λΌ.

    mysql> select Fname, Lname from employee where Bdate LIKE '196%';
    +----------+---------+
    | Fname    | Lname   |
    +----------+---------+
    | John     | Smith   |
    | Franklin | Wong    |
    | Ramesh   | Narayan |
    | Ahmad    | Jabbar  |
    | Alicia   | Zelaya  |
    +----------+---------+
    5 rows in set (0.00 sec)
    
    mysql> -- 확인 및 κ²€μ¦ν•˜κΈ° --
    mysql> select Fname, Lname, Bdate from employee where Bdate LIKE '196%';
    +----------+---------+------------+
    | Fname    | Lname   | Bdate      |
    +----------+---------+------------+
    | John     | Smith   | 1965-01-09 |
    | Franklin | Wong    | 1965-12-08 |
    | Ramesh   | Narayan | 1962-09-15 |
    | Ahmad    | Jabbar  | 1969-03-29 |
    | Alicia   | Zelaya  | 1968-01-19 |
    +----------+---------+------------+
    5 rows in set (0.01 sec)

Source

  1. Fundamentals of Database Systems 7th Edition by Ramez Elmasri, Shamkant B. Navathe.
  2. λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œ (Database System Concepts) 6th Edition by Abranham Silberschatz, Henry F.Korth, S.Sudarchan, κΉ€ν˜•μ£Ό μ—­.
  3. gyoogle GitHub | tech-interview-for-developer/Computer Science/Database/[Database SQL] JOIN.md
  4. carrot.log | [Database] JOIN의 μ’…λ₯˜ : INNER, OUTER, CROSS, SELF
  5. FRANK'S BLOG | κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 쑰인(join)μ΄λž€?
  6. C.L. Moffatt | Visual Representation of SQL Joins
  7. https://swingswing.tistory.com/12
  8. 거꾸둜 바라본 세상 | [SQL] Join(쑰인)