SHOW DATABASES
현재 서버에 어떤 DB가 있는지 보기
USE
- 사용할 데이터베이스 지정
- 지정해 놓은 후 특별히 다시 USE문 사용하거나 다른 DB를 사용하겠다고 명시하지 않는 이상 모든 SQL문은 지정 DB에서 수행
USE database_name;
- Workbench에서 직접 선택해 사용 가능
[Navigator] → [SCHEMAS] → 데이터베이스 선택
SHOW TABLES
- 지정한 데이터베이스의 테이블 이름 보기
SHOW TABLE STATUS
- 지정한 데이터베이스의 테이블 정보 조회(row 개수 등등 정보를 보여줌)
DESCRIBE(DESC)
- 해당 테이블에 무슨 컬럼이 있는지 확인
DESCRIBE city;
DESC city;
SELECT
- <SELECT... FROM>
- 요구하는 데이터를 가져오는 구문
- 일반적으로 가장 많이 사용되는 구문
- 데이터베이스 내 테이블에서 원하는 정보를 추출
- SELECT 구문 형식
SELECT select_expr
[FROM table_references]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}]
SELECT *
해당 테이블의 전체 데이터들을 보여줌(모든 열)
SELECT *
FROM city;
SELECT 열 이름
- 테이블에서 필요로 하는 열만 가져옴
- 여러 개의 열을 가져오고 싶을 때는 콤마로 구분
- 열 이름의 순서는 출력하고 싶은 순서대로 배열 가능
SELECT Name, Population
FROM city;
SELECT FROM WHERE
- 조회하는 결과에 특정한 조건으로 원하는 데이터만 보고 싶을 때 사용
- SELECT 필드이름 FROM 테이블이름 WHERE 조건식;
SELECT *
FROM city
WHERE Population >= 8000000;
- 연산자의 사용
- 조건 연산자(=, <, >, <=, >=, <>, != 등)
- 관계 연산자(AND, OR, NOT 등)
- 연산자의 조합으로 데이터를 효율적으로 추출
SELECT *
FROM city
WHERE Population > 7000000 AND Population < 8000000;
- BETWEEN
데이터가 숫자로 구성되어 있어 연속적인 범위를 지정할 때 BETWEEN...AND 사용 가능(이상, 이하의 결과를 추출)
SELECT *
FROM city
WHERE Population BETWEEN 7000000 AND 8000000;
# 동일한 결과(AND 연산자 사용)
SELECT *
FROM city
WHERE Poulation >= 7000000 AND Population <= 8000000;
# 위 검색내용과 반대되는 조건문
SELECT *
FROM city
WHERE Population NOT BETWEEN 7000000 AND 8000000;
- IN
이산적인 값의 조건에서는 IN()사용 가능(IN안에 들어가는 값에 맞는 결과 추출)
SELECT *
FROM city
WHERE Name IN('Seoul', 'New York', 'Tokyo');
# 마찬가지로 NOT 이용 가능(반대되는 조건문)
- LIKE
- 문자열의 내용 검색하기 위해 LIKE 연산자 사용(부분적으로 일치하는 데이터를 찾을때 사용)
- _: 글자숫자를 정해줌(EX 컬럼명 LIKE '홍_동'), 한 글자와 매치
- %: 글자숫자를 정해주지않음(EX 컬럼명 LIKE '홍%'), 모든 글자와 매치
# A로 시작하는 문자를 찾기
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE 'A%';
# A로 끝나는 문자 찾기
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE '%A';
# A를 포함하는 문자 찾기
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE '%A%';
# A로 시작하는 두 글자 문자 찾기
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE 'A_';
# 첫 번째 문자가 'A'가 아닌 모든 문자열 찾기
SELECT 컬럼명
FROM 테이블
WHERE 컬럼명 LIKE '[^A]';
# 첫 번째 문자가 'A' 또는 'B' 또는 'C'인 문자열 찾기
SELECT 컬럼명 FROM 테이블 WHERE 컬럼명 LIKE '[ABC]';
SELECT 컬럼명 FROM 테이블 WHERE 컬럼명 LIKE '[A-C]';
- Sub Query(서브 쿼리)
- 쿼리문 안에 또 쿼리문이 들어 있는 것
- 서브 쿼리의 결과가 둘 이상이 되면 에러 발생
- 서브쿼리를 쓰는 이유는 알려지지 않은 기준을 이용한 검색을 하기 위해서
SELECT *
FROM city
WHERE CountryCode = ( SELECT CountryCode
FROM city
WHERE Name = 'Seoul' );
서브 쿼리만 실행하면 city 테이블에서 Name이 'Seoul'인 CountryCode가 출력되고('KOR') 메인 쿼리와 매칭시켜 결과 출력
# 서브 쿼리의 결과가 둘 이상이 되면 에러 발생
SELECT *
FROM city
WHERE CountryCode = ( SELECT CountryCode
FROM city
WHERE Name IN('Seoul', 'Kabul') );
- ANY(서브쿼리 안의 값이 여러개일때)
- 서브쿼리의 여러 개의 결과 중 한 가지만 만족해도 가능(하나의 조건만 만족하면 True)
- SOME은 ANY와 동일한 의미로 사용
SELECT *
FROM city
WHERE Population > ANY( SELECT Population
FROM city
WHERE District = 'New York' );
#
> ANY : 최소값보다 크면
>= ANY : 최소값보다 크거나 같으면
< ANY : 최대값보다 작으면
<= ANY : 최대값보다 작거나 같으면
= ANY : IN과 같은 기능
!= ANY : NOT IN과 같은 기능
- ALL(서브쿼리 안의 값이 여러개일때)
- 서브쿼리의 여러 개의 결과를 모두 만족시켜야 함(모든 값이 조건 만족하면 True)
SELECT *
FROM city
WHERE Population > ALL( SELECT Population
FROM city
WHERE District = 'New York' );
#
> ALL : 최대값보다 크면
>= ALL : 최대값보다 크거나 같으면
< ALL : 최소값보다 작으면
<= ALL : 최소값보다 작거나 같으면
= ALL : 서브 쿼리의 결과가 1건이면 괜찮지만 여러 건이면 오류가 발생
!= ALL : 서브 쿼리의 결과가 1건이면 괜찮지만 여러 건이면 오류가 발생
ORDER BY
- 결과가 출력되는 순서를 조절하는 구문
- default는 ASC(오름차순)으로 생략 가능
- 내림차순 정렬(열 이름 뒤에 DESC 적어줄 것)
SELECT *
FROM city
ORDER BY Population DESC;
- 혼합해 사용하는 구문도 가능
SELECT *
FROM city
ORDER BY CountryCode ASC, Population DESC;
# CountryCode 컬럼을 오름차순으로 정렬 후, Population 컬럼을 내림차순 정렬
DISTINCT
- 중복된 것은 1개씩만 보여주면서 출력
- 테이블의 크기가 클수록 효율적
SELECT DISTINCT CountryCode
FROM city;
LIMIT
- 출력 개수를 제한
- 상위의 N개만 출력하는 'LIMIT N' 구문
- 서버의 처리량을 많이 사용해 서버의 전반적인 성능을 나쁘게 하는 악성 쿼리문 개선할 때 사용
- Workbench에서 Limit을 조절하는 옵션이 있음
SELECT *
FROM city
ORDER BY Population DESC
LIMIT 10;
GROUP BY
- 그룹으로 묶어주는 역할(효율적인 데이터 그룹화)
- 집계 함수를 함께 사용
AVG(): 평균
MIN(): 최소값
MAX(): 최대값
COUNT(): 행의 개수
COUNT(DISTINCT): 중복 제외된 행의 개수
STDEV(): 표준편차
VARIANCE(): 분산
- 읽기 좋게 하기 위해 별칭 사용: AS
SELECT CountryCode, AVG(Population) AS 'Average'
FROM city
GROUP BY CountryCode;
Question: 도시는 몇개인가?, 도시들의 평균 인구수는?
SELECT COUNT(*)
FROM city;
SELECT AVG(Population)
FROM city;
HAVING
- WHERE과 비슷한 개념으로 조건 제한
- 집계 함수에 대해서 조건 제한하는 편리한 개념
- HAVING절은 반드시 GROUP BY절 다음에 나와야 함
SELECT CountryCode, MAX(Population)
FROM city
GROUP BY CountryCode
HAVING MAX(Population) > 8000000;
ROLLUP
- 총합 또는 중간합계가 필요할 경우 사용
- GROUP BY절과 함께 WITH ROLLUP문 사용
SELECT CountryCode, Name, SUM(Population)
FROM city
GROUP BY CountryCode, Name WITH ROLLUP;
JOIN
- 데이터베이스 내의 여러 테이블을 하나의 테이블이나 결과 집합으로 결합
- python에서 데이터프레임을 결합하는 merge와 비슷
SELECT *
FROM city
JOIN country ON city.CountryCode = country.Code;
Question: city, country, countrylanguage 테이블 3개를 JOIN 하기
SELECT *
FROM city
JOIN country ON city.CountryCode = country.Code
JOIN countrylanguage ON city.CountryCode = countrylanguage.CountryCode;
Reference)
유튜브 '이수안컴퓨터연구소 MySQL 데이터베이스 한번에 끝내기'
'SQL' 카테고리의 다른 글
MySQL(3) (0) | 2023.05.21 |
---|---|
MySQL(2) (0) | 2023.05.19 |
DDL, DML, DCL (0) | 2023.05.18 |