728x90
반응형
SELECT문
<SELECT... FROM>
- 원하는 데이터를 가져와 주는 기본적인 구문
- 가장 많이 사용되는 구문
- 데이터베이스 내 테이블에서 원하는 정보 추출하는 명령
USE 구문
- SELECT문 학습 위해 사용할 데이터베이스 지정
- 지정해 놓은 후 특별히 다시 USE문 사용하거나 다른 DB를 사용하겠다고 명시하지 않는 이상 모든 SQL문은 지정 DB에서 수행

- employees를 사용하기 위해서는 쿼리 창에 다음과 같이 입력한다.
- Workbench 에서 직접 선택해서 사용도 가능
- [Navigator]의 [Schemas] 탭, employees 데이터베이스를 더블 클릭하거나 마우스 오른쪽 버튼을 클릭한 후 [Set as Default Schema]를 선택
- 진한 글자로 전환, 왼쪽 아래‘Active schema changed to employees’ 메시지 나옴
- [Navigator]의 [Schemas] 탭, employees 데이터베이스를 더블 클릭하거나 마우스 오른쪽 버튼을 클릭한 후 [Set as Default Schema]를 선택
SELECT와 FROM
SELECT *
- 선택된 DB가 employees 라면 다음 두 쿼리는 동일
SELECT 열 이름
- 테이블에서 필요로 하는 열만 가져오기 가능

- 여러 개의 열을 가져오고 싶을 때는 콤마로 구분

- 열 이름의 순서는 출력하고 싶은 순서대로 배열 가능
주석(Remark)
DB, TABLE, 열의 이름이 확실하지 않을 때 조회하는 방법
- 현재 서버에 어떤 DB가 있는지 보기
- SHOW DATABASES;
- 현재 서버에 어떤 TABLE이 있는지 보기
- 데이터베이스에 있는 테이블 정보 조회
- SHOW TABLE STATUS;
- 테이블 이름만 간단히 보기
- SHOW TABLES;
- 데이터베이스에 있는 테이블 정보 조회
- employees 테이블의 열이 무엇이 있는지 확인
- DESCRIBE employees; 또는 DESC employees;
- Workbench의 [Navigator]로 확인 가능 하나 명령어를 알아두면 Linux 명령어 모드에서 사용 가능
특정 조건의 데이터만 조회 - <SELECT … FROM … WHERE>
- 기본적인 WHERE절
- 조회하는 결과에 특정한 조건을 줘서 원하는 데이터만 보고 싶을 때 사용
- SELECT 필드이름 FROM 테이블이름 WHERE 조건식;
ex)

관계 연산자의 사용
- OR 연산자 : ‘…했거나’, ‘… 또는’
- AND 연산자 : ‘...하고’, ‘…면서’, ‘… 그리고’
- 조건 연산자(=, <, >, <=, >=, < >, != 등)와 관계 연산자(NOT, AND, OR 등)를 조합하여 데이터를 효율적으로 추출 가능
ex)
BETWEEN… AND와 IN( ) 그리고 LIKE
- 데이터가 숫자로 구성되어 있으며 연속적인 값 : BETWEEN … AND 사용
ex)

- 이산적인(Discrete) 값의 조건 : IN() 사용
ex)

- 문자열의 내용 검색 : LIKE 사용(문자뒤에 % - 무엇이든 허용, 한 글자와 매치 ‘_’ 사용)
ex)

ANY/ALL/SOME ,서브쿼리(SubQuery, 하위쿼리)
서브쿼리
- 쿼리문 안에 또 쿼리문이 들어 있는 것
- 서브쿼리 사용하는 쿼리로 변환 예제
- ex) 김경호보다 키가 크거나 같은 사람의 이름과 키 출력
- WHERE 조건에 김경호의 키를 직접 써주는 것을 쿼리로 해결
- ex) 김경호보다 키가 크거나 같은 사람의 이름과 키 출력

- 서브쿼리의 결과가 둘 이상이 되면 에러 발생
ANY/ALL/SOME ,서브쿼리(SubQuery, 하위쿼리)
ANY
- 서브쿼리의 여러 개의 결과 중 한 가지만 만족해도 가능
- SOME은 ANY와 동일한 의미로 사용
- ‘= ANY(서브쿼리)’는 ‘IN(서브쿼리)’와 동일한 의미
ALL
- 서브쿼리의 결과 중 여러 개의 결과를 모두 만족해야 함
원하는 순서대로 정렬하여 출력 : ORDER BY
ORDER BY절
- 결과물에 대해 영향을 미치지는 않고 출력되는 순서를 조절하는 구문
- 기본적으로 오름차순 (ASCENDING) 정렬
- 내림차순(DESCENDING)으로 정렬하려면 열 이름 뒤에 DESC
- ORDER BY 구문을 혼합해 사용하는 구문도 가능
- 키가 큰 순서로 정렬하되 만약 키가 같을 경우 이름 순으로 정렬

- ASC(오름차순)는 디폴트 값이므로 생략 가능
중복된 것은 하나만 남기는 DISTINCT
- 중복된 것을 골라서 세기 어려울 때 사용하는 구문
- 테이블의 크기가 클수록 효율적
- 중복된 것은 1개씩만 보여주면서 출력
출력하는 개수를 제한하는 LIMIT
- 일부를 보기 위해 여러 건의 데이터를 출력하는 부담 줄임
- 상위의 N개만 출력하는 ‘LIMIT N’ 구문 사용
- 개수의 문제보다는 MySQL의 부담을 많이 줄여주는 방법
테이블을 복사하는 CREATE TABLE … SELECT
- 테이블을 복사해서 사용할 경우 주로 사용
- CREATE TABLE 새로운 테이블 (SELECT 복사할 열 FROM 기존테이블)
- 지정한 일부 열만 복사하는 것도 가능
- PK나 FK 같은 제약 조건은 복사되지 않음
GROUP BY 및 HAVING 그리고 집계 함수
GROUP BY절
- 그룹으로 묶어주는 역할
- 집계 함수(Aggregate Function)와 함께 사용
- 효율적인 데이터 그룹화 (Grouping)
- ex) 각 사용자 별로 구매한 개수를 합쳐 출력

- 읽기 좋게 하기 위해 별칭(Alias) AS 사용

GROUP BY와 함께 자주 사용되는 집계 함수

ex) 전체 구매자가 구매한 물품의 개수 평균
Having절
- WHERE와 비슷한 개념으로 조건 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것
- HAVING절은 꼭 GROUP BY절 다음에 나와야 함(순서 바뀌면 안됨)
ROLLUP
- 총합 또는 중간 합계가 필요할 경우 사용
- GROUP BY절과 함께 WITH ROLLUP문 사용
ex) 분류(groupName) 별로 합계 및 그 총합 구하기
SQL의 분류
DML (Data Manipulation Language, 데이터 조작 언어)
- 데이터를 조작(선택, 삽입, 수정, 삭제)하는 데 사용되는 언어
- DML 구문이 사용되는 대상은 테이블의 행
- DML 사용하기 위해서는 테이블이 정의되어 있어야 함
- SQL문 중 SELECT, INSERT, UPDATE, DELETE가 이 구문에 해당
- 트랜잭션(Transaction)이 발생하는 SQL도 DML에 속함
- 테이블의 데이터를 변경(입력/수정/삭제)할 때 실제 테이블에 완전히 적용하지 않고, 임시로 적용시키는 것
- 취소 가능
DDL (Data Definition Language, 데이터 정의 언어)
- 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 개체를 생성/삭제/변경하는 역할
- CREATE, DROP, ALTER 자주 사용
- DDL은 트랜잭션 발생시키지 않음
- 되돌림(ROLLBACK)이나 완전적용(COMMIT) 사용 불가
- 실행 즉시 MySQL에 적용
DCL (Data Control Language, 데이터 제어 언어)
- 사용자에게 어떤 권한을 부여하거나 빼앗을 때 주로 사용하는 구문
- GRANT/REVOKE/DENY 구문
데이터의 변경을 위한 SQL문
데이터의 삽입 : INSERT
INSERT문의 기본

- 테이블 이름 다음에 나오는 열 생략 가능
- 생략할 경우에 VALUES 다음에 나오는 값들의 순서 및 개수가 테이블이 정의된 열 순서 및 개수와 동일해야 함
자동으로 증가하는 AUTO_INCREMENT
- INSERT에서는 해당 열이 없다고 생각하고 입력
- INSERT문에서 NULL 값 지정하면 자동으로 값 입력
- 1부터 증가하는 값 자동 입력
- 적용할 열이 PRIMARY KEY 또는 UNIQUE일 때만 사용가능
- 데이터 형은 숫자 형식만 사용 가능
대량의 샘플 데이터 생성
- INSERT INTO … SELECT 구문 사용

- 다른 테이블의 데이터를 가져와 대량으로 입력하는 효과
- SELECT문의 열의 개수 = INSERT 할 테이블의 열의 개수
- 테이블 정의 까지 생략 하려면 CREATE TABLE … SELECT 구문을 사용
데이터의 수정 : UPDATE
- 기존에 입력되어 있는 값 변경하는 구문

- WHERE절 생략 가능하나 WHERE절 생략하면 테이블의 전체 행의 내용 변경됨
- 실무에서 실수가 종종 일어남, 주의 필요
- 원상태로 복구하기 복잡하며, 다시 되돌릴 수 없는 경우도 있음
데이터의 삭제 : DELETE FROM
- 행 단위로 데이터 삭제하는 구문

- WHERE절 생략되면 전체 데이터를 삭제함
- 테이블을 삭제하는 경우의 속도 비교
- DML문인 DELETE는 트랜잭션 로그 기록 작업 때문에 삭제 느림
- DDL문인 DROP과 TRUNCATE문은 트랜잭션 없어 빠름
- 테이블 자체가 필요 없을 경우에는 DROP 으로 삭제
- 테이블의 구조는 남겨놓고 싶다면 TRUNCATE로 삭제하는 것이 효율적
조건부 데이터 입력, 변경
기본 키가 중복된 데이터를 입력한 경우
- 오류로 입력 불가
대용량 데이터 처리의 경우 에러 발생하지 않은 구문 실행
- INSERT IGNORE문
- 에러 발생해도 다음 구문으로 넘어가게 처리
- 에러 메시지 보면 적용되지 않은 구문이 어느 것인지 구분 가능
- ON DUPLICATE KEY UPDATE 구문
- 기본 키가 중복되면 데이터를 수정되도록 하는 구문도 활용 가능
WITH절과 CTE
WITH절과 CTE 개요
- WITH절은 CTE(Common Table Expression)를 표현하기 위한 구문
- MySQL 8.0 이후부터 사용 가능하게 됨
- CTE는 기존의 뷰, 파생 테이블, 임시 테이블 등을 대신할 수 있으며 간결한 식으로 보여짐
- CTE는 ANSI-SQL99 표준(기존 SQL은 ANSI-SQL92 기준)
- CTE는 비재귀적 CTE와 재귀적 CTE가 있지만 주로 사용되는 것은 비재귀적 CTE
비재귀적 CTE
단순한 형태, 복잡한 쿼리문장을 단순화하는데 적합

- CTE는 뷰와 용도가 비슷하지만 개선된 점이 많음
- 뷰는 계속 존재해서 다른 구문에서도 사용 가능하지만, CTE와 파생 테이블은 구문이 끝나면 소멸됨
- 중복 CTE 허용됨
728x90
반응형
'DB > MySQL' 카테고리의 다른 글
이것이MySQL이다 - 02) SQL 고급 (0) | 2023.02.07 |
---|---|
이것이MySQL이다 - 01) SQL 고급 (0) | 2023.02.06 |
이것이MySQL이다 - 02) MySQL 유틸리티 사용법 (0) | 2023.02.02 |
이것이MySQL이다 - 01) MySQL 유틸리티 사용법 (0) | 2023.02.02 |
이것이MySQL이다 - 데이터베이스 모델링 (0) | 2023.02.02 |