MySQL

  • ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์˜ ๊ด€๊ณ„, ํŠœํ”Œ, ์†์„ฑ์ด ํ…Œ์ด๋ธ”, ํ–‰, ์—ด๋กœ ๋Œ€์‘.
  • ๊ฐ ๊ตฌ๋ฌธ ๋งˆ์ง€๋ง‰์—๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. (์ค‘๊ฐ„๊ณ ์‚ฌ์— ์„ธ๋ฏธ์ฝœ๋ก  ๊ผญ ์จ์•ผ ํ•จ.)
  • ํ…Œ์ด๋ธ” ์ƒ์„ฑ: CREATE TABLE COMPANY.EMPLOYEE ๋˜๋Š” CREATE TABLE COMPANY

Specifying Constraints

  • Key constraints: PK ๊ฐ’์€ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค.
  • Entity integrity constraint: PK ๊ฐ’์€ null์ด ๋  ์ˆ˜ ์—†๋‹ค.
  • Referential integrity constraint: FK๋Š” PK๋กœ ํ‘œํ˜„๋˜๋Š” ๊ธฐ์กด ๊ฐ’์ด๊ฑฐ๋‚˜, null์ด์–ด์•ผ ํ•œ๋‹ค.
  • CONSTRAINT ๊ตฌ๋ฌธ์œผ๋กœ constraint์— ์ด๋ฆ„์„ ๋ถ™์ผ์ˆ˜๋„ ์žˆ์Œ:
    CREATE TABLE EMPLOYEE(
      Ssn CHAR(9) NOT NULL,
      ...
      CONSTRAINT EMPPK
        PRIMARY KEY (Ssn),
      CONSTRAINT EMPSUPERFK
        FOREIGN KEY (Super_ssn) REFERENCES EMPLOYEE(Ssn)
          ON DELETE SET NULL
          ON UPDATE CASCADE
    );
    
  • ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์— ์•„์ง ์—†๋Š” ๊ฐ’์„ FK๋กœ ์ฐธ์กฐํ•˜๋ฉด referential integrity constraint๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€. ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ ๋’ค, ALTER TABLEํ•ด FK๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

Basic Retrieval Queries

  • ๊ธฐ๋ณธํ˜•์€ SELECT <attribute list> FROM <table list> WHERE <condition>;.
  • โ€˜Researchโ€™ ๋ถ€์„œ์—์„œ ์ผํ•˜๋Š” ๋ชจ๋“  ์ง์›์˜ ์ด๋ฆ„๊ณผ ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ:
    • FROM EMPLOYEE, DEPARTMENT ์ฟผ๋ฆฌ๋Š” ๋‘ ํ…Œ์ด๋ธ” ์‚ฌ์ด ๋ชจ๋“  ์Œ์ด ํฌํ•จ๋œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ฆ. ์ฆ‰, EMPLOYEE์™€ DEPARTMENT์˜ cartesian product.
      SELECT Fname, Lname, Address
      FROM EMPLOYEE E, DEPARTMENT D
      WHERE D.Dname='Research' AND D.Dnumber=E.Dno;
      
    • ๋”ฐ๋ผ์„œ WHERE์ ˆ์ด ํ•„์ˆ˜.

NULL

  • ์œ„์™€ ๊ฐ™์ด three-valued logic์— logical connectives๊ฐ€ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ NULL ์กฐ๊ฑด์„ ์ ์šฉํ•  ๋•Œ๋Š” ๋น„๊ต ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๋ผ IS ์—ฐ์‚ฐ์„ ํ•ด์•ผํ•œ๋‹ค:
    • e.g., SELECT * FROM EMPLOYEE WHERE Pno IS NULL;

Nested Queries

  • WHERE ์ ˆ ์•ˆ์— ์™„์„ฑ๋œ ํ˜•ํƒœ์˜ select-from-where ๋ธ”๋ก์„ ์ค‘์ฒฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • IN ๋ช…๋ น์„ ์ด์šฉํ•ด ํŠœํ”Œ ์ง‘ํ•ฉ์—์„œ ๋Œ€์ƒ ํŠœํ”Œ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Œ.
    SELECT DISTINCT Essn
    FROM WORKS_ON
    WHERE (Pno, Hours) IN (SELECT Pno, Hours
                           FROM WORKS_ON
                           WHERE Essn='123456789');
    
    • DISTINCT๋ฅผ ํ•˜๋ฉด ์ค‘๋ณต๋œ ๊ฐ’์ด ์ œ๊ฑฐ๋œ๋‹ค.
  • ์ง‘ํ•ฉ๋ก ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ UNION, INTERSECT๋„ ๊ฐ€๋Šฅ.
    (SELECT DISTINCT Pnumber
     FROM PROJECT, DEPARTMENT, EMPLOYEE
     WHERE Dnum = Dnumber AND Mgr_ssn = Ssn AND Lname = 'Smith')
     UNION
    (SELECT DISTINCT Pnumber
     FROM PROJECT, WORKS_ON, EMPLOYEE
     WHERE Pnumber = Pno AND Essn = Ssn AND Lname = 'Smith');
    

Use of (NOT) EXISTS

  • 5๋ฒˆ ๋ถ€์„œ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋Š” ์ง์›์˜ ์ด๋ฆ„์„ ์ฐพ๋Š” ๊ฒฝ์šฐ:
    SELECT Fname, Lname
    FROM Employee
    WHERE NOT EXISTS (
      (SELECT Pnumber FROM PROJECT WHERE Dno = 5)
        EXCEPT (SELECT Pno FROM WORKS_ON WHERE Ssn = ESsn)
    );
    
  • 5๋ฒˆ ๋ถ€์„œ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ณ„ ์ง์›์ด ์ฐธ์—ฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์„ ๋บ์„ ๋•Œ, ๋‚จ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด๋‹น ์ง์›์€ 5๋ฒˆ ๋ถ€์„œ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ.

SQL Joins

  • INNER JOIN:
    • SELECT * FROM EMPLOYEE E INNER JOIN DEPENDENT D ON E.Ssn = D.Essn;
    • DEPENDENT๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  EMPLOYEE๋ฅผ ๋ฐ˜ํ™˜.
    • ๋น„๊ตํ•˜๋Š” ์†์„ฑ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋ฉด NATURAL JOIN์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • FULL OUTER JOIN
  • LEFT OUTER JOIN:
    • SELECT * FROM EMPLOYEE E LEFT JOIN DEPENDENT D ON E.Ssn = D.Essn;
    • DEPENDENT๊ฐ€ ์—†๋Š” ์ง์›๊นŒ์ง€ ํฌํ•จํ•ด ๋ฐ˜ํ™˜.
  • RIGHT OUTER JOIN

Aggregate Functions

  • COUNT, SUM, MAX, MIN, AVG ๋“ฑ ํ•จ์ˆ˜๋กœ ์—ฌ๋Ÿฌ ํŠœํ”Œ์„ ํ•˜๋‚˜๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • SELECT Dno, COUNT(*), AVG(Salary) FROM EMPLOYEE GROUP BY Dno;
    • ๊ทธ๋ฃจํ•‘์˜ ๊ธฐ์ค€ ์ปฌ๋Ÿผ(Dno)์„ ํ•จ๊ป˜ ์„ ํƒํ•ด์•ผ ์–ด๋–ค ํŠœํ”Œ์ด ์–ด๋–ค ์กฐ๊ฑด์— ์†ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ.
  • ๊ทธ๋ฃจํ•‘ ์กฐ๊ฑด์€ HAVING ์ ˆ์— ์ž‘์„ฑํ•œ๋‹ค:
    SELECT Pnumber, Pname, COUNT(*)
    FROM PROJECT, WORKS_ON
    WHERE Pnumber = Pno
    GROUP BY Pnumber, Pname
    HAVING COUNT(*) > 2;
    
    • ์—ฌ๋Ÿฌ ๊ฐœ ์ปฌ๋Ÿผ์œผ๋กœ GROUP BYํ•˜๋ฉด?
  • WHERE๋Š” ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฏธ ํ•„ํ„ฐ๋ง๋œ ์ƒํƒœ์—์„œ ๊ทธ๋ฃจํ•‘์„ ํ•˜๋ฉด HAVING ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ:
    SELECT Dno, COUNT(*)
    FROM EMPLOYEE
    WHERE Salary > 40000 AND Dno IN
      (SELECT Dno FROM EMPLOYEE GROUP BY Dno HAVING COUNT(*) > 5)
    GROUP BY Dno;
    
  • GROUP BY๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์€ SELECTํ•  ์ˆ˜ ์—†๋‹ค.

Alter and Dropping

  • ALTER TALBE <table> <ADD|DROP> <column> [type] [CASCADE|RESTRICT]: ์ปฌ๋Ÿผ ์ถ”๊ฐ€/์ œ๊ฑฐ.
    • CASCADE: ์‚ญ์ œํ•  ์ปฌ๋Ÿผ์— ์žˆ๋Š” ๋ชจ๋“  ์ œ์•ฝ๊ณผ ๋ทฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
    • RESTRICT: ์‚ญ์ œํ•  ์ปฌ๋Ÿผ์ด ์ œ์•ฝ์„ ์œ„๋ฐ˜ํ•˜๋ฉด ์‚ญ์ œ๋ฅผ ๋ง‰๋Š”๋‹ค.
  • ALTER TALBE <table> ALTER COLUMN <column> <SET|DROP> DEFAULT [default]: ๋””ํดํŠธ ๊ฐ’ ์ถ”๊ฐ€/์ œ๊ฑฐ.
  • DROP TABLE <table>: ํ…Œ์ด๋ธ” ์‚ญ์ œ.

์˜ˆ์‹œ ์ฟผ๋ฆฌ

INSERT

INSERT INTO student (name, major, grade) VALUES ('park', 'DGMD', 2)

SELECT

๋ชจ๋“  student ๋ ˆ์ฝ”๋“œ์˜ name ์ปฌ๋Ÿผ๊ณผ grade ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT name, grade FROM student

id ์ˆœ์„œ๋กœ ๋ชจ๋“  student ๋ ˆ์ฝ”๋“œ์˜ name ์ปฌ๋Ÿผ๊ณผ grade ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT name, grade FROM student ORDER BY id

WHERE

name์ด park์ธ ๋ชจ๋“  student ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM student WHERE name = 'park'

grade๊ฐ€ 1๋ณด๋‹ค ํฌ๊ณ , 4๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  student ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM user WHERE level > 1 AND level < 4

name์ด kim์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  student ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM student WHERE name LIKE 'kim%'

BETWEEN

grade๊ฐ€ 1๋ณด๋‹ค ํฌ๊ณ , 4๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  student ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM student WHERE grade BETWEEN 1 AND 4

major๊ฐ€ DGMD๋‚˜ SCE์ธ ๋ชจ๋“  student ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM student WHERE major IN ('DGMD', 'SCE')

UPDATE

name์ด lee์ธ student ๋ ˆ์ฝ”๋“œ์˜ major๋ฅผ SCE๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

UPDATE student SET major = 'SCE' WHERE name = 'lee'

GROUP BY

student ๋ ˆ์ฝ”๋“œ๋ฅผ major ์ปฌ๋Ÿผ ๋‹จ์œ„๋กœ ๊ทธ๋ฃน์ง€์–ด ๊ฐ ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT major, COUNT(*) FROM student GROUP BY major

JOIN

student, professor ํ…Œ์ด๋ธ”์—์„œ major ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM student INNER JOIN professor ON student.major = professor.major

student, professor ํ…Œ์ด๋ธ”์—์„œ major ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT * FROM student FULL OUTER JOIN professor ON student.major = professor.major WHERE student.major IS NULL OR professor.major IS NULL

๊ด€๋ จ๋ฌธ์„œ

์ด ๋ฌธ์„œ๋ฅผ ์ธ์šฉํ•œ ๋ฌธ์„œ