SQL ๊ธฐ์ดˆ (SQLite)

Part 2-2. ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค(FastCampus)์˜ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ์˜ฌ์ธ์› ํŒจํ‚ค์ง€ Online์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

3. SQLite Studio

SQLite Studio ๋‹ค์šด๋กœ๋“œ
๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ

  • editor ์—ฌ๋Š” ๋ฒ•: Tools > Open SQL Editor (or Alt + E)
  • SQLite๊ณผ MySQL์„ ํฌํ•จํ•œ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๋“ค๊ณผ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ด ์‚ฌ์†Œํ•˜๊ฒŒ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

SQL ๊ธฐ๋ณธ ๋ฌธ๋ฒ• (1) SELECT

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT * FROM Salaries LIMIT 10;
SELECT * FROM Salaries ORDER BY salary DESC LIMIT 10;

SELECT * 
FROM Salaries 
WHERE yearID = '2010'
AND lgID = 'AL'
ORDER BY salary DESC LIMIT 20;

--SUM, AVG
SELECT SUM(salary)
FROM Salaries
WHERE playerID = 'rodrial01';

--Concat, Count, Group By
SELECT nameFirst || ' ' || nameLast AS name FROM People Limit 10;
SELECT nameFirst || ' ' || nameLast AS name FROM People Where playerID = 'rodrial01';
SELECT COUNT(DISTINCT(nameFirst || ' ' || nameLast)) FROM People;
SELECT nameFirst || ' ' || nameLast AS name, COUNT(*) FROM People GROUP BY name HAVING COUNT(*) > 1;

SELECT
    teamID,
    SUM(Salary) as total_salary
FROM Salaries
GROUP BY teamID
ORDER BY total_salary DESC;

SQL ๊ธฐ๋ณธ ๋ฌธ๋ฒ• (2) JOIN

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
--Join
SELECT
    t2.nameFirst ||' '||t2.nameLast AS name,
    t1.salary
FROM
    Salaries t1
JOIN
    People t2 ON t2.playerID = t1.playerID
ORDER BY salary DESC
LIMIT 20;

--Quiz. Top paid player for each team in 2010
SELECT
    t1.teamID,
    t2.nameFirst||' '||t2.nameLast AS name,
    t1.salary --using MAX(salary) instead of ORDER BY would be more efficient
FROM
    Salaries t1
JOIN
    People t2 ON t2.playerID = t1.playerID
WHERE
    t1.yearID = '2010'
GROUP BY
    teamID
ORDER BY
    salary DESC;
    
-- Left Join, Right Join
SELECT t1.playerID, COUNT(*)
FROM People t1
LEFT JOIN AllstarFull t2 ON t2.playerID = t1.playerID
GROUP BY 1
ORDER BY COUNT(*) DESC
LIMIT 20;

SQL ๊ธฐ๋ณธ (3) ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค ๋ฐ ํ‚ค ๊ฐ’๋“ค, ํ…Œ์ด๋ธ” ์ƒ์„ฑ

Primary Key: ๋น ๋ฅธ ์ฒ˜๋ฆฌ, ์ค‘๋ณต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ์„ค์ •ํ•˜๊ธฐ๋„ ํ•จ!
Foreign Key: ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ์˜จ ์นผ๋Ÿผ ์ฒ˜๋ฆฌ
Unique: ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE mytable (id INT, name VARCHAR(255), debut DATE);
CREATE TABLE mytable2 (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(255), debut DATE);
INSERT INTO mytable2 (name, debut) VALUES ('jiwoo', ' 2000-09-01');
SELECT * FROM mytable2;

--INSERT
INSERT INTO mytable2 (name, debut) VALUES ('jiwoo', '2000-09-05');
SELECT * FROM mytable2;

--Update 
UPDATE mytable2
SET debut = '2010-09-01'
WHERE id = 1;

--Replace
REPLACE INTO mytable2 (id, name, debut) VALUES (5, 'jiwoo2', '2015-09-01');
-- Update๋Š” ๊ธฐ์กด์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด ์•„๋ฌด๋Ÿฐ ํ–‰๋™๋„ ํ•˜์ง€ ์•Š์ง€๋งŒ, Replace๋Š” ๊ธฐ์กด์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฐ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.
 
--Insert Or Ignore
INSERT OR IGNORE INTO mytable2 (id, name, debut) VALUES (1, 'jiwoo3', '2010-09-11');
--์ด๋ฏธ id๊ฐ€ 1์ธ ํ–‰์ด ์žˆ์„ ๊ฒฝ์šฐ, ๊ทธ๋ƒฅ insert into๋งŒ ํ•˜๋ฉด 'unique constraint failed'๊ฐ€ ๋œจ์ง€๋งŒ or ignore์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๊ดœ์ฐฎ๋‹ค.

-- Delete, ALter, Drop
-- ์•„์ฃผ์•„์ฃผ ์‹ ์ค‘ํ•˜๊ฒŒ ์จ์•ผํ•˜๋Š” ์ปค๋งจ๋“œ๋“ค์ด๋‹ค!
SELECT * FROM mytable2;
Delete FROM mytable2 WHERE id=1;

ALTER TABLE mytalbe2 RENAME TO players;
ALTER TABLE players ADD COLUMN DOB date;
SELECT * FROM players;

DROP TABLE mytable;

SQL ๊ธฐ๋ณธ (4) Functions

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
-- Functions(1) ๊ธฐ๋ณธ์ฒ˜๋ฆฌ ๋ฐ ์—ฐ์‚ฐ
SELECT * FROM players;
SELECT SUBSTR(name, 1, 3) FROM players;
SELECT UPPER(name) FROM players;
SELECT AVG(LENGTH(name)) FROM players; --MAX, AVG, COUNT, SUM

-- Functions(2) ๋‚ ์งœ๋ฐ์ดํ„ฐ, Case When
SELECT CURRENT_TIMESTAMP; --UTC๊ธฐ์ค€
SELECT DATE('NOW');
SELECT DATETIME(CURRENT_TIMESTAMP, '+1 DAY');

SELECT
    id,
    name,
    CASE WHEN
        name = 'jiwoo' THEN 'OK'
    WHEN name = 'jiwoo2' THEN 'OK2'
    ELSE 'No OK'
    END AS ok_name, --CASE WHEN๋ถ€ํ„ฐ ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ variable ํ•˜๋‚˜!
    debut
FROM players;