SQL 기초

2025. 5. 14. 09:53·Backend/DB
728x90

SQL 기초 정리


1. SELECT로 데이터 조회

SELECT 열 FROM 테이블;
SELECT first_name AS 이름 FROM employees;

2. WHERE 절

WHERE절은 조회하는 결과에 특정한 조건을 주어 원하는 데이터만 보고 싶을 때 사용

형식: `SELECT 필드이름 FROM 테이블 이름 WHERE 조건식;`

1) BETWEEN ... AND

-- 관계 연산자 & 조건 연산자
SELECT userid, name FROM usertbl
WHERE birthyear >= 1970 AND height >= 182;

-- BETWEEN ... AND 사용
SELECT name FROM usertbl WHERE height BETWEEN 180 AND 183;

2) IN

연속적인 값이 아닌, 이산적인 값인 `경남`, `전남`의 경우는 BETWEEN ... AND 구문을 사용할 수 없음

하지만, `IN()` 구문을 사용하여 동일한 결괏값을 도출할 수 있다.

SELECT name FROM usertbl WHERE addr IN ('경남', '전남');

3) LIKE

문자열의 내용을 검색하기 위해 사용

SELECT name FROM usertbl WHERE name LIKE '김%';

위 조건은 성이 '김'씨이고, 그 뒤는 무엇이든(%) 허용한다는 의미

한 글자와 매치하기 위해서는 `_` 사용

SELECT name FROM usertbl WHERE name LIKE '_김%';

맨 앞 글자가 한 글자이고, 두 번째 글자는 '김' 그리고 세 번째 이후는 아무거나 오는 값 추출

📌 `%` 나 `_` 가 검색할 문자열의 제일 앞에 들어가는 것은 MySQL 성능에 악영향을 끼칠 수 있음
예로 '%김' 이나 '_김' 등으로 검색 시 name 열에 인덱스가 있더라도 전체 데이터 검색
= 대용량 데이터를 사용할 경우 비효율적인 결과 도출

3. 서브쿼리 / ANY / ALL

SELECT name FROM usertbl
WHERE height > (SELECT height FROM usertbl WHERE name = '김경호');

SELECT name FROM usertbl
WHERE height >= ANY (SELECT height FROM usertbl WHERE addr = '경남');

SELECT name FROM usertbl
WHERE height > ALL (SELECT height FROM usertbl WHERE addr = '경남');

 

4. ORDER BY 정렬 / DISTINCT 중복 제거

SELECT name, mDate FROM usertbl ORDER BY mDate DESC;
SELECT DISTINCT addr FROM usertbl;

5. LIMIT로 출력 수 제한

SELECT * FROM employees ORDER BY hire_date ASC LIMIT 5;

6. CREATE TABLE … SELECT

CREATE TABLE buytbl2 AS SELECT * FROM buytbl;
CREATE TABLE buytbl3 AS SELECT userID, prodName FROM buytbl;

※ 제약조건(PK, FK)은 복사 안 됨

7. GROUP BY + HAVING + 집계 함수

SELECT userID, SUM(amount) FROM buytbl GROUP BY userID;

SELECT userID, SUM(price*amount) AS 총구매액
FROM buytbl
GROUP BY userID
HAVING SUM(price * amount) > 1000;

SELECT groupName, SUM(price * amount) AS 비용
FROM buytbl
GROUP BY groupName
WITH ROLLUP;

8. INSERT / UPDATE / DELETE

INSERT INTO testTbl1 VALUES(1, '홍길동', 25);

UPDATE testTbl4 SET Lname = '없음' WHERE Fname = 'Kyoichi';

DELETE FROM testTbl4 WHERE Fname = 'Aamer' LIMIT 5;

9. INSERT 예외 처리

INSERT IGNORE INTO 테이블 VALUES (...);

INSERT INTO 테이블 (...) VALUES (...)
ON DUPLICATE KEY UPDATE 컬럼 = 값;

10. WITH절 (CTE)

WITH regional_sales AS (
  SELECT region, SUM(amount) AS total_sales
  FROM orders
  GROUP BY region
)
SELECT * FROM regional_sales WHERE total_sales > 100000;

뷰와 비슷하지만 쿼리 끝나면 사라짐. 재귀 CTE는 나중에 따로 다룸


728x90
'Backend/DB' 카테고리의 다른 글
  • DB 정규화, 역정규화, 이상현상
  • 스키마 3계층
  • RDB와 NoSQL 비교
  • 키 (Key), 인덱스 (Index)
0woy
0woy
Algorithm, CS, Web 등 배운 내용을 기록합니다.
  • 0woy
    0woy dev
    0woy
  • 전체
    오늘
    어제
  • 🌐 LANGUAGE
    • 분류 전체보기 (80)
      • Backend (21)
        • JAVA (7)
        • DB (11)
        • Spring (1)
        • Spring Security (2)
      • Computer Science (22)
        • 네트워크 (9)
        • 운영체제 (5)
        • 보안 (7)
      • Frontend (15)
        • HTML5 (1)
        • CSS (1)
        • JS (4)
        • Vue 3 (9)
      • PS (16)
        • LeetCode (2)
        • Baekjoon (1)
        • Programmers (1)
        • 알고리즘 (12)
      • Dev Trivia (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CA
    트리
    tcp
    DP
    JS
    Props
    속성
    공개키
    그래프
    가용성
    Spring
    Filter
    function
    https
    dfs
    Vue3
    RDB
    leetcode
    Graph
    select
    shortestpath
    java
    security
    PreparedStatement
    javascript
    비밀키
    JDBC
    set
    BFS
    대칭키
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
0woy
SQL 기초
상단으로

티스토리툴바