SQL 기본 문법

yunssup·2025년 2월 25일

📖SQL

목록 보기
3/8
post-thumbnail

📁 SELECT문

기능 : 구축이 완료된 테이블에서 데이터 추출능 : 구축이 완료된 테이블에서 데이터 추출
기본 형식 : SELECT(+열 이름)~FROM(+테이블 이름)~WHERE(+조건식)

SELECT문 실행하기 위해서는 사용할 데이터베이스 지정해야함.

USE 데이터베이스_이름;

📁 SELECT문 기본 형식

SELECT 열 이름
   FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름 (결과 정렬)
    LIMIT 숫자 (결과 개수 제한)
📖 SELECT * FROM MEMBER
MEMBER 테이블에서 모든 열의 내용을 가져오기
  • 테이블에서 데이터를 사용할 때 사용하는 예약어
  • 일반적으로는 '모든 것', *가 사용된 위치가 열 이름이 나올 곳이므로 모든 열을 의미함. 즉 MEMBER 테이블의 8개 열 모두 의미
  • FROM 다음에 테이블 이름.

📁 특정 조건만 조회하기 : SELECT~FROM~WHERE

SELECT~FROM은 대부분 WHERE과 함께 사용함.

SELECT(+열 이름)~FROM(+테이블 이름)~WHERE(+조건식)

관계 연산자, 논리 연산자 사용 가능

  • AND는 두 조건 모두 만족
  • OR은 둘 중 한 조건만 만족하면 성립

범위 값의 경우 BETWEEN ~ AND 사용
문자 데이터의 경우 IN() 사용

SELECT MEM_MEMBER,ADDR
   FROM MEMBER
    WHERE ADDR IN('경기','전남','경남');

문자열 일부 글자 검색 시 LIKE 사용
예시) MEM_NAME의 첫 글자가 '우'로 시작하는 회원 검색하기

SELECT *
   FROM MEMBER
    WHERE MEM_NAME LIKE '우%';

한 글자 매치하기 위해서 언더바 (_) 사용
예시) MEM_NAME의 앞 두 글자는 상관없고 뒤는 '핑크'인 회원 검색하기

SELECT *
   FROM MEMBER
    WHERE MEM_NAME LIKE '__핑크';

📁 서브 쿼리

SELECT 문 안에 SELECT문

예시) MEM_NAME이 '에이핑크'인 회원의 평균 키보다 큰 회원 검색하기

select HEIGHT FROM MEMBER WHERE MEM_NAME = '에이핑크';
SELECT MEM_NAME, height FROM MEMBER WHERE height>164;

에이핑크 평균 키 구한 뒤, 평균 키인 164보다 큰 회원 조회
두 SQL을 하나의 SQL문으로 만들면

SELECT MEM_NAME, height FROM MEMBER 
   WHERE height>(select HEIGHT FROM MEMBER WHERE MEM_NAME = '에이핑크');

📁 ORDER BY 절

결과의 값이나 개수에 영향을 미치지 않지만 결과가 출력되는 순서를 조절

SELECT MEM_ID, MEM_NAME, debut_date FROM MEMBER ORDER BY debut_date;
-- 데뷔 날짜가 빠른 순서대로 출력

ASC는 오름차순 / DESC는 내림차순
기본적으로 ORDER BY는 오름차순으로 설정되어있음

ORDER BY는 WHERE 절과 함께 사용 가능. 하지만 WHERE이 먼저 나와야 함 !!
ORDER BY가 선행될 경우, 오류 발생

SELECT MEM_ID, MEM_NAME, debut_date, HEIGHT 
   FROM MEMBER 
    WHERE HEIGHT >= 164
    ORDER BY HEIGHT DESC;

정렬 기준은 여러 개의 열로 지정 가능 ! (,) 사용하기 !!

📁 출력 개수 제한 : LIMIT

전체 중 N건만 조회하기

SELECT *
 FROM MEMBER
  LIMIT 3;

대부분, 먼저 정렬한 뒤 추출함. ORDER BY와 함께 사용!

SELECT *
  FROM MEMBER
   ORDER BY debut_date
   LIMIT 3;

시작 개수 지정 가능

SELECT *
 FROM MEMBER
  ORDER BY debut_date
  LIMIT 3,2;

📁 중복 결과 제거 : DISTINCT

SELECT distinct ADDR FROM MEMBER;

중복된 데이터를 1개만 남기고 모두 삭제

📁 GROUP BY 절

그룹으로 묶어주는 역할을 함.
❗ 함께 사용하는 집계 함수

  • SUM() : 합계
  • AVG() : 평균
  • MIN() : 최소
  • MAX() : 최대
  • COUNT() : 행의 개수
  • COUNT(DISTINCT) : 행의 개수 (중복은 1개만 인정)
SELECT MEM_ID, SUM(AMOUNT) FROM BUY group by MEM_ID;
SELECT MEM_ID, SUM(PRICE*AMOUNT) FROM BUY group by MEM_ID;
--SUM()을 통해 계산도 가능함

📁 HAVING 절

집계 함수에서는 WHERE을 사용할 수 없음! 따라서 WHERE 대신 HANING절을 사용함!
꼭 GROUP BY절 뒤에 나와야 함

SELECT MEM_ID"회원 아이디", SUM(PRICE*AMOUNT)"총 구매 개수" 
   FROM BUY 
   group by MEM_ID
    having SUM(PRICE*AMOUNT) > 1000
    order by SUM(PRICE*AMOUNT) DESC;

📁 데이터 입력 : INSERT

INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...)
  • 테이블 이름 다음에 나오는 열은 생략 가능. 생략 시, VALUES 당므에 나오는 값들의 순서 및 개수는 테이블을 정의할 때의 열 순서 및 개수와 동일

📁 자동 증가 - AUTO_INCREMENT

열을 정의할 때 1부터 증가하는 값을 입력. INSERT에서는 해당 열이 없다고 생각하고 입력

❗주의 사항 : AUTO_INCREMENT로 지정하는 열은 꼭 PRIMARY KEY로 지정해야 함. 자동 증가하는 값은 NULL 값으로 채워 넣기

CREATE TABLE HH2(
	TOY_ID INT AUTO_INCREMENT PRIMARY KEY,
    TOY_NAME CHAR(4),
    AGE INT);
INSERT INTO HH2 VALUES(NULL, 'HHDD', 25);
INSERT INTO HH2 VALUES(NULL, 'HHDDDD', 23335);
INSERT INTO HH2 VALUES(NULL, 'HHDDDDDDD', 222225);

실행해보면 ID 값은 자동으로 1부터 채워짐을 확인할 수 있음!

만일, ID의 시작 번호와 증가 값을 변경하고 싶다면!!!???

CREATE TABLE HH2(
	TOY_ID INT AUTO_INCREMENT PRIMARY KEY,
    TOY_NAME CHAR(4),
    AGE INT);
ALTER TABLE HH2 AUTO_INCREMENT=1000; -- 시작 값을 1000으로 설정
SET @@AUTO_INCREMENT_INCREMENT-3; -- 증가 값은 3으로 지정
INSERT INTO HH2 VALUES(NULL, 'HHDD', 25),(NULL, 'HHDDDD', 23335),(NULL, 'HHDDDDDDD', 222225);

❗ALTER TABLE은 테이블을 변경하라는 의미! 테이블의 열 이름, 변경, 새로운 열 정의, 열 삭제 등의 작업 진행
이렇게 코드를 작성하고 실행해보면 ID 값이 1000으로 시작하며 1003->1006으로 증가함을 확인할 수 있음 @~@

📁 다른 테이블 데이터 한번에 입력 - INSERT INTO ~ SELECT

INSERT INTO 테이블_이름 (열1, 열2, ...)
	SELECT 문;

❗주의 사항 : SELECT문의 열 개수는 INSERT할 테이블의 열 개수와 동일해야 함.

📁 데이터 수정 - UPDATE

기존에 입력되어 있는 값을 수정하는 명령

UPDATE 테이블_이름
	SET 열1=값1, 열2=값2, ...
    WHERE 조건;

예시)

UPDATE CITY_POPUL
	SET CITY_NAME = '서울', POPULATION=
    WHERE CITY_NAME='SEOUL';
SELECT * FROM CITY_POPUL WHERE CITY_NAME ='서울';

❗주의 사항 : WHERE절을 생략하면 테이블의 모든 행의 값이 변경됨! 즉, 전체 행의 값이 변경됨으로 주의

📁 데이터 삭제 - DELETE

DELETE FROM 테이블이름 WHERE 조건;

만일 대용량의 데이터를 삭제하고 싶다면!?

DELETE문은 삭제가 오래 걸림! 따라서 다른 방법을 이용해야 함!

  • DROP : 테이블 자체를 삭제
  • TRUNCATE : DELETE와 동일한 효과를 내지만 속도가 매우 빠름

정리하자면 DROP은 테이블 자체를 삭제하고 DELETE와 TRUNCATE은 빈 테이블을 남긴다.

그렇다면 TRUNCATE만 쓰면 되는거 아닌교!? DELETE는 의미없는거 아님? 이라고 방금 내가 생각함 ㅎㅎ
이 둘의 차이가 존재하는데

  • TRUNCATE는 WHERE문을 사용할 수 없어 조건 없이 전체 행을 삭제하고
  • DELETE는 조건문인 WHERE문과 함께 사용할 수 있다.

조건 없이 테이블 구조만 남기고 싶다면 TRUNCATE를 쓰시오 ~@~@

0개의 댓글