SQL
Structured Query Language · 구조화 질의 언어
은 의 구조를 정의하고 자료를 조회·변경하며 접근을 제어하는 언어이다. SELECT 문은 원하는 결과의 조건을 표현하고 실제 접근 경로는 DBMS의 계획과 실행 단계에서 선택된다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- WHERE··집계로 필요한 행과 열의 관계를 표현한다.
- INSERT·UPDATE·DELETE로 저장 자료를 변경한다.
- 제약·객체·권한 등의 데이터베이스 구조와 접근 정책을 정의한다.
02어떤 순서로 동작하나
- 문장과 값 전달
클라이언트가 구조와 매개변수 값을 드라이버 규약에 맞게 보낸다.
- 구문·이름 검사
DBMS가 문법과 대상 객체·자료형·권한을 해석한다.
- 실행 계획 선택
옵티마이저가 필터··집계 등 연산의 물리적 실행 방법을 선택한다.
- 자료 처리와 결과
실행기가 계획을 수행해 결과 행이나 변경 수를 반환한다. 명시하지 않은 정렬이나 올바르지 않은 을 DB가 의도대로 추측하지 않는다.
03먼저 알아둘 용어와 구성요소
- WHERE는 조건에 맞는 행을 선택하고 SELECT 목록은 결과의 열이나 표현식을 정한다.
- 은 지정한 관계 조건으로 두 입력의 행을 결합한다.
- 는 같은 그룹 값을 묶고 SUM·COUNT 등은 그룹별 결과를 계산한다.
- 를 지정하지 않은 결과의 행 순서는 일반적으로 보장하지 않는다.
- 은 빈 문자열이나 숫자 0과 다르며 비교에 IS 을 사용한다. COUNT(*)와 COUNT(column)도 을 세는 방식이 다르다.
- 는 명령 구조와 데이터를 분리해 전달한다.
MariaDB 연결 성공 뒤 SQL 문법·선택 DB 상태 읽기
접속 성공, 구문 오류, 현재 DB, 전송 방식의 정보를 실제 클라이언트 출력에서 분리한다.
실습 구성과 전제
- 두 사진은 다른 세션·계정의 조회 결과다. 권한이 같은 한 세션의 연속 출력처럼 읽지 않는다.
- 실습 계정은 준비된 DB 서버의 최소 조회 권한을 사용한다. -p 뒤에 실제 암호를 붙여 명령 기록에 남기지 않는다.
로그인과 SQL 파싱을 구별한다
- 프롬프트까지 들어왔다는 것은 해당 연결의 인증이 완료되었다는 뜻이다. 그 뒤 show database의 ERROR 1064는 구문 단계에서 난 오류다.
- 복수형 SHOW DATABASES로 고치면 목록이 반환된다. 목록은 현재 계정이 볼 수 있는 DB 범위를 반영하므로 서버의 모든 DB가 반드시 보인다고 단정하지 않는다.
SHOW DATABASES; SELECT VERSION(), CURRENT_USER(), DATABASE();접속한 세션에서 서버 버전·권한 계정·선택 DB를 읽는 조회 예시다.
원본 크기로 보기 ↗- 로그인 후 MariaDB 프롬프트와 10.5.29 서버 버전이 표시된다.
- show database는 1064 오류를 내고 show databases는 네 행의 목록을 반환한다.
확인 기준구문 오류를 인증 실패로 처리하지 않는다. 서버 응답을 받은 시점과 실패한 문장을 함께 기록한다.
현재 데이터베이스와 접속 경로를 읽는다
- status 화면에는 접속 사용자, 연결 방식, 문자 집합 등이 따로 나온다. Current database가 비어 있으면 기본 DB를 선택하지 않은 상태이며, 인증 실패가 아니다.
- 별도 사진은 UNIX 소켓 연결이므로 SSL Not in use를 곧바로 원격 구간의 평문 전송 증거로 해석하지 않는다. 전송 경로를 먼저 구분해야 한다.
원본 크기로 보기 ↗- Connection 항목은 Localhost via UNIX socket이고 Current database는 비어 있다.
- SSL Not in use와 여러 utf8mb4 문자 집합 항목이 각각 별도 행으로 보인다.
확인 기준현재 세션의 권한과 전송 방식을 확인한 뒤 결과를 해석한다. socket 접속과 접속은 계정 매칭·보안 조건이 달라질 수 있다.
스키마 선택 후 이름 해석을 확인한다
- 테이블 이름만 쓸 때는 현재 DB를 기준으로 찾는다. USE로 DB를 선택하거나 DB명.테이블명으로 명시하면 어떤 객체를 조회했는지 분명해진다.
- 목록 표시 권한, 테이블 읽기 권한, 테이블 존재 여부는 다르다. SELECT DATABASE()가 인 경우에도 SELECT 1 같은 특정 DB에 의존하지 않는 질의는 실행될 수 있다.
SELECT DATABASE(); USE labdb; SELECT DATABASE(); SHOW TABLES;labdb는 준비한 실습 DB 이름이다. 출력은 실제 실행 세션에서 확인한다.
확인 기준재구성한 labdb가 실제 준비된 경우에만 USE를 적용한다. Unknown database·table does not exist·access denied를 서로 다른 원인으로 분류한다.
실습에서 확인한 동작 원리
- 접속 성공 뒤에도 문법, 객체 선택, 개별 권한 단계에서 각각 오류가 발생한다.
- 현재 DB와 연결 방식은 status·DATABASE() 같은 명시적 조회로 확인하며 화면 하나의 성공을 확대하지 않는다.
동작·명령 참고 문서
04예제로 따라가기
- 주문이 없는 고객도 조회하려면 INNER 과 LEFT 의 결과 차이 및 처리를 설계해야 한다.
- 같은 고객 키에 주문이 세 건이면 결과에서 고객 행이 세 번 나타날 수 있어 중복처럼 보이는 결과의 관계를 먼저 이해한다.
- 값은 매개변수로 바인딩하지만 테이블 이름·정렬 방향 같은 구조 선택은 일반 값 바인딩으로 아무 위치에나 대체할 수 없다.
05혼동하기 쉬운 점과 확인 기준
- INSERT·UPDATE·DELETE는 관련 인덱스도 유지해야 하므로 인덱스를 무조건 많이 만드는 것은 읽기·쓰기 비용의 균형을 무시한다.
- EXPLAIN ANALYZE는 실제 실행한다. 변경 질의나 부작용이 있는 함수는 단순 조회 점검으로 취급하지 않으며, 여기의 출력은 실행하지 않은 해석 예시다.
- 성능이 느리다는 이유로 인덱스만 추가해도 잘못된 관계 연산은 고쳐지지 않는다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.