국비학원 23일차 : SQL_2

Digeut·2023년 3월 27일
0

국비학원

목록 보기
17/44

My SQL 주요구문

2. DML

데이터 베이스 테이블에 레코드를 삽입, 수정, 삭제, 검색 작업을 수행시키고자 할때 (CRUD) 사용하는 SQL문.

INSERT 문

-- 해당 테이블에 레코드를 삽입할때 사용하는 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

UPDATE문

-- 해당 테이블에서 특정 필드의 값을 수정하고자 할때
-- 사용하는 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일 경우의 값만 수정한다

DELETE문

-- 해당 테이블에서 레코드를 삭제할때 사용하는 SQL문
-- DELETE FROM 테이블명; # 전부 다 삭제
 DELETE FROM Custom;
 
 -- DELETE FROM 테이블명 WHERE 조건;
DELETE FROM Custom WHERE name = 'John Doe';

SELECT문

-- 해당 테이블에서 특정 필드를 검색하고자 할때 사용하는 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;
profile
개발자가 될 거야!

0개의 댓글