SQL (Structured Query Language) ?
SQLμ 1974λ μ IBM μ°κ΅¬μμμ System Rμ΄λΌλ κ΄κ³ν DBMSλ₯Ό μ°κ΅¬ν λ κ΄κ³ν λμμ κ΄κ³ν ν΄μμ κΈ°λ°μΌλ‘ μ§κ³ ν¨μμ κ°±μ μ°μ° λ±μ μΆκ°νμ¬ κ°λ°λ λ°μ΄ν° μΈμ΄μ λλ€.
SQL λ°μ΄ν° μ μμ΄
μ¬μ©μλ SQL λ°μ΄ν° μ μμ΄λ₯Ό μ¬μ©νμ¬ ν μ΄λΈ, μλ‘μ΄ attribute, λ·°, μΈλ±μ€λ₯Ό μμ± λ° μ κ±°ν μ μμ΅λλ€.
CREATE TABLE νμ(
νλ² INTEGER NOT NULL,
μ΄λ¦ CHAR(10),
λμ΄ INTEGER,
νκ³Ό CHAR(10),
PRIMARY KEY(νλ²),
FOREIGN KEY(νλ²) REFERENCES λ±λ‘(νλ²)
ON DELETE CASCADE,
ON UPDATE CASCADE,
CHECK(λμ΄>=0 AND λμ΄<=100)
);
SQL λ¬Έμ attribute κ°μΌλ‘ NULLμ νμ©νκΈ° λλ¬Έμ, κΈ°λ³Έν€μ κ°μ΄ NULLμ νμ©νμ§ μμΌλ €λ©΄ NOT NULLμ λͺ μν΄μ£Όμ΄μΌ ν©λλ€.
PRIMARY KEYλ κΈ°λ³Έν€λ₯Ό λͺ μΈνκ³ , κΈ°λ³Έν€μ attributeλ NULL κ°μ κ°μ§ μ μκ³ μ€λ³΅λ κ°μ΄ μ‘΄μ¬ν μ μμ΅λλ€.
FOREIGN KEYλ μΈλν€λ₯Ό λͺ μΈνκ³ , μ°Έμ‘° 무결μ±μ μ μ§νκΈ° μν΄ μ°Έμ‘°νκ³ μλ νμ΄ DELETE λκ±°λ UPDATE λ λ μ·¨ν΄μΌν λμμ λͺ μν©λλ€. μμμλ CASCADEλ‘ μΈλν€κ° μ°Έμ‘°νλ κΈ°λ³Έν€μ λ³κ²½μ΄λ μμ κ° μΌμ΄λ¬μ λ μ΄λ₯Ό μ°Έμ‘°νκ³ μλ ν μ΄λΈμ λͺ¨λ ννμμλ λ³κ²½λ κΈ°λ³Έν€μ λμΌνκ² μ°μμ μΌλ‘ λ³κ²½λ©λλ€.
CHECK μ μμλ λμ΄ attributeμ κ°μ λ²μλ₯Ό μ§μ ν΄μ€λλ€.
SQL λ°μ΄ν° μ‘°μμ΄
SQLμ λ°μ΄ν° μ‘°μμ΄μλ SELECT, INSERT, DELETE, UPDATEκ° μμ΅λλ€.
SELECT
SELECT νλ², λμ΄ FROM νμ WHERE μ΄λ¦ = 'νκΈΈλ';
SQLμ SELECT λ¬Έμ μ§μ κ²°κ³Όμμ λκ°μ ννμ μλμΌλ‘ μ κ±°νμ§ μμ΅λλ€.
μλμΌλ‘ μ κ±°νκΈ° μν΄μλ μ λ ¬μ΄ νμνλ°, μκ°μ΄ μ€λ걸릴 μ μκΈ° λλ¬Έμ λλ€.
SELECT λ¬Έμμ ννμ μ€λ³΅μ μ κ±°νκΈ° μν΄μλ DISTINCTλ₯Ό λͺ μν΄μ£Όμ΄μΌ ν©λλ€.
SELECT DISTINCT λμ΄ FROM νμ WHERE νκ³Ό = 'μ»΄ν¨ν°';
LIKE
LIKEλ₯Ό μ¬μ©νλ©΄ ν¨ν΄μ μΌμΉνλ λ°μ΄ν°λ₯Ό κ²μν μ μμ΅λλ€.
LIKE λ¬Έμμ '%'λ ν¨ν΄μ μΌμΉνλ λͺ¨λ λ¬Έμ, '_'λ ν¨ν΄μ μΌμΉνλ νλμ λ¬Έμλ₯Ό μλ―Έν©λλ€.
SELECT μ΄λ¦, νκ³Ό FROM νμ WHERE νκ³Ό LIKE '2018%';
ORDER BY
ORDER BYλ₯Ό μ΄μ©ν΄ μ€λ¦μ°¨μ λλ λ΄λ¦Όμ°¨μμΌλ‘ κ²°κ³Όλ₯Ό μ λ ¬ν μ μμ΅λλ€.
SELECT μ΄λ¦, νκ³Ό FROM νμ ORDER BY λμ΄ DESC, νλ² ASC;
μμ κ°μ μν©μμ λμ΄λ μ£Ό(1μ°¨) μ λ ¬ν€μ΄κ³ , νλ²μ λΆ(2μ°¨) μ λ ¬ν€κ° λ©λλ€.
AS
ASλ₯Ό μ¬μ©νλ©΄ ν μ΄λΈμ μ΄ μ΄λ¦μ λ³κ²½νμ¬ μΆλ ₯ν μ μμ΅λλ€.
SELECT νλ² AS DBνμνλ², 'λμ΄ = ' AS λ΄μ©, λμ΄ FROM νμ;
μ‘°μΈ
λ κ° μ΄μμ ν μ΄λΈλ‘λΆν° λ°μ΄ν°λ₯Ό μ‘°μΈνλ 볡μ ν μ΄λΈ μ§μκ° κ°λ₯ν©λλ€.
SELECT S1.νλ², S2.νλ² FROM νμ S1, νμ S2 WHERE S1.νκ³Ό = S2.νκ³Ό;
μμ κ°μ΄ μκΈ° μμ μ ν μ΄λΈμ μ‘°μΈλ κ°λ₯νλ©° μ΄λλ μ΄ μ°Έμ‘°λ₯Ό λͺ ννκ² νκΈ° μν΄ FROM λ€μ ν μ΄λΈ μ΄λ¦μλ λ³μΉμ μ§μ ν΄ μ¬μ©ν©λλ€.
μ§κ³ ν¨μ
COUNT, SUM, AVG, MAX, MIN λ± μ§κ³ ν¨μλ₯Ό μ¬μ©ν μ μκ³ , μ΄λ SELECT, HAVING μ μμλ§ μ¬μ©ν μ μμ΅λλ€.
SELECT COUNT(*) AS νμμ FROM νμ WHERE νκ³Ό = 'μ»΄ν¨ν°';
μμ κ²½μ° νμ ν μ΄λΈμμ μ»΄ν¨ν° νκ³Όμ νμ μλ₯Ό κ²μνκ² λ©λλ€.
SELECT AVG(λμ΄) AS νκ· λμ΄ FROM νμ;
μλ νμ ν μ΄λΈμμ νκ· λμ΄λ₯Ό κ²μνκ² λ©λλ€.
GROUP BY
GROUP BYλ₯Ό μ¬μ©νλ©΄ κ°μ κ°λΌλ¦¬ λ¬Άμ΄μ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€.
SELECT νκ³Ό, AVG(λμ΄) AS νκ· λμ΄ FROM νμ GROUP BY νκ³Ό;
μμ κ²½μ° νκ³Ό λ³λ‘ νκ· λμ΄λ₯Ό κ²μνκ² λ©λλ€.
HAVING
μμ νκ· λμ΄μ κ°μ΄ κ·Έλ£ΉμΌλ‘ λ¬Άμ¬μ κ³μ°λ μμ±λ€μ 쑰건μ μ£ΌκΈ° μν΄μλ WHEREμ΄ μλ HAVING μ μ μ¬μ©ν΄μΌ ν©λλ€.
SELECT νκ³Ό, AVG(λμ΄) AS νκ· λμ΄ FROM νμ GROUP BY νκ³Ό HAVING AVG(λμ΄) >= 25;
μ΄λ κ² λλ©΄ νκ³Ό λ³λ‘ νκ· λμ΄λ₯Ό κ²μνλ, κ·Έ νκ· λμ΄κ° 25 μ΄μμΈ κ²½μ°λ§ λμ€κ² λ©λλ€.
μ€μ²© μ§μλ¬Έ
λ°μ΄ν°λ² μ΄μ€μμ μ΄λ€ κ°μ κ²μνκ³ , κ·Έ κ°μ λ€μ λΉκ΅ 쑰건μμ μ¬μ©νκΈ° μν΄μ μ€μ²© μ§μλ¬Έ(nested query)μ μ¬μ©ν©λλ€.
SELECT μ΄λ¦ FROM νμ WHERE νκ³Ό = (SELECT νκ³Ό FROM νμ WHERE μ΄λ¦ = 'νκΈΈλ');
μλ μ€μ²© μ§μλ¬Έμ κ²°κ³Όκ° ν κ°μ λ¨μΌκ°μ΄ λ°νλλ κ²½μ°λ‘, νκΈΈλ νμμ νκ³Όμ κ°μ νμμ μ΄λ¦μ΄ κ²μλ©λλ€.
SELECT μ΄λ¦ FROM νμ WHERE νλ² IN (SELECT νλ² FROM νμ WHERE νκ³Ό = 'μ»΄ν¨ν°');
μλ μ€μ²© μ§μλ¬Έμ κ²°κ³Όκ° ν κ°μ attributeλ‘ μ΄λ£¨μ΄μ§ ν μ΄λΈλ‘ λ°νλλ κ²½μ°λ‘, μ»΄ν¨ν° νκ³Όμ νμ μ΄λ¦μ΄ κ²μλ©λλ€.
μ΄λ INμ ν attributeκ° μ€μ²© μ§μλ¬Έ κ²°κ³Ό κ°λ€μ μ§ν©μ μνλ μ§ κ²μ¬ν©λλ€.
ALL, ANY, SOMEκ³Ό κ°μ ν€μλλ μ¬μ©ν μ μμ΅λλ€.
SELECT νκ³Ό, μ΄λ¦ FROM νμ WHERE λμ΄ > ALL(SELECT λμ΄ FROM νμ WHERE νκ³Ό = 'μ»΄ν¨ν°');
μλ > μΌμͺ½μ λμ΄κ° μ€λ₯Έμͺ½ μ€μ²© μ§μλ¬Έμμ κ²μλ λͺ¨λ λμ΄λ³΄λ€ ν΄ λ μ°Έμ΄ λ©λλ€.
λ°λΌμ μ»΄ν¨ν° νκ³Όμ μ΄λ€ νμμ λμ΄λ³΄λ€ λ§μ νμμ΄ κ²μλ©λλ€.
ALLμ μΌμͺ½ attributeμ κ°μ΄ μ€λ₯Έμͺ½ μ€μ²© μ§μλ¬Έμ κ²°κ³Όμ λͺ¨λ 쑰건μ λ§μ‘±ν΄μΌ νλ ANDμ μλ―Έμ΄κ³ ,
ANYλ νλ μ΄μ λ§μ‘±νλ©΄ λλ ORμ μλ―Έλ‘ μ΄ν΄ν μ μμ΅λλ€.
SELECT μ΄λ¦ FROM νμ WHERE EXISTS (SELECT * FROM νμ WHERE νκ³Ό = 'μ μ');
μλ μ€μ²© μ§μλ¬Έμ κ²°κ³Όκ° μ¬λ¬ attributeλ‘ μ΄λ£¨μ΄μ§ ν μ΄λΈλ‘ λ°νλλ κ²½μ°λ‘, EXISTSλ₯Ό μ¬μ©νμ¬ μ€μ²© μ§μλ¬Έμ κ²°κ³Όκ° λΉ ν μ΄λΈμΈμ§ κ²μ¬ν©λλ€. μ§μλ¬Έμ κ²°κ³Όκ° λΉ ν μ΄λΈμ΄ μλλ©΄ μ°Έμ΄ λκ³ , λ°λΌμ μλ μ μκ³Ό νμμ μ΄λ¦μ κ²μν©λλ€.
νμ ν μ΄λΈμμ μ΄λ¦μ κ²μνλλ°, κ·Έ νμμ νκ³Όκ° μ μκ³Όμ¬μ μ€μ²© μ§μλ¬Έμ κ²°κ³Ό ν μ΄λΈμ κ·Έ ννμ΄ μ‘΄μ¬νλ νμμ λλ€.
UNION
UNIONμ μ¬μ©νλ €λ©΄ λ SELECT λ¬Έμ κ²°κ³Ό ν μ΄λΈμ΄ ν©λ³ κ°λ₯ν΄μΌ ν©λλ€.
UNIONμ κΈ°λ³Έμ μΌλ‘ ν©μ§ν©κ³Ό κ°μΌλ―λ‘ UNION ALLμ μ¬μ©νλ κ²μ΄ μλλΌλ©΄ μ€λ³΅λ ννμ μλμ μΌλ‘ μμ λ©λλ€.
SELECT μ΄λ¦ FROM νμ WHERE νκ³Ό = 'μ»΄ν¨ν°'
UNION SELECT FROM μ΄λ¦ FROM νμ WHERE λμ΄ = 24;
μλ μ»΄ν¨ν°κ³Ό νμμ΄κ±°λ λμ΄κ° 24μΈ νμμ μ΄λ¦μ κ²μν©λλ€.
INSERT
INSERTλ κΈ°μ‘΄ ν μ΄λΈμ λ°μ΄ν°λ₯Ό μΆκ°νλ μμ μ λλ€.
μ°Έμ‘°λλ λ°μ΄ν° ν μ΄λΈμ ννμ΄ μλ‘ μ½μ λλ κ²½μ° μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ μλ°°λμ§ μμ§λ§,
μ°Έμ‘°νλ ν μ΄λΈμ μλ‘μ΄ ννμ΄ μ½μ λλ κ²½μ°μ μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ μλ°°νλ κ²½μ°κ° μκΈΈ μ μμ΅λλ€.
INSERT INTO νμ(νλ², μ΄λ¦, λμ΄, νκ³Ό) VALUES (20181234, 'νκΈΈλ', 24, 'μ»΄ν¨ν°');
INSERT INTO νμ VALUES (20181111, 'κΉμ² μ', 23, 'μ μ');
μμ κ°μ΄ μ΄ μ΄λ¦μ μλ΅νλ©΄ ν μ΄λΈμ μΌμͺ½λΆν° μ€λ₯Έμͺ½μΌλ‘ μμλλ‘ μ½μ λ©λλ€.
INSERT INTO μ μκ³Ό(νλ², μ΄λ¦, λμ΄) SELECT νλ², μ΄λ¦, νκ³Ό FROM νμ WHERE νκ³Ό = 'μ μ';
μμ κ°μ΄ VALUES λμ μ€μ²© μ§μλ¬Έμ λ£μ΄ ν λ²μ μ¬λ¬ κ°μ ννλ€μ μ½μ ν μλ μμ΅λλ€.
DELETE
DELETEλ κΈ°μ‘΄ ν μ΄λΈμ μ‘΄μ¬νλ λ°μ΄ν°λ₯Ό μμ νλ μμ μ λλ€.
μ°Έμ‘°λλ λ°μ΄ν° ν μ΄λΈμμ ννμ΄ μμ λλ κ²½μ° μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ μλ°°λλ κ²½μ°κ° μκΈΈ μ μκ³ ,
μ°Έμ‘°νλ ν μ΄λΈμμ ννμ μμ νλ©΄ μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ μλ°°λμ§ μμ΅λλ€.
-- νκΈΈλ νμ μμ
DELETE FROM νμ WHERE μ΄λ¦ = 'νκΈΈλ';
-- νμ ν
μ΄λΈμ λͺ¨λ ν μμ
DELETE FROM νμ;
UPDATE
UPDATEλ κΈ°μ‘΄ ν μ΄λΈμ λ°μ΄ν°λ₯Ό κ°±μ νλ μμ μ λλ€.
κ°±μ μμ κΈ°λ³Έν€λ μΈλν€μ μνλ attributeμ κ°μ΄ μμ λλ©΄ μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ μλ°°λ μ μμΌλ―λ‘ μ£Όμν΄μΌ ν©λλ€.
UPDATE νμ SET νκ³Ό = 'μ μ' WHERE μ΄λ¦ = 'νκΈΈλ';
-- μ€μ²© μ§μλ¬Έ μ΄μ©
UPDATE νμ SET λμ΄ = 22 WHERE νλ² IN (SELECT νλ² FROM νμ WHERE μ΄λ¦ = 'νκΈΈλ');
λ·° (View)
Viewλ νλ λλ λ μ΄μμ ν μ΄λΈλ‘λΆν° μ λλμ΄ λ§λ€μ΄μ§λ κ°μμ ν μ΄λΈμ λλ€.
-- λ·° μμ±
CREATE VIEW νμλ·°(νλ², μ΄λ¦) AS SELECT νλ², μ΄λ¦ FROM νμ WHERE νκ³Ό = 'μ»΄ν¨ν°'
WITH CHECK OPTION;
-- λ·° μ κ±°
DROP VIEW νμλ·° CASCADE;
μμμ WITH CHECK OPTION μ μ μμ±λ λ·°μ λν κ°±μ , μ½μ μ°μ° μμ λ·°μ μ μ μ‘°κ±΄μΈ νκ³Ό = 'μ»΄ν¨ν°'λ₯Ό μλ°νλ©΄ μ€νμ΄ λμ§ μκ² ν©λλ€.
CASCADEλ μ΄ λ·° λΏλ§ μλλΌ μ΄ λ·°μ μ’ μμ μΈ λ€λ₯Έ λͺ¨λ λ·°, μ μ½ μ‘°κ±΄μ΄ ν¨κ» μ κ±°λκ³ , RESTRICTλ μ΄ λ·°μ μ’ μμ μΈ λ·°κ° μ μλμ§ μμμ λλ§ λ·°λ₯Ό μμ νκ² λ©λλ€.
λ·°μ μ₯μ
- κ΄λ ¨λ λ°μ΄ν°λ§ μ΄μ© κ°λ₯
- μ€μνκ³ μ ν©ν λ°μ΄ν°λ§μΌλ‘ κ΅¬μ± κ°λ₯
- λ―Όκ°ν λ°μ΄ν°μ λν μ κ·Ό κΈμ§κ° κ°λ₯
- λ°μ΄ν°λ² μ΄μ€μ 볡μ‘μ± ν΄μ κ°λ₯
- 볡μ‘ν λ°μ΄ν°λ² μ΄μ€μ ꡬ쑰λ₯Ό μ¨κΈΈ μ μμ
- 볡μ‘ν μ§μ λ¨μν κ°λ₯
- κΆν λΆμ¬ λ¨μν κ°λ₯
λ·°μ λ¨μ
- μ μλ₯Ό λ³κ²½ν μ μμ
- μ½μ , μμ , κ°±μ μ°μ°μ μ νμ΄ λ§μ
μ½μ SQL
μ€μ λ‘ μμ© μμ€ν μ κ°λ°ν λ Java, Python λ± λ²μ© νλ‘κ·Έλλ° μΈμ΄λ‘ λ μμ© νλ‘κ·Έλ¨ μμ SQLμ΄ μ½μ λ ννλ‘ λ§μ΄ μ¬μ©λ©λλ€.
SQL λ¬Έμ μμ© νλ‘κ·Έλ¨μμλ κ·Έλλ‘ μ¬μ©ν μ μλ μ΄μ€ λͺ¨λ (dual mode) νΉμ±μ κ°μ§κ³ μκΈ° λλ¬Έμ λλ€.
EXEC SQL BEGIN DECLARE SECTION;
int sno;
char sname[10];
int sage;
char sdept[20];
EXEC SQL END DECLARE SECTION;
sno = 20181111;
EXEC SQL SELECT νλ², μ΄λ¦, νκ³Ό INTO :sno, :sname, :sdept FROM νμ WHERE νλ² = :sno;
IF(SQLSTATE = '00000')
...;
ELSE ...;
- SQL λ¬Έμ μλΆλΆμ EXEC SQLμ λΆμ¬μ€λλ€.
- νΈμ€νΈ λ³μλ BEGIN DECLARE SECTION ~ END DECLARE SECTION μμ μ μΈλμ΄μΌ ν©λλ€.
- νΈμ€νΈ λ³μλ₯Ό μ¬μ©ν λλ λ³μ μ΄λ¦ μμ μ½λ‘ (:)μ λΆμ¬μ€λλ€.
- νΈμ€νΈ λ³μμ λ°μ΄ν°λ² μ΄μ€μ attribute μ΄λ¦μ κ°μλ 무방ν©λλ€.
- νΈμ€νΈ λ³μμ μ΄μ λμνλ SQL μ΄μ λ°μ΄ν° νμ
μ μΌμΉν΄μΌ ν©λλ€.
- λ°μ΄ν° νμ μ΄ μΌμΉνμ§ μμΌλ©΄ μνΌλμ€ λΆμΌμΉ (Impedance mismatch)
- SQL λͺ λ Ήλ¬Έμ μννλ©΄ νΈμ€νΈ λ³μ SQLSTATEμ μ€ν μν μ λ³΄κ° μ μ₯λ©λλ€.
볡μ λ μ½λ κ²μ - 컀μ(cursor)
νλ‘κ·Έλλ°μμ SQL κ²°κ³Ό μ§ν© λ μ½λλ₯Ό λ°λ³΅ν΄μ μ κ·ΌνκΈ° μν΄μ 컀μ(cursor)λ₯Ό μ¬μ©ν©λλ€.
-- 컀μ μ μΈ
EXEC SQL DECLARE cur CURSOR FOR SELECT νλ², μ΄λ¦, νκ³Ό FROM νμ WHERE νκ³Ό = :sdept;
-- SELECT λ¬Έ μ€ν
EXEC SQL OPEN cur;
DO
-- λ€μ λ μ½λ μ κ·Ό
EXEC SQL FETCH cur INTO :sno, :sname, :sdept;
...
END;
-- 컀μ μ’
λ£
EXEC SQL CLOSE cur;
UPDATEν ννμ λν΄ μ»€μλ₯Ό μ μν λλ 컀μλ₯Ό μ μΈν λ FOR UPDATE μμ±λͺ μ ν¬ν¨μμΌμΌ ν©λλ€.
λμ SQL
μ λ ₯ λͺ λ Ήλ¬Έμ μν©μ λ°λΌ λ€λ₯΄κΈ° λλ¬Έμ SQL λ¬Έμ 미리 λ§λ€μ΄λλ κ²μ λΆκ°λ₯ν©λλ€.
λ°λΌμ SQL λ¬Έμ λμ μΌλ‘ μμ±νμ¬ μ²λ¦¬νκ² ν΄μ£Όλ κΈ°λ₯μ λμ SQLμ΄λΌκ³ ν©λλ€.
varchar staticSQL[256];
staticSQL = "SELECT * FROM νμ WHERE νκ³Ό = ?";
EXEC SQL PREPARE stSQL FROM :staticSQL;
dept = 'μ»΄ν¨ν°';
EXEC SQL EXECUTE stSQL USING :dept;
μμμ staticSQLμ SELECT λ¬Έμ μ μ₯νκ³ ,
PREPARE λ¬Έμ μ¬μ©ν΄ SQL λ¬Έμ μλΉ μ»΄νμΌνμ¬ λͺ©μ μ½λλ₯Ό μμ±, stSQLμ μ μ₯ν©λλ€.
κ·Έ λ€μ EXECUTE λ¬Έμ μ¬μ©ν΄ stSQLμ μ μ₯λ λͺ©μ μ½λλ₯Ό μ€νν©λλ€.
staticSQLμ μ μ₯νλ SELECT λ¬Έμμ ? λ₯Ό μ¬μ©νμ¬ λ§€κ°λ³μλ‘ μ¬μ©ν μ μμ΅λλ€.