• Mindscape ๐Ÿ”ฅ
    • Playlist ๐ŸŽง
  • Ubuntu

    • Wine ํ™˜๊ฒฝ์—์„œ ์นด์นด์˜คํ†ก ์‹คํ–‰ ์‹œ explorer.exe ๋œจ์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฒ•
    • Wine ์นด์นด์˜คํ†ก ์Šคํฌ๋ฆฐ์ƒท ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฌธ์ œ ํ•ด๊ฒฐ (Wayland ํ™˜๊ฒฝ)
    • Wine ์นด์นด์˜คํ†ก ์ด๋ชจ์ง€ ๊นจ์ง ๋ฌธ์ œ ํ•ด๊ฒฐ
  • Wellness

    • ์ฐจ์ „์žํ”ผ (Psyllium Husk)
    • ์—‘์ŠคํŠธ๋ผ ๋ฒ„์ง„ ์˜ฌ๋ฆฌ๋ธŒ์œ  (Extra Virgin Olive Oil)
    • ์ž๊ฐ€๋น„๊ฐ•์„ธ์ฒ™ (Nasal Irrigation)
    • QCY HT08 (MeloBuds Pro Plus)
  • Humanities

    • Nordvik, Russia
    • North Sentinel Island
    • ๋กฑ๊ณ ๋กฑ๊ณ (Rongorongo)
  • ๐Ÿ—‚๏ธ Database System

    • 1. Introduction
    • 2. Relational Model
    • 3. SQL
    • 6. E-R Model
    • 7. Relational Database Design (1)
    • 7. Relational Database Design (2)
    • 13. Data Storage Structures
    • 14. Indexing
    • 15. Query Processing
    • 16. Query Optimization
    • 17. Transactions
    • 18. Concurrency Control
    • 19. Recovery System

3. SQL

SQL Parts

  • DDL (Data Definition Language, ๋ฐ์ดํ„ฐ ์ •์˜์–ด)
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ(schema) ์ •์˜ ์ˆ˜๋‹จ ์ œ๊ณต
  • DML (Data Manipulation Language, ๋ฐ์ดํ„ฐ ์กฐ์ž‘์–ด)
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด ์งˆ์˜ ๋ฐ ํŠœํ”Œ(tuple) ์‚ฝ์ž…, ์‚ญ์ œ, ์ˆ˜์ • ๊ธฐ๋Šฅ ์ œ๊ณต
  • Integrity (๋ฌด๊ฒฐ์„ฑ)
    • DDL์€ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด(integrity constraints) ๋ช…์‹œ ๋ช…๋ น์–ด ํฌํ•จ
  • View definition (๋ทฐ ์ •์˜)
    • DDL์€ ๋ทฐ(view) ์ •์˜ ๋ช…๋ น์–ด ํฌํ•จ
  • Transaction control (ํŠธ๋žœ์žญ์…˜ ์ œ์–ด)
    • ํŠธ๋žœ์žญ์…˜(transaction)์˜ ์‹œ์ž‘๊ณผ ๋์„ ๋ช…์‹œํ•˜๋Š” ๋ช…๋ น์–ด ํฌํ•จ
  • Embedded SQL and dynamic SQL (embedded SQL ๋ฐ ๋™์  SQL)
    • ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋‚ด์— SQL ๋ฌธ์žฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ •์˜
  • Authorization (๊ถŒํ•œ ๋ถ€์—ฌ)
    • ๊ด€๊ณ„(relation) ๋ฐ ๋ทฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ ๋ช…์‹œ ๋ช…๋ น์–ด ํฌํ•จ

Data Definition Language

  • SQL DDL์€ ๊ด€๊ณ„์— ๋Œ€ํ•œ ์ •๋ณด ๋ช…์‹œ ํ—ˆ์šฉ, ๋‹ค์Œ ํฌํ•จ:
    • ๊ฐ ๊ด€๊ณ„์˜ ์Šคํ‚ค๋งˆ
    • ๊ฐ ์†์„ฑ(attribute)๊ณผ ๊ด€๋ จ๋œ ๊ฐ’์˜ ์œ ํ˜•
    • ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด
    • ๊ฐ ๊ด€๊ณ„์— ๋Œ€ํ•ด ์œ ์ง€๋  ์ธ๋ฑ์Šค(index) ์ง‘ํ•ฉ
    • ๊ฐ ๊ด€๊ณ„์— ๋Œ€ํ•œ ๋ณด์•ˆ ๋ฐ ๊ถŒํ•œ ์ •๋ณด
    • ๋””์Šคํฌ ์ƒ์˜ ๊ฐ ๊ด€๊ณ„์— ๋Œ€ํ•œ ๋ฌผ๋ฆฌ์  ์ €์žฅ ๊ตฌ์กฐ

DDL: Domain Types in SQL

  • char(n): ์‚ฌ์šฉ์ž ์ง€์ • ๊ธธ์ด nnn์˜ ๊ณ ์ • ๊ธธ์ด ๋ฌธ์ž์—ด
  • varchar(n): ์‚ฌ์šฉ์ž ์ง€์ • ์ตœ๋Œ€ ๊ธธ์ด nnn์˜ ๊ฐ€๋ณ€ ๊ธธ์ด ๋ฌธ์ž์—ด
  • int: ์ •์ˆ˜ (๊ธฐ๊ณ„์— ์˜์กดํ•˜๋Š” ์ •์ˆ˜์˜ ์œ ํ•œ ๋ถ€๋ถ„ ์ง‘ํ•ฉ)
  • smallint: ์ž‘์€ ์ •์ˆ˜ (์ •์ˆ˜ ๋„๋ฉ”์ธ ์œ ํ˜•์˜ ๊ธฐ๊ณ„ ์˜์กด์  ๋ถ€๋ถ„ ์ง‘ํ•ฉ)
  • numeric(p,d): ppp์ž๋ฆฌ์˜ ์‚ฌ์šฉ์ž ์ง€์ • ์ •๋ฐ€๋„์™€ ์†Œ์ˆ˜์  ์ดํ•˜ ddd์ž๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๊ณ ์ • ์†Œ์ˆ˜์  ์ˆซ์ž (์˜ˆ: numeric(3,1)์€ 44.5๋Š” ์ •ํ™•ํžˆ ์ €์žฅ ๊ฐ€๋Šฅํ•˜๋‚˜, 444.5๋‚˜ 0.32๋Š” ๋ถˆ๊ฐ€)
  • real, double precision: ๊ธฐ๊ณ„ ์˜์กด์  ์ •๋ฐ€๋„๋ฅผ ๊ฐ€์ง„ ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐ ๋ฐฐ์ •๋ฐ€๋„ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž
  • float(n): ์ตœ์†Œ nnn์ž๋ฆฌ์˜ ์‚ฌ์šฉ์ž ์ง€์ • ์ •๋ฐ€๋„๋ฅผ ๊ฐ€์ง„ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž
  • ์ถ”๊ฐ€์ ์ธ ๋‚ด์šฉ์€ 4์žฅ์—์„œ ๋‹ค๋ฃธ

DDL: Create Table Construct

  • SQL ๊ด€๊ณ„๋Š” create table ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜:
    • create table r (A1 D1, A2 D2, ..., An Dn, (integrity-constraint1), ..., (integrity-constraintk));
  • rrr์€ ๊ด€๊ณ„์˜ ์ด๋ฆ„
  • ๊ฐ AiA_iAiโ€‹๋Š” ๊ด€๊ณ„ rrr์˜ ์Šคํ‚ค๋งˆ์— ์žˆ๋Š” ์†์„ฑ ์ด๋ฆ„
  • DiD_iDiโ€‹๋Š” ์†์„ฑ AiA_iAiโ€‹์˜ ๋„๋ฉ”์ธ(domain)์— ์žˆ๋Š” ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•
  • ์˜ˆ์‹œ:
    create table instructor(
        ID        char(5),
        name      varchar(20),
        dept_name varchar(20),
        salary    numeric(8,2)
    );
    

DDL: Integrity Constraints in Create Table

  • ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์œ ํ˜•
    • primary key(A1, ..., An)
      • ์ด ๊ด€๊ณ„์˜ ๋ชจ๋“  ํŠœํ”Œ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•จ
      • ์œ„์˜ Primary-key constraint (๊ธฐ๋ณธ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด) ๊ฐ•์ œ
    • foreign key (Am, ..., An) references r
      • Foreign-key constraint (์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด) ๊ฐ•์ œ
    • not null
      • ์ด ์†์„ฑ์ด NULL ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋„๋ก ๊ฐ•์ œ
  • SQL์€ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ ๋ฐฉ์ง€
  • ์˜ˆ์‹œ:
    create table instructor(
        ID        char(5),
        name      varchar(20) not null,
        dept_name varchar(20),
        salary    numeric(8,2),
        primary key (ID),
        foreign key (dept_name) references department
    );
    

Updates to tables

  • Insert
    • insert into instructor values('10211', 'Smith', 'Biology', 66000);
  • Delete
    • student ๊ด€๊ณ„์—์„œ ๋ชจ๋“  ํŠœํ”Œ ์ œ๊ฑฐ
    • delete from student;
  • Drop Table
    • drop table r;
  • Alter
    • alter table r add A D;
      • ์—ฌ๊ธฐ์„œ AAA๋Š” ๊ด€๊ณ„ rrr์— ์ถ”๊ฐ€๋  ์†์„ฑ์˜ ์ด๋ฆ„์ด๊ณ  DDD๋Š” AAA์˜ ๋„๋ฉ”์ธ
      • ๊ด€๊ณ„์˜ ๋ชจ๋“  ๊ธฐ์กด ํŠœํ”Œ์€ ์ƒˆ ์†์„ฑ์— ๋Œ€ํ•ด null ๊ฐ’์œผ๋กœ ํ• ๋‹น๋จ
    • alter table r drop A;
      • ์—ฌ๊ธฐ์„œ AAA๋Š” ๊ด€๊ณ„ rrr์˜ ์†์„ฑ ์ด๋ฆ„
      • ์†์„ฑ ์‚ญ์ œ๋Š” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Œ

Basic Query Structure

  • ์ผ๋ฐ˜์ ์ธ SQL ์งˆ์˜ ํ˜•ํƒœ:
    • select A1, A2, ..., An from r1, r2, ..., rm where P;
  • AiA_iAiโ€‹๋Š” ์†์„ฑ์„ ๋‚˜ํƒ€๋ƒ„
  • rir_iriโ€‹๋Š” ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ„
  • PPP๋Š” ์ˆ ์–ด(predicate)
  • ๋Œ€์‘ํ•˜๋Š” ๊ด€๊ณ„ ๋Œ€์ˆ˜(relational algebra)

    ฮ A1,A2,โ€ฆ,An(ฯƒ_P(r1ร—r2ร—โ‹ฏร—rm))\Pi _{A_1, A_2, \dots, A_n}(\sigma\_P(r_1 \times r_2 \times \dots \times r_m)) ฮ A1โ€‹,A2โ€‹,โ€ฆ,Anโ€‹โ€‹(ฯƒ_P(r1โ€‹ร—r2โ€‹ร—โ‹ฏร—rmโ€‹))

  • SQL ์งˆ์˜์˜ ๊ฒฐ๊ณผ๋Š” ๊ด€๊ณ„

The select Clause

  • select ์ ˆ์€ ์งˆ์˜ ๊ฒฐ๊ณผ์—์„œ ์›ํ•˜๋Š” ์†์„ฑ์„ ๋‚˜์—ด
  • ๊ด€๊ณ„ ๋Œ€์ˆ˜์˜ ํ”„๋กœ์ ์…˜(projection) ์—ฐ์‚ฐ์— ํ•ด๋‹น
  • ์˜ˆ์‹œ: ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„ ์ฐพ๊ธฐ
    • select name from instructor;
  • ์ฐธ๊ณ : SQL ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Œ (์˜ˆ: Name โ‰ก\equivโ‰ก NAME โ‰ก\equivโ‰ก name)
  • SQL์€ ๊ด€๊ณ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์งˆ์˜ ๊ฒฐ๊ณผ์—์„œ๋„ ์ค‘๋ณต์„ ํ—ˆ์šฉ
  • ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ๊ฐ•์ œํ•˜๋ ค๋ฉด select ๋’ค์— distinct ํ‚ค์›Œ๋“œ ์‚ฝ์ž…
    • ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ํ•™๊ณผ ์ด๋ฆ„์„ ์ฐพ๊ณ  ์ค‘๋ณต ์ œ๊ฑฐ
    • select distinct dept_name from instructor;
  • all ํ‚ค์›Œ๋“œ๋Š” ์ค‘๋ณต์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š์•„์•ผ ํ•จ์„ ๋ช…์‹œ
    • select all dept_name from instructor;
  • select ์ ˆ์˜ ๋ณ„ํ‘œ(*)๋Š” "๋ชจ๋“  ์†์„ฑ"์„ ์˜๋ฏธ
    • select * from instructor;
    • select instructor.* from instructor, teaches;
  • ์†์„ฑ์€ from ์ ˆ ์—†์ด ๋ฆฌํ„ฐ๋Ÿด(literal)์ด ๋  ์ˆ˜ ์žˆ์Œ
    • select '437';
    • ๊ฒฐ๊ณผ๋Š” "437" ๊ฐ’์„ ๊ฐ€์ง„ ๋‹จ์ผ ํ–‰๊ณผ ํ•˜๋‚˜์˜ ์—ด์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”
  • ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ด์— ์ด๋ฆ„ ๋ถ€์—ฌ ๊ฐ€๋Šฅ:
    • select '437' as FOO;
  • ์†์„ฑ์€ from ์ ˆ๊ณผ ํ•จ๊ป˜ ๋ฆฌํ„ฐ๋Ÿด์ด ๋  ์ˆ˜ ์žˆ์Œ
    • select 'A' from instructor;
    • ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ ์—ด๊ณผ NNN๊ฐœ์˜ ํ–‰(instructor ํ…Œ์ด๋ธ”์˜ ํŠœํ”Œ ์ˆ˜)์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์ด๋ฉฐ, ๊ฐ ํ–‰์˜ ๊ฐ’์€ "A"
  • select ์ ˆ์€ +, -, *, / ์—ฐ์‚ฐ์„ ํฌํ•จํ•˜๋Š” ์‚ฐ์ˆ  ํ‘œํ˜„์‹์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒ์ˆ˜ ๋˜๋Š” ํŠœํ”Œ์˜ ์†์„ฑ์— ๋Œ€ํ•ด ์—ฐ์‚ฐ
  • ์งˆ์˜: select ID, name, dept_name, salary/12 from instructor;
    • instructor ๊ด€๊ณ„์™€ ๋™์ผํ•˜์ง€๋งŒ salary ์†์„ฑ ๊ฐ’์ด 12๋กœ ๋‚˜๋ˆ„์–ด์ง„ ๊ด€๊ณ„๋ฅผ ๋ฐ˜ํ™˜
    • ์ผ๋ฐ˜ํ™”๋œ ํ”„๋กœ์ ์…˜ ์—ฐ์‚ฐ์— ํ•ด๋‹น
  • as ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ "salary/12"์˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ:
    • select ID, name, dept_name, salary/12 as monthly_salary;

The where Clause

  • where ์ ˆ์€ ๊ฒฐ๊ณผ๊ฐ€ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์„ ๋ช…์‹œ
  • ๊ด€๊ณ„ ๋Œ€์ˆ˜์˜ ์„ ํƒ(selection) ์ˆ ์–ด์— ํ•ด๋‹น
  • ์ปดํ“จํ„ฐ ๊ณตํ•™(Comp. Sci.)๊ณผ์˜ ๋ชจ๋“  ๊ฐ•์‚ฌ ์ฐพ๊ธฐ
    • select name from instructor where dept_name = 'Comp. Sci.';
  • SQL์€ ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์‚ฌ and, or, not ์‚ฌ์šฉ์„ ํ—ˆ์šฉ
  • ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์‚ฌ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋น„๊ต ์—ฐ์‚ฐ์ž <, <=, >, >=, =, <>๋ฅผ ํฌํ•จํ•˜๋Š” ํ‘œํ˜„์‹์ด ๋  ์ˆ˜ ์žˆ์Œ
  • ๋น„๊ต๋Š” ์‚ฐ์ˆ  ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ์— ์ ์šฉ ๊ฐ€๋Šฅ
  • ๊ธ‰์—ฌ๊ฐ€ 70000๋ณด๋‹ค ํฐ ์ปดํ“จํ„ฐ ๊ณตํ•™๊ณผ์˜ ๋ชจ๋“  ๊ฐ•์‚ฌ ์ฐพ๊ธฐ
    • select name from instructor where dept_name = 'Comp. Sci.' and salary > 70000;

The from Clause

  • from ์ ˆ์€ ์งˆ์˜์— ๊ด€๋ จ๋œ ๊ด€๊ณ„๋ฅผ ๋‚˜์—ด
  • ๊ด€๊ณ„ ๋Œ€์ˆ˜์˜ ์นดํ‹ฐ์ „ ํ”„๋กœ๋•ํŠธ(Cartesian product) ์—ฐ์‚ฐ์— ํ•ด๋‹น
  • instructor ร—\timesร— teaches์˜ ์นดํ‹ฐ์ „ ํ”„๋กœ๋•ํŠธ ์ฐพ๊ธฐ
    • select * from instructor, teaches;
  • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  instructor-teaches ์Œ์„ ์ƒ์„ฑํ•˜๋ฉฐ, ๋‘ ๊ด€๊ณ„์˜ ๋ชจ๋“  ์†์„ฑ์„ ํฌํ•จ
  • ๊ณตํ†ต ์†์„ฑ(์˜ˆ: ID)์˜ ๊ฒฝ์šฐ, ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์˜ ์†์„ฑ์€ ๊ด€๊ณ„ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋จ (์˜ˆ: instructor.ID)
  • ์นดํ‹ฐ์ „ ํ”„๋กœ๋•ํŠธ๋Š” ์ง์ ‘์ ์œผ๋กœ๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, where ์ ˆ ์กฐ๊ฑด(๊ด€๊ณ„ ๋Œ€์ˆ˜์˜ ์„ ํƒ ์—ฐ์‚ฐ)๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด ์œ ์šฉ

Examples

  • ์–ด๋–ค ๊ณผ๋ชฉ์„ ๊ฐ€๋ฅด์นœ ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„๊ณผ course_id ์ฐพ๊ธฐ
    • select name, course_id from instructor, teaches where instructor.ID = teaches.ID;
  • ์˜ˆ์ˆ (Art) ํ•™๊ณผ์—์„œ ์–ด๋–ค ๊ณผ๋ชฉ์„ ๊ฐ€๋ฅด์นœ ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„๊ณผ course_id ์ฐพ๊ธฐ
    • select name, course_id from instructor, teaches where instructor.ID = teaches.ID and instructor.dept_name = 'Art';
  • SQL์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•จ

The Rename Operation

  • SQL์€ as ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๊ณ„์™€ ์†์„ฑ์˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉ:
    • old-name as new-name
  • ๋งŒ์•ฝ new-name์ด ์†์„ฑ์ด ์•„๋‹Œ ๊ด€๊ณ„๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋ฉด, '์ƒ๊ด€ ์ด๋ฆ„(correlation name)'(SQL ํ‘œ์ค€), 'ํ…Œ์ด๋ธ” ๋ณ„์นญ(table alias)', '์ƒ๊ด€ ๋ณ€์ˆ˜(correlation variable)' ๋˜๋Š” 'ํŠœํ”Œ ๋ณ€์ˆ˜(tuple variable)'๋ผ๊ณ  ๋ถˆ๋ฆผ
  • 'Comp. Sci.'์— ์žˆ๋Š” ์–ด๋–ค ๊ฐ•์‚ฌ๋ณด๋‹ค ๋†’์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„ ์ฐพ๊ธฐ:
    • select distinct T.name from instructor as T, instructor as S where T.salary > S.salary and S.dept_name = 'Comp. Sci.';
  • as ํ‚ค์›Œ๋“œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ ์ƒ๋žต ๊ฐ€๋Šฅ (instructor as T โ‰ก\equivโ‰ก instructor T)

String Operations

  • SQL์€ ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์œ„ํ•œ ๋ฌธ์ž์—ด ๋งค์นญ ์—ฐ์‚ฐ์ž like๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ๋‘ ๊ฐœ์˜ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ ํŒจํ„ด์„ ์ด์šฉ:
    • ํผ์„ผํŠธ (%): ๋ชจ๋“  ํ•˜์œ„ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜
    • ๋ฐ‘์ค„ (_): ๋ชจ๋“  ๋‹จ์ผ ๋ฌธ์ž์™€ ์ผ์น˜
  • ์ด๋ฆ„์— "dar" ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„ ์ฐพ๊ธฐ
    • select name from instructor where name like '%dar%';
  • ๋ฌธ์ž์—ด "100%"์™€ ์ผ์น˜์‹œํ‚ค๊ธฐ
    • like '100\%' escape '\'
    • ์œ„ ์˜ˆ์‹œ์—์„œ ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๋ฅผ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ์‚ฌ์šฉ (๋‹ค๋ฅธ ์–ด๋–ค ๋ฌธ์ž๋„ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  • ํŒจํ„ด์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„
  • ํŒจํ„ด ๋งค์นญ ์˜ˆ์‹œ:
    • 'Intro%': "Intro"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜
    • '%Comp%': "Comp"๋ฅผ ํ•˜์œ„ ๋ฌธ์ž์—ด๋กœ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜
    • '_ _ _': ์ •ํ™•ํžˆ ์„ธ ๋ฌธ์ž๋กœ ๋œ ๋ชจ๋“  ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜
    • '_ _ _ %': ์ตœ์†Œ ์„ธ ๋ฌธ์ž๋กœ ๋œ ๋ชจ๋“  ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜
  • SQL์€ ๋‹ค์–‘ํ•œ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ ์ง€์›
    • ์—ฐ๊ฒฐ (|| ์‚ฌ์šฉ)
    • ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜
    • ๋ฌธ์ž์—ด ๊ธธ์ด ์ฐพ๊ธฐ, ํ•˜์œ„ ๋ฌธ์ž์—ด ์ถ”์ถœ ๋“ฑ

Ordering the Display of Tuples

  • ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ๋‚˜์—ด
    • select distinct name from instructor order by name;
  • ๊ฐ ์†์„ฑ์— ๋Œ€ํ•ด ๋‚ด๋ฆผ์ฐจ์ˆœ์€ desc, ์˜ค๋ฆ„์ฐจ์ˆœ์€ asc๋ฅผ ๋ช…์‹œ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๊ธฐ๋ณธ๊ฐ’
    • ์˜ˆ์‹œ: order by name desc
  • ์—ฌ๋Ÿฌ ์†์„ฑ์— ๋Œ€ํ•ด ์ •๋ ฌ ๊ฐ€๋Šฅ
    • ์˜ˆ์‹œ: order by dept_name desc, name asc

Where Clause Predicates

  • SQL์€ between ๋น„๊ต ์—ฐ์‚ฐ์ž๋ฅผ ํฌํ•จ
  • ์˜ˆ์‹œ: ๊ธ‰์—ฌ๊ฐ€ $90,000์—์„œ $100,000 ์‚ฌ์ด์ธ ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„ ์ฐพ๊ธฐ (์ฆ‰, โ‰ฅ\geโ‰ฅ $90,000 ์ด๊ณ  โ‰ค\leโ‰ค 100,000100,000100,000)
    • select name from instructor where salary between 90000 and 100000;
  • ํŠœํ”Œ ๋น„๊ต
    • select name, course_id from instructor, teaches where (instructor.ID, dept_name) = (teaches.ID, 'Biology');
  • ์œ„๋Š” ์•„๋ž˜์™€ ๋™์ผ
    • select name, course_id from instructor, teaches where instructor.ID = teaches.ID and dept_name = 'Biology';

Set Operations

  • ์ง‘ํ•ฉ ์—ฐ์‚ฐ union, intersect, except
  • ๊ฐ ์—ฐ์‚ฐ์€ ์ž๋™์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐ
  • ๋ชจ๋“  ์ค‘๋ณต์„ ์œ ์ง€ํ•˜๋ ค๋ฉด union all (๋˜๋Š” intersect all ํ˜น์€ except all) ์‚ฌ์šฉ
  • 2017๋…„ ๊ฐ€์„ ๋˜๋Š” 2018๋…„ ๋ด„์— ๊ฐœ์„ค๋œ ๊ณผ๋ชฉ ์ฐพ๊ธฐ
    • (select course_id from section where sem = 'Fall' and year = 2017) union (select course_id from section where sem = 'Spring' and year = 2018);
  • 2017๋…„ ๊ฐ€์„๊ณผ 2018๋…„ ๋ด„์— ๋ชจ๋‘ ๊ฐœ์„ค๋œ ๊ณผ๋ชฉ ์ฐพ๊ธฐ
    • (select course_id from section where sem = 'Fall' and year = 2017) intersect (select course_id from section where sem = 'Spring' and year = 2018);
  • 2017๋…„ ๊ฐ€์„์—๋Š” ๊ฐœ์„ค๋˜์—ˆ์ง€๋งŒ 2018๋…„ ๋ด„์—๋Š” ๊ฐœ์„ค๋˜์ง€ ์•Š์€ ๊ณผ๋ชฉ ์ฐพ๊ธฐ
    • (select course_id from section where sem = 'Fall' and year = 2017) except (select course_id from section where sem = 'Spring' and year = 2018);

Aggregate Functions

  • ์ด ํ•จ์ˆ˜๋“ค์€ ๊ด€๊ณ„ ๋‚ด ๊ฐ’๋“ค์˜ ์ปฌ๋ ‰์…˜(์ง‘ํ•ฉ ๋˜๋Š” ๋‹ค์ค‘ ์ง‘ํ•ฉ)์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋ฉฐ ๋‹จ์ผ ๊ฐ’์„ ๋ฐ˜ํ™˜
    • avg: ํ‰๊ท ๊ฐ’ (์ˆซ์ž ๊ฐ’์—๋งŒ ํ•ด๋‹น)
    • min: ์ตœ์†Ÿ๊ฐ’ (์ˆซ์ž ๋ฐ ๋น„์ˆซ์ž ๊ฐ’ ๋ชจ๋‘ ํ•ด๋‹น)
    • max: ์ตœ๋Œ“๊ฐ’ (์ˆซ์ž ๋ฐ ๋น„์ˆซ์ž ๊ฐ’ ๋ชจ๋‘ ํ•ด๋‹น)
    • sum: ๊ฐ’์˜ ํ•ฉ๊ณ„ (์ˆซ์ž ๊ฐ’์—๋งŒ ํ•ด๋‹น)
    • count: ๊ฐ’์˜ ๊ฐœ์ˆ˜ (์ˆซ์ž ๋ฐ ๋น„์ˆซ์ž ๊ฐ’ ๋ชจ๋‘ ํ•ด๋‹น)
  • SQL์—์„œ count๋ฅผ ์ œ์™ธํ•œ ์ง‘๊ณ„ ํ•จ์ˆ˜(aggregate functions)๋Š” null ๊ฐ’์„ ๋ฌด์‹œ
  • null ๊ฐ’์ด ๋ฌด์‹œ๋œ ๊ฒฐ๊ณผ๋กœ ๊ฐ’๋“ค์˜ ์ปฌ๋ ‰์…˜์ด ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ
  • ๋ชจ๋“  ์ง‘๊ณ„ ํ•จ์ˆ˜(count ์ œ์™ธ)๋Š” ๋นˆ ์ปฌ๋ ‰์…˜์— ์ ์šฉ๋  ๋•Œ null์„ ๋ฐ˜ํ™˜ (๋นˆ ์ปฌ๋ ‰์…˜์˜ count๋Š” 0์œผ๋กœ ์ •์˜๋จ)
  • count ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ non-null ๊ฐ’์ฒ˜๋Ÿผ ๋ชจ๋“  null ๊ฐ’์„ ๊ณ„์‚ฐ

Aggregate Functions Examples

  • ์ปดํ“จํ„ฐ ๊ณผํ•™ ํ•™๊ณผ ๊ฐ•์‚ฌ๋“ค์˜ ํ‰๊ท  ๊ธ‰์—ฌ ์ฐพ๊ธฐ
    • select avg(salary) from instructor where dept_name = 'Comp. Sci.';
  • 2018๋…„ ๋ด„ ํ•™๊ธฐ์— ๊ณผ๋ชฉ์„ ๊ฐ€๋ฅด์น˜๋Š” ์ด ๊ฐ•์‚ฌ ์ˆ˜ ์ฐพ๊ธฐ
    • select count(distinct ID) from teaches where semester = 'Spring' and year = 2018;
  • course ๊ด€๊ณ„์˜ ํŠœํ”Œ ์ˆ˜ ์ฐพ๊ธฐ
    • select count(*) from course;

Aggregate Functions โ€“ Group By

  • group by ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ํŠœํ”Œ ์ง‘ํ•ฉ์ด ์•„๋‹Œ, ๊ทธ๋ฃนํ™”๋œ ์—ฌ๋Ÿฌ ํŠœํ”Œ ์ง‘ํ•ฉ์— ๊ฐœ๋ณ„์ ์œผ๋กœ ์ง‘๊ณ„ ํ•จ์ˆ˜ ์ ์šฉ ๊ฐ€๋Šฅ
  • ๊ฐ ํ•™๊ณผ์˜ ๊ฐ•์‚ฌ ํ‰๊ท  ๊ธ‰์—ฌ ์ฐพ๊ธฐ
    • select dept_name, avg(salary) as avg_salary from instructor group by dept_name;
  • group by ์ ˆ ์‚ฌ์šฉ ์‹œ, ๊ฐ ๊ทธ๋ฃน๋‹น ํ•˜๋‚˜์˜ ํŠœํ”Œ๋งŒ ์ถœ๋ ฅ๋จ

Aggregation

  • ์ง‘๊ณ„ ํ•จ์ˆ˜ ์™ธ์˜ select ์ ˆ์— ์žˆ๋Š” ์†์„ฑ๋“ค์€ group by ๋ชฉ๋ก์— ๋‚˜ํƒ€๋‚˜์•ผ ํ•จ
    • /* erroneous query */
    • select dept_name, ID, avg(salary) from instructor group by dept_name;
  • ํŠน์ • ๊ทธ๋ฃน(dept_name์œผ๋กœ ์ •์˜๋จ)์˜ ๊ฐ ๊ฐ•์‚ฌ๋Š” ๋‹ค๋ฅธ ID๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ ๊ทธ๋ฃน์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ํŠœํ”Œ๋งŒ ์ถœ๋ ฅ๋จ

Aggregate Functions โ€“ Having Clause

  • having ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ๋  ๊ฐ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์กฐ๊ฑด ๋ช…์‹œ ๊ฐ€๋Šฅ
  • having ์ ˆ์˜ ์ˆ ์–ด๋Š” ๊ทธ๋ฃน ํ˜•์„ฑ ํ›„์— ์ ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด, where ์ ˆ์˜ ์ˆ ์–ด๋Š” ๊ทธ๋ฃน ํ˜•์„ฑ ์ „์— ์ ์šฉ๋จ
  • ํ‰๊ท  ๊ธ‰์—ฌ๊ฐ€ 42000๋ณด๋‹ค ํฐ ๋ชจ๋“  ํ•™๊ณผ์˜ ์ด๋ฆ„๊ณผ ํ‰๊ท  ๊ธ‰์—ฌ ์ฐพ๊ธฐ
    select dept_name, avg(salary) as avg_salary
    from instructor
    group by dept_name
    having avg(salary) > 42000;
    
  • ํ‰๊ฐ€ ์ˆœ์„œ
    1. from ์ ˆ์ด ๋จผ์ € ํ‰๊ฐ€๋จ
    2. where ์ ˆ์˜ ์ˆ ์–ด(์กด์žฌ ์‹œ)๊ฐ€ from ์ ˆ์˜ ๊ฒฐ๊ณผ์— ์ ์šฉ๋จ
    3. where ์ˆ ์–ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ํŠœํ”Œ๋“ค์ด group by ์ ˆ์— ์˜ํ•ด ๊ทธ๋ฃน์œผ๋กœ ๋ฐฐ์น˜๋จ
    4. having ์ ˆ(์กด์žฌ ์‹œ)์ด ๊ฐ ๊ทธ๋ฃน์— ์ ์šฉ๋จ; having ์ ˆ ์ˆ ์–ด๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ฃน๋“ค์€ ์ œ๊ฑฐ๋จ
    5. select ์ ˆ์€ ๋‚จ์€ ๊ทธ๋ฃน๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ง‘๊ณ„ ํ•จ์ˆ˜(์กด์žฌ ์‹œ)๋ฅผ ์ ์šฉํ•œ ํ›„ ๊ฐ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋‹จ์ผ ๊ฒฐ๊ณผ ํŠœํ”Œ์„ ์–ป์Œ

Nested Subqueries

  • SQL์€ ์„œ๋ธŒ์ฟผ๋ฆฌ(subquery)์˜ ์ค‘์ฒฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ œ๊ณต
  • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ๋‚ด์— ์ค‘์ฒฉ๋œ select-from-where ํ‘œํ˜„์‹
  • ์ค‘์ฒฉ์€ ๋‹ค์Œ SQL ์ฟผ๋ฆฌ์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Œ: select A1, A2, ..., An from r1, r2, ..., rm where P
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด:
    • from ์ ˆ: rir_iriโ€‹๋Š” ์œ ํšจํ•œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ
    • where ์ ˆ: PPP๋Š” B <operation> (subquery) ํ˜•ํƒœ์˜ ํ‘œํ˜„์‹์œผ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ. ์—ฌ๊ธฐ์„œ BBB๋Š” ์†์„ฑ
    • select ์ ˆ: AiA_iAiโ€‹๋Š” ๋‹จ์ผ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ(์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ, scalar subquery)๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ

Nested Subqueries: Set Membership

  • 2017๋…„ ๊ฐ€์„๊ณผ 2018๋…„ ๋ด„์— ์ œ๊ณต๋œ ๊ณผ๋ชฉ ์ฐพ๊ธฐ
    select distinct course_id
    from section
    where semester = 'Fall' and year = 2017 and
          course_id in (select course_id
                        from section
                        where semester = 'Spring' and year = 2018);
    
  • 2017๋…„ ๊ฐ€์„์—๋Š” ์ œ๊ณต๋˜์—ˆ์ง€๋งŒ 2018๋…„ ๋ด„์—๋Š” ์ œ๊ณต๋˜์ง€ ์•Š์€ ๊ณผ๋ชฉ ์ฐพ๊ธฐ
    select distinct course_id
    from section
    where semester = 'Fall' and year = 2017 and
          course_id not in (select course_id
                            from section
                            where semester = 'Spring' and year = 2018);
    
  • ์ด๋ฆ„์ด "Mozart"๋„ "Einstein"๋„ ์•„๋‹Œ ๋ชจ๋“  ๊ฐ•์‚ฌ ์ด๋ฆ„ ์ง€์ •
    • select distinct name from instructor where name not in ('Mozart', 'Einstein');
  • ID๊ฐ€ 10101์ธ ๊ฐ•์‚ฌ๊ฐ€ ๊ฐ€๋ฅด์นœ ๊ณผ๋ชฉ ์„น์…˜์„ ์ˆ˜๊ฐ•ํ•œ (๊ณ ์œ ํ•œ) ํ•™์ƒ๋“ค์˜ ์ด ์ˆ˜ ์ฐพ๊ธฐ
    select count(distinct ID)
    from takes
    where (course_id, sec_id, semester, year) in (select course_id, sec_id, semester, year
                                                  from teaches
                                                  where teaches.ID = '10101');
    
    • ์ฐธ๊ณ : ์œ„ ์ฟผ๋ฆฌ๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ„ ๊ณต์‹์€ SQL ๊ธฐ๋Šฅ ์„ค๋ช… ๋ชฉ์ ์ž„

Nested Subqueries: Set comparison (โ€œsomeโ€)

  • ์ƒ๋ฌผํ•™(Biology) ํ•™๊ณผ์— ์žˆ๋Š” ์–ด๋–ค (์ ์–ด๋„ ํ•œ ๋ช…์˜) ๊ฐ•์‚ฌ๋ณด๋‹ค ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ๊ฐ•์‚ฌ๋“ค์˜ ์ด๋ฆ„ ์ฐพ๊ธฐ
    • select distinct T.name from instructor as T, instructor as S where T.salary > S.salary and S.dept_name = 'Biology';
  • some ์ ˆ์„ ์‚ฌ์šฉํ•œ ๋™์ผํ•œ ์ฟผ๋ฆฌ
    • select name from instructor where salary > some (select salary from instructor where dept_name = 'Biology');

Definition of โ€œsomeโ€ Clause

  • F <comp> some r โ‡”โˆƒtโˆˆr\Leftrightarrow \exists t \in rโ‡”โˆƒtโˆˆr ุจุญูŠุซ ุฃู† (F<comp>t)(F <comp> t)(F<comp>t)
  • ์—ฌ๊ธฐ์„œ <comp>๋Š” <, <=, >, =, !=๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ
  • (5 < some {0, 5, 6}) = true
  • (5 < some {0, 5, 0}) = false
  • (5 = some {0, 5, 0}) = true
  • (5 != some {0, 5, 5}) = true (โˆต 0โ‰ 50 \ne 50๎€ =5)
  • (= some) โ‰ก\equivโ‰ก in
  • (!= some)์€ not in๊ณผ ๋™์น˜๊ฐ€ ์•„๋‹˜

Nested Subqueries: Set comparison (โ€œallโ€)

  • ์ƒ๋ฌผํ•™ ํ•™๊ณผ์˜ ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ๊ธ‰์—ฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฐ•์‚ฌ์˜ ์ด๋ฆ„ ์ฐพ๊ธฐ
    • select name from instructor where salary > all (select salary from instructor where dept_name = 'Biology');

Definition of โ€œallโ€ Clause

  • F <comp> all r โ‡”โˆ€tโˆˆr(F<comp>t)\Leftrightarrow \forall t \in r (F <comp> t)โ‡”โˆ€tโˆˆr(F<comp>t)
  • (5 < all {0, 5, 6}) = false
  • (5 < all {6, 10, 4}) = false
  • (5 = all {4, 5, 6}) = false
  • (5 != all {4, 6}) = true (โˆต 5โ‰ 45 \ne 45๎€ =4 ์ด๊ณ  5โ‰ 65 \ne 65๎€ =6)
  • (= all)์€ in๊ณผ ๋™์น˜๊ฐ€ ์•„๋‹˜
  • (!= all) โ‰ก\equivโ‰ก not in

Nested Subqueries: Test for Empty Relations

  • exists ๊ตฌ๋ฌธ์€ ์ธ์ˆ˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜
  • exists r โ‡”rโ‰ โˆ…\Leftrightarrow r \ne \emptysetโ‡”r๎€ =โˆ…
  • not exists r โ‡”r=โˆ…\Leftrightarrow r = \emptysetโ‡”r=โˆ…
  • "2017๋…„ ๊ฐ€์„ ํ•™๊ธฐ์™€ 2018๋…„ ๋ด„ ํ•™๊ธฐ ๋ชจ๋‘์— ๊ฐ€๋ฅด์นœ ๋ชจ๋“  ๊ณผ๋ชฉ ์ฐพ๊ธฐ" ์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•
    select course_id
    from section as S
    where semester = 'Fall' and year = 2017 and
          exists (select *
                  from section as T
                  where semester = 'Spring' and year = 2018 and
                        S.course_id = T.course_id);
    
  • SQL์—์„œ, ์™ธ๋ถ€ ์ฟผ๋ฆฌ์˜ ์ƒ๊ด€ ์ด๋ฆ„(๋ณ€์ˆ˜ S)์€ where ์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
  • ์™ธ๋ถ€ ์ฟผ๋ฆฌ์˜ ์ƒ๊ด€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ(correlated subquery)๋ผ๊ณ  ํ•จ

Use of โ€œnot existsโ€ Clause

  • ์ƒ๋ฌผํ•™ ํ•™๊ณผ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ณผ๋ชฉ์„ ์ˆ˜๊ฐ•ํ•œ ๋ชจ๋“  ํ•™์ƒ ์ฐพ๊ธฐ
  • Xโˆ’Y=โˆ…โ‡”XโІYX - Y = \emptyset \Leftrightarrow X \subseteq YXโˆ’Y=โˆ…โ‡”XโІY ์ฐธ๊ณ 
    select distinct S.ID, S.name
    from student as S
    where not exists ( (select course_id
                        from course
                        where dept_name = 'Biology')
                       except
                       (select T.course_id
                        from takes as T
                        where S.ID = T.ID) );
    
  • ์ฒซ ๋ฒˆ์งธ ์ค‘์ฒฉ ์ฟผ๋ฆฌ๋Š” ์ƒ๋ฌผํ•™์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ณผ๋ชฉ์„ ๋‚˜์—ด
  • ๋‘ ๋ฒˆ์งธ ์ค‘์ฒฉ ์ฟผ๋ฆฌ๋Š” ํŠน์ • ํ•™์ƒ์ด ์ˆ˜๊ฐ•ํ•œ ๋ชจ๋“  ๊ณผ๋ชฉ์„ ๋‚˜์—ด

Nested Subqueries: Test for Absence of Duplicate Tuples

  • unique ๊ตฌ๋ฌธ์€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ์ค‘๋ณต ํŠœํ”Œ์ด ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ
  • ์ฃผ์–ด์ง„ ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์ค‘๋ณต์ด ์—†์œผ๋ฉด true๋กœ ํ‰๊ฐ€๋จ
  • 2017๋…„์— ์ตœ๋Œ€ ํ•œ ๋ฒˆ ์ œ๊ณต๋œ ๋ชจ๋“  ๊ณผ๋ชฉ ์ฐพ๊ธฐ
    select T.course_id
    from course as T
    where unique (select R.course_id
                  from section as R
                  where T.course_id = R.course_id and R.year = 2017);
    

Subqueries in the โ€˜fromโ€™ Clause

  • SQL์€ from ์ ˆ์—์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉ
  • ํ‰๊ท  ๊ธ‰์—ฌ๊ฐ€ $42,000 ์ด์ƒ์ธ ํ•™๊ณผ๋“ค์˜ ๊ฐ•์‚ฌ ํ‰๊ท  ๊ธ‰์—ฌ ์ฐพ๊ธฐ
    select dept_name, avg_salary
    from (select dept_name, avg(salary) as avg_salary
          from instructor
          group by dept_name)
    where avg_salary > 42000;
    
  • having ์ ˆ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜
  • ์œ„ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•
    select dept_name, avg_salary
    from (select dept_name, avg(salary)
          from instructor
          group by dept_name)
          as dept_avg(dept_name, avg_salary)
    where avg_salary > 42000;
    

Nested Subqueries: โ€˜Withโ€™ Clause

  • with ์ ˆ์€ with ์ ˆ์ด ๋ฐœ์ƒํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ๋งŒ ์ •์˜๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž„์‹œ ๊ด€๊ณ„(์ž„์‹œ ๋ทฐ)๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ œ๊ณต
  • ํ‰๊ท  ์˜ˆ์‚ฐ๋ณด๋‹ค ๋” ํฐ ์˜ˆ์‚ฐ์„ ๊ฐ€์ง„ ๋ชจ๋“  ํ•™๊ณผ ์ฐพ๊ธฐ
    with avg_budget(value) as
        (select avg(budget) from department)
    select department.name
    from department, avg_budget
    where department.budget > avg_budget.value;
    

Complex Queries using โ€˜Withโ€™ Clause

  • ์ด ๊ธ‰์—ฌ๊ฐ€ ๋ชจ๋“  ํ•™๊ณผ์˜ ์ด ๊ธ‰์—ฌ ํ‰๊ท ๋ณด๋‹ค ํฐ ๋ชจ๋“  ํ•™๊ณผ ์ฐพ๊ธฐ
    with dept_total (dept_name, value) as
        (select dept_name, sum(salary)
         from instructor
         group by dept_name),
    dept_total_avg(value) as
        (select avg(value)
         from dept_total)
    select dept_name
    from dept_total, dept_total_avg
    where dept_total.value > dept_total_avg.value;
    

Nested Subqueries: Scalar Subquery

  • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋‹จ์ผ ๊ฐ’์ด ์˜ˆ์ƒ๋˜๋Š” ๊ณณ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
  • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์™ธ๋ถ€ ์ฟผ๋ฆฌ์˜ select ์ ˆ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
  • ๊ฐ ํ•™๊ณผ์˜ ๊ฐ•์‚ฌ ์ˆ˜์™€ ํ•จ๊ป˜ ๋ชจ๋“  ํ•™๊ณผ ๋‚˜์—ด
    select dept_name,
           (select count(*)
            from instructor
            where department.dept_name = instructor.dept_name)
            as num_instructors
    from department;
    
  • ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฒฐ๊ณผ ํŠœํ”Œ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

Null Values

  • ํŠœํ”Œ์ด ์ผ๋ถ€ ์†์„ฑ์— ๋Œ€ํ•ด null๋กœ ํ‘œ์‹œ๋˜๋Š” null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
  • null์€ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๊ฑฐ๋‚˜ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธ
  • null์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ์‚ฐ์ˆ  ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋Š” null
  • ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” null ๊ฐ’์„ ๋ฌด์‹œ
  • ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ๊ทธ๋ฃนํ™”์˜ ๊ฒฝ์šฐ, null์€ ๋‹ค๋ฅธ ๊ฐ’์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋˜๋ฉฐ, ๋‘ null์€ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋จ
  • is null ์ˆ ์–ด๋Š” null ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
  • ์˜ˆ์‹œ: ๊ธ‰์—ฌ๊ฐ€ null์ธ ๋ชจ๋“  ๊ฐ•์‚ฌ ์ฐพ๊ธฐ
    • select name from instructor where salary is null;
  • is not null ์ˆ ์–ด๋Š” ์ ์šฉ๋œ ๊ฐ’์ด null์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์„ฑ๊ณต
  • SQL์€ null ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๋น„๊ต์˜ ๊ฒฐ๊ณผ๋ฅผ unknown์œผ๋กœ ์ฒ˜๋ฆฌ (is null ๋ฐ is not null ์ˆ ์–ด ์ œ์™ธ)
  • ์˜ˆ์‹œ: 5 < null ๋˜๋Š” null <> null ๋˜๋Š” null = null
  • where ์ ˆ์˜ ์ˆ ์–ด๋Š” ๋ถˆ๋ฆฌ์–ธ(boolean) ์—ฐ์‚ฐ(and, or, not)์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, unknown ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ๋ฆฌ์–ธ ์—ฐ์‚ฐ์˜ ์ •์˜๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•จ
    • and: (true and unknown) = unknown, (false and unknown) = false, (unknown and unknown) = unknown
    • or: (unknown or true) = true, (unknown or false) = unknown, (unknown or unknown) = unknown
    • not: (not unknown) = unknown
  • SQL์—์„œ P is unknown์€ ์ˆ ์–ด P๊ฐ€ unknown์œผ๋กœ ํ‰๊ฐ€๋˜๋ฉด true๋กœ ํ‰๊ฐ€๋จ
  • where ์ ˆ ์ˆ ์–ด์˜ ๊ฒฐ๊ณผ๋Š” unknown์œผ๋กœ ํ‰๊ฐ€๋˜๋ฉด false๋กœ ์ฒ˜๋ฆฌ๋จ

Modification of the Database

  • ์ฃผ์–ด์ง„ ๊ด€๊ณ„์—์„œ ํŠœํ”Œ ์‚ญ์ œ
  • ์ฃผ์–ด์ง„ ๊ด€๊ณ„์— ์ƒˆ ํŠœํ”Œ ์‚ฝ์ž…
  • ์ฃผ์–ด์ง„ ๊ด€๊ณ„์˜ ์ผ๋ถ€ ํŠœํ”Œ ๊ฐ’ ์—…๋ฐ์ดํŠธ

Deletion

  • ๋ชจ๋“  ๊ฐ•์‚ฌ ์‚ญ์ œ
    • delete from instructor;
  • ์žฌ๋ฌด(Finance) ํ•™๊ณผ์˜ ๋ชจ๋“  ๊ฐ•์‚ฌ ์‚ญ์ œ
    • delete from instructor where dept_name = 'Finance';
  • 'ITBT' ๊ฑด๋ฌผ์— ์œ„์น˜ํ•œ ํ•™๊ณผ์™€ ๊ด€๋ จ๋œ instructor ๊ด€๊ณ„์˜ ๋ชจ๋“  ํŠœํ”Œ ์‚ญ์ œ
    • delete from instructor where dept_name in (select dept_name from department where building = 'ITBT');
  • ๊ธ‰์—ฌ๊ฐ€ ๊ฐ•์‚ฌ ํ‰๊ท  ๊ธ‰์—ฌ๋ณด๋‹ค ์ ์€ ๋ชจ๋“  ๊ฐ•์‚ฌ ์‚ญ์ œ
    • ๋ฌธ์ œ์ : instructor์—์„œ ํŠœํ”Œ์„ ์‚ญ์ œํ•จ์— ๋”ฐ๋ผ ํ‰๊ท  ๊ธ‰์—ฌ๊ฐ€ ๋ณ€๊ฒฝ๋จ
    • SQL์˜ ํ•ด๊ฒฐ์ฑ…:
      1. ๋จผ์ € avg(salary)๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‚ญ์ œํ•  ๋ชจ๋“  ํŠœํ”Œ์„ ์ฐพ์Œ
      2. ์œ„์—์„œ ์ฐพ์€ ๋ชจ๋“  ํŠœํ”Œ์„ ์‚ญ์ œ (ํ‰๊ท ์„ ์žฌ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ํŠœํ”Œ์„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ)
    delete from instructor
    where salary < (select avg(salary) from instructor);
    

Insertion

  • course์— ์ƒˆ ํŠœํ”Œ ์ถ”๊ฐ€
    • insert into course values ('CS-437', 'Database Systems', 'Comp. Sci.', 4);
  • ๋˜๋Š” ๋™๋“ฑํ•˜๊ฒŒ
    • insert into course (course_id, title, dept_name, credits) values ('CS-437', 'Database Systems', 'Comp. Sci.', 4);
  • tot_creds๊ฐ€ null๋กœ ์„ค์ •๋œ ์ƒˆ ํŠœํ”Œ์„ student์— ์ถ”๊ฐ€
    • insert into student values ('3003', 'Green', 'Finance', null);
  • 144 ํ•™์  ์ด์ƒ์„ ์ด์ˆ˜ํ•œ ์Œ์•…(Music) ํ•™๊ณผ์˜ ๊ฐ ํ•™์ƒ์„ ๊ธ‰์—ฌ $18,000์˜ ์Œ์•… ํ•™๊ณผ ๊ฐ•์‚ฌ๋กœ ๋งŒ๋“ฆ
    • insert into instructor select ID, name, dept_name, 18000 from student where dept_name = 'Music' and total_cred > 144;
  • student ๊ด€๊ณ„์˜ ์Šคํ‚ค๋งˆ: (ID, name, dept_name, tot_cred)
  • instructor ๊ด€๊ณ„์˜ ์Šคํ‚ค๋งˆ: (ID, name, dept_name, salary)
  • select from where ๋ฌธ์€ ๊ทธ ๊ฒฐ๊ณผ ์ค‘ ์–ด๋–ค ๊ฒƒ์ด๋ผ๋„ ๊ด€๊ณ„์— ์‚ฝ์ž…๋˜๊ธฐ ์ „์— ์™„์ „ํžˆ ํ‰๊ฐ€๋จ

Updates

  • ๋ชจ๋“  ๊ฐ•์‚ฌ์—๊ฒŒ 5% ๊ธ‰์—ฌ ์ธ์ƒ
    • update instructor set salary = salary * 1.05;
  • 70000 ๋ฏธ๋งŒ์„ ๋ฒ„๋Š” ๊ฐ•์‚ฌ์—๊ฒŒ 5% ๊ธ‰์—ฌ ์ธ์ƒ
    • update instructor set salary = salary * 1.05 where salary < 70000;
  • ํ‰๊ท ๋ณด๋‹ค ๊ธ‰์—ฌ๊ฐ€ ์ ์€ ๊ฐ•์‚ฌ์—๊ฒŒ 5% ๊ธ‰์—ฌ ์ธ์ƒ
    • update instructor set salary = salary * 1.05 where salary < (select avg(salary) from instructor);
  • ๊ธ‰์—ฌ๊ฐ€ $100,000 ์ด์ƒ์ธ ๊ฐ•์‚ฌ์˜ ๊ธ‰์—ฌ๋ฅผ 3% ์ธ์ƒํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” 5% ์ธ์ƒ
  • ๋‘ ๊ฐœ์˜ update ๋ฌธ ์ž‘์„ฑ (์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•จ):
    update instructor set salary = salary * 1.03 where salary > 100000;
    update instructor set salary = salary * 1.05 where salary <= 100000;
    
  • case ๋ฌธ์„ ์‚ฌ์šฉํ•œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•:
    update instructor
    set salary = case
                    when salary <= 100000 then salary * 1.05
                    else salary * 1.03
                 end;
    
์ตœ๊ทผ ์ˆ˜์ •: 26. 1. 3. ์˜คํ›„ 9:57
Contributors: kmbzn
Prev
2. Relational Model
Next
6. E-R Model

BUILT WITH

CloudflareNode.jsGitHubGitVue.jsJavaScriptVSCodenpm

All trademarks and logos are property of their respective owners.
ยฉ 2026 kmbzn ยท MIT License