데이터 베이스 테이블에 레코드를 삽입, 수정, 삭제, 검색 작업을 수행시키고자 할때 (CRUD) 사용하는 SQL문.
-- 해당 테이블에 레코드를 삽입할때 사용하는 SQL구문
-- INSERT INTO 테이블명(필드명1, 필드명2, ...)
-- VALUES(필드1의 데이터, 필드2의 데이터, ...);
INSERT INTO Custom(id, name) VALUES (1, 'John Doe');
-- 필수값 미입력 # 에러코드 1364
INSERT INTO Custom(id, email) VALUES(5, 'qwer@qwer'); #name이 daflult 값 가지지 않는다고 뜬다.
-- 기본키 중복 #에러코드 1062
INSERT INTO Custom(id, name, email) VALUES(1, 'Jhon Doe', 'qwer@qwer'); # 기본키의 값이 중복됐다는 오류 뜸
SELECT * FROM Custom; #검색하는 작업 모든 필드를 보겠다
에러코드 1364
에러코드 1062
-- 모든 필드에 값을 넣을때 :
-- INSERT INTO 테이블명
# 필드명을 지정하지 않았기때문에 정의(선언)해줄때 했던
# 그 순서 그대로 넣어줘야한다!
-- VALUSE(데이터1, 데이터2, ...);
INSERT INTO Custom VALUES (10, 'Michle', 'qwer@qwer.com', 33, 'This is Address', true);
-- 타입이 다른 경우의 순서바꾸고 넣었을때 #에러코드 1366
INSERT INTO Custom VALUES(11, 'jihoon', 'qwer@qsdff.com', 'Busan', 31, true);
-- 타입이 같은 경우 순서 바꾸고 넣었을때는 들어가게 된다. 값 잘 보고 입력해야한다 # 에러코드 1136
INSERT INTO Custom VALUES(11, 'qwer@qsdff.com', 'jihoon',31, 'Busan' , true);
-- 모든 값들을 집어넣지 않은 경우 오류가 뜬다. 어떤 제약조건이 걸려있든 모두 넣어줘야한다.
INSERT INTO Custom VALUES (12, 'Michle', 'qwer1@qwer.com', 33, 'This is Address');
에러코드 1366
에러코드 1136
-- 해당 테이블에서 특정 필드의 값을 수정하고자 할때
-- 사용하는 SQL문
-- UPDATE 테이블명 SET 필드명1 = 데이터1, 필드명2= 데이터2 ...
UPDATE Custom SET accept_marketing = false;
UPDATE Custom SET accept_marketing = true, age = 10;
-- WHERE 로 특정 조건만 변경시
-- UPDATE 테이블명 SET 필드명1= 데이터1 ...
-- WHERE 조건;
UPDATE Custom SET email = 'dkfjsld@dafksdl.com' # 세미콜론을 기준으로 실행된다.
WHERE id = 1; # id가 1일 경우의 값만 수정한다
-- 해당 테이블에서 레코드를 삭제할때 사용하는 SQL문
-- DELETE FROM 테이블명; # 전부 다 삭제
DELETE FROM Custom;
-- DELETE FROM 테이블명 WHERE 조건;
DELETE FROM Custom WHERE name = 'John Doe';
-- 해당 테이블에서 특정 필드를 검색하고자 할때 사용하는 SQL문
-- SELECT 필드명1, 필드명2, ... FROM 테이블명;
SELECT id,name FROM Custom;
-- SELECT * FROM 테이블명; 전체 다 가져오기
SELECT * FROM Custom;
SELECT name AS 'Full Name'
FROM Custom;
-- 테이블에 별칭 사용
SELECT C.name
FROM Custom AS C;
테이블이 여러개가 될 경우 구분을 위해서 별칭을 지어주는게 좋다.
join이나 서브쿼리등에서 중복되는 테이블명이 있을때 별칭을 사용해서 구분하게 된다
SELECT DISTINCT name FROM Custom;
갯수보다는 값에 뭐가 있는지 보고 싶을때 사용한다
레코드가 완전히 동일하게 있는지 알아보는것이다.
(입력한 필드명에 대한 모두 동일한걸 구분한다)
특정한 하나의 녀석만 구분짓고자 할때는 DISTINCT로 할 수 없다.
groupby로 하게된다??
!=, <> 왼쪽 피연산자와 오른쪽 피연산자가 같지 않으면 참을 반환함.
IS NOT 왼쪽 피연산자와 오른쪽 피연산자가 같지 않으면 참을 반환함.
(오른쪽 피연산자가 불리언 값인 TRUE, FALSE, UNKNOWN 값일 때 사용함)
IS NOT NULL, IS NULL 둘다 왼쪽 연산자에 대해서 표현
공공데이터 포탈에서 남구 인원수에 대한 데이터 가져와서 연습했다.
DDL을 제외한 연습에서는 외부데이터를 활용하는게 더 좋다.
#구분 세대수 면적 뽑기, Namgu 테이블에서 구분, 세대수, 면적 필드 검색
SELECT 구분, 세대수, 면적
FROM Namgu;
#Namgu 테이블에서 구분, 세대수, 면적 필드 중 중복을 제거하여 검색
SELECT DISTINCT 면적, 구분, 세대수
FROM Namgu;
-- Namgu 테이블에서
-- 구분이 '문현2동 '인
-- 레코드 중 전체 필드 검색
SELECT * FROM Namgu WHERE 구분 = '문현2동 ';
-- Namgu 테이블에서
-- 구성비가 3인
-- 레코드 중 전체 필드 검색
SELECT * FROM Namgu WHERE 구성비 = 3;
-- Namgu 테이블에서
-- 구분이 '문현'을 포함하는
-- 레코드 중 전체 필드 검색
# 해당 특정한 단어를 포함한 데이터를 보고싶을때 (문자열) LIKE
SELECT * FROM Namgu WHERE 구분 LIKE '문현%';
#문현으로 시작하는 단어 포함시 가져오기
SELECT * FROM Namgu WHERE 구분 LIKE '%문현%';
#문현이라는 단어를 포함하면 가져오기
해당 특정한 단어를 포함한 데이터를 보고싶을때(문자열) LIKE
SELECT * FROM Reservation
WHERE Name LIKE '장%'; : 장으로 시작하고, 장을 포함하는 모든 단어
WHERE Name LIKE '%장'; : 장을 포함하고, 장으로 끝나는 모든 단어
WHERE Name LIKE '%장%'; : 장을 포함하는 모든 단어
'%'는 0개 이상의 문자라는 의미의 와일드카드(wildcard) 문자
'' 1개의 문자를 대체한다.
WHERE Name LIKE '장'; : 장으로 시작하고, 장을 포함하는 2단어.
-- Namgu 테이블에서
-- 세대수가 10000이상인
-- 레코드 중 전체 필드 검색
SELECT * FROM Namgu WHERE 세대수 >= 10000;
-- Namgu 테이블에서
-- 세대수가 5000이하
-- 레코드 중 전체 필드 검색
SELECT * FROM Namgu WHERE 세대수 <= 5000;
-- Namgu 테이블에서
-- 세대수가 5000이상 10000이하인
-- 레코드 중 전체 필드 검색
SELECT * FROM Namgu WHERE 세대수 <= 10000 AND 세대수 >=5000;
SELECT * FROM Namgu WHERE 세대수 BETWEEN 5000 AND 10000;
-- Namgu 테이블에서
-- 통이 21 22 23 중 하나라도 해당하는
-- 레코드 중 전체 필드 검색
SELECT * FROM Namgu WHERE 통 IN(21, 22, 23); #해당 인수만 뽑아내기
-- Namgu 테이블에서
-- 통이 21 22 23를 제외한
-- 레코드 중 전체 필드 검색
SELECT * FROM Namgu WHERE 통 NOT IN(21, 22, 23);
-- Namgu 테이블에서
-- 인구수가 10000명 이상이면서, 18세 이상 인구수가 12000명 이하인
-- 레코드 중 전체 필드 검색 # 분명하게 검색조건 적어주는게 좋다
SELECT * FROM Namgu WHERE 인구수 >= 10000 AND 18세이상인구수 <=12000;
-- Namgu 테이블에서
-- 통이 20이상 이거나 반이 100이하인
-- 레코드 중 구분, 세대수, 인구수, 통, 반 필드를 검색
SELECT 구분, 세대수, 인구수, 통, 반
FROM Namgu WHERE 통 >=20 OR 반 <= 100;
-- Namgu 테이블에서
-- 인구수가 10000명 이상인 레코드 중,
-- 18세 이상 인구수가 12000명 이하이거나 반이 100이상인
-- 레코드의 전체 필드 검색 #조건의 구분을 잘해줘야한다.
-- 이것에따라 결과가 다르게 나타난다. 명확하게 필요
SELECT * FROM Namgu WHERE 인구수 >= 10000
AND (18세이상인구수 <= 12000 OR 반 >= 100);
SELECT * FROM Namgu
WHERE 인구수 >= 10000
AND 18세이상인구수 <= 12000
OR 반 >= 100;