여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합체
사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해주고 데이터베이스를 관리해주는 소프트웨어
RDB : Relational Database
서로간에 관계가 있는 데이터 테이블들을 모아둔 데이터 저장공간
Structured Query Language
데이터베이스에서 데이터를 정의, 조작, 제어하기 위해 사용하는 언어
root 계정으로 mysql 접속
mysql -u root -p
database 목록 확인
SHOW DATABASE;
Database 이름을 지정하여 생성
CREATE DATABSE dbname;
CREATE DATABSE testdb; : testdb라는 이름의 데이터베이스 생성 및 확인
해당 데이터베이스로 이동(사용)
USE dbname;
testdb 데이터베이스 삭제
DROP DATABSE testdb;
use mysql;
SELECT host, user FROM user;



권한 관리를 실습하기 위한 사용자(id:noma@localhost, pw:1234)생성
CREATE USER 'noma'@'localhost' identified by '1234';
사용자에게 부여된 모든 권한 목록을 확인
SHOW GRANTS FOR 'username'@'localhost';

현재 PC에 접근가능한 noma의 권한 확인
SHOW GRANTS FOR 'noma'@'localhost';
사용자에게 특정 데이터베이스의 모든 권한을 부여
GRANT ALL ON dbname.* to 'username'@'localhost';


현재 PC에 접근가능한 noma에게 testdb의 모든 권한을 삭제
REVOKE ALL ON testdb.* from 'noma'@'localhost';
(참고) 수정내용이 적용이 되지 않은 경우 새로고침
FLUSH PRIVILEGES;
CREATE TABLE tablename
(
columnname datatype,
columnname datatype,
...
)
CREATE TABLE mytable(id int, name varchar(16));

ALTER TABLE tablename
RENAME new_tablename

ALTER TABLE tablename
ADD COLUMN columnname datatype;

ALTER TABLE tablename
MODIFY COLUMN columnname datatype;

ALTER TABLE tablename
CHANGE COLUMN old_columnname new_columnname new_datatype;

ALTER TABLE tablename
DROP COLUMN columnname;

DROP TABLE tablename;
INSERT INTO tablename(column1, column2)
VALUES (value1, value2,...);
입력한 컬럼 이름의 순서와 값의 순서가 일치하도록 주의
ID값이 1인 이효리, 43세, 여자(F) 데이터 추가
INSERT INTO person (id,name,age,sex)
VALUES (1,'이효리',43,'F');

INSERT INTO tablename
VALUES (values1, value2,...);
모든 컬럼값을 추가하는 경우에는 다음과 같이 컬럼 이름을 지정하지 않아도 되지만, 입력하는 값의 순서가 테이블의 컬럼 순서와 일치핟록 주의
ID값이 2인 이상순, 48세, 남자(M) 데이터 추가
INSERT INTO person
VALUES(2,'이상순',48,'M')

테이블 내의 특정 칼럼에 대한 데이터 조회
SELECT column1, column2,..
FROM tablename;
person 테이블 내의 이름,나이,성별 데이터를 조회
SELECT name,age,sex FROM person;
테이블 내의 모든 컬럼에 대한 데이터를 조회
SELECT *
FROM tablename;

SQL 문에 조건을 추가하며 SELECT 뿐만 아니라 UPDATE와 DELETE에도 사용
테이블 내에서 조건을 만족하는 데이터 조회
SELECT column1, column2,...
FROM tablename
WHERE condition;
person 테이블에서 성별이 여자인 데이터 조회
SELECT * FROM person WHERE sex = 'F';

UPDATE tablename
SET column1 = value1, column2 = value2,...
WHERE condtion;

DELETE FROM tablename
WHERE condition;

SELECT 문에서 데이터를 특정 컬럼을 기준으로 오름차순 혹은 내림차순 정렬하여 조회
ASC(Ascending) : 오름차순으로 정렬
DESC(Descending) : 내림차순으로 정렬
SELECT column1, column2,...)
FROM tablename
ORDER BY column1, column2,... ASC | DESC;
celeb 테이블에서 이름과 나이를 나이순으로 조회
SELECT age, name
FROM celeb
ORDER BY age ASC;




A=B : 같은
A>B : 초과
A<B : 미만
A>=B : 이상
A<=B : 이하
A<>B : 같지 않은
A!=B : 같지 않은
나이가 29세인 데이터 검색
SELECT name,age FROM celeb WHERE age=29 ORDER BY age;
나이가 29세가 아닌 데이터 검색
SELECT name,age FROM celeb WHERE age!=29 ORDER BY age;
나이가 29세 보다 큰 데이터 검색
SELECT name,age FROM celeb WHERE age>29 ORDER BY age;
나이가 29세 보다 크거나 같은 데이터 검색
SELECT name,age FROM celeb WHERE age>=29 ORDER BY age;
나이가 29세 보다 작거나 같은 데이터 검색
SELECT name,age FROM celeb WHERE age<=29 ORDER BY age;
나이가 29세 보다 크거나 작은(같지 않은) 데이터 검색
SELECT name,age FROM celeb WHERE age<>29 ORDER BY age;
celeb 테이블에서 나이(age)가 30세 이하인 데이터의 이름과 나이를 나이순으로 조회하세요.

celeb 테이블에서 이름이 ‘아이유’인 데이터의 이름과 나이, 성별, 직업, 소속사를 조회하세요.

celeb 테이블에서 소속사가 YG엔터테이먼트가 아닌 데이터의 이름, 직업, 소속사를 소속사 순으로 정렬하여 조회하세요.

celeb 테이블에서 성별이 남자인 데이터의 이름, 성별, 소속사 정보를 나이의 역순으로 정렬한 뒤 소속사 순으로 정렬하여 조회하세요.

celeb 테이블에서 나이가 50세 미만인 데이터의 성별, 소속사, 이름, 나이를 성별 순으로 정렬한 뒤 소속사 역순으로 정렬하고 마지막으로 이름 순으로 정렬하여 조회하세요.

SELECT column1, column2,...
FROM tablename
WHERE condtion1 AND condition2 AND condition3...;
나이가 29세이고 성별이 여성인 데이터 검색
SELECT * FROM celeb WHERE age=29 AND sex='F';

성별이 남자이고 나이가 40세 보다 큰 데이터를 이름의 역순으로 정렬하여 검색
SELECT * FROM celeb WHERE sex='M' AND age>40 ORDER BY name DESC;

celeb 테이블에서 성별이 남자이고 소속사가 YG엔터테이먼트인 데이터를 소속사 순으로 정렬하여 조회하세요.


하나의 조건이라도 만족하는 경우 TRUE
SELECT column1, column2,...
FROM tablename
WHERE condition1 OR condition2 OR condition3...;


*괄호를 안쳐주면 AND가 OR보다 먼저 연산되어서 결과가 달라짐

Celeb 테이블에서 소속사가 YG 엔터테이먼트 이거나 안테나인 데이터를 소속사 순으로 정렬하여 조회하세요.

Celeb 테이블에서 남자이면서 YG엔터테이먼트 소속이거나, 나이가 30세 보다 작은 데이터를 나이, 소속사 순으로 정렬하여 검색하세요.

Celeb 테이블에서 아이디가 홀수면서 성별이 남자거나, 아이디가 짝수면서 소속사가 YG엔터테이먼트인 데이터를 나이순으로 정렬하여 검색하세요.

SELECT column1, column2,...
FROM tablename
WHERE NOT condition;
성별이 여자가 아닌 데이터 검색
SELECT * FROM celeb WHERE NOT sex='F';
소속사가 YG엔터테이먼트이면서 남자가 아니거나 직업이 가수이면서 소속사가 YG엔터테이먼트가 아닌 데이터 검색

생일이 1990년 이후이면서 여자가 아니거나, 생일이 1979년 이전이면서 소속사가 안테나가 아닌 데이터 검색

Celeb 테이블에서 소속사가 YG엔터테이먼트가 아니고 나이가 40세 이하인 데이터를 이름순으로 정렬하여 조회하세요.

Celeb 테이블에서 성별이 남자가 아니거나 나이가 30세 이상인 데이터를 나이의 역순으로 정렬하여 조회하세요.

Celeb 테이블에서 직업이 가수가 아니면서 성별이 여자이거나, 나이가 40보다 작지 않으면서 아이디가 홀수인 데이터를 조회하세요.

조건값이 범위 사이에 있으면 TRUE
SELECT column1, column2,...
FROM tablename
WHERE column1 BETWEEN value1 AND value2;
나이가 20세에서 40세 사이의 데이터 검색
SELECT * FROM celeb WHERE age BETWEEN 20 AND 40;
SELECT * FROM celeb WHERE age>=20 AND age<=40;
생년월일이 1980년에서 1995년 사이가 아니면서 여자이거나, 소속사가 YG엔터테인먼트이면서 나이가 20세에서 45세 사이가 아닌 데이터 검색

Celeb 테이블에서 나이가 30세에서 60세 사이이고 성별이 남자인 데이터를 나이순으로 정렬하여 조회하세요.

Celeb 테이블에서 나이가 30세에서 60세 사이가 아니거나 YG엔터테이먼트 소속인 데이터를 나이의 역순으로 정렬하여 조회하세요.


목록 안에 조건이 존재하는 경우 TRUE
SELECT column1, column2,...
FROM tablename
WHERE column IN (value1, value2,...);
나이가 28세, 48세 중 하나인 데이터 검색
SELECT * FROM celeb WHERE age IN (28,48);
SELECT * FROM celeb WHERE age=28 OR age=48;
소속사가 나무엑터스, 안테나, 울림엔터테이먼트가 아니면서, 성별이 여자거나 나이가 45세 이상인 데이터 검색

celeb 테이블에서 아이유, 이미주, 유재석, 송강 중에 소속사가 ‘나무엑터스’인 데이터를 조회하세요.

celeb 테이블에서 소속사가 안테나, YG엔터테이먼트 중 하나가 아니고, 성별이 여자인 데이터를 조회하세요.

celeb 테이블에서 아이유, 송강, 강동원, 차승원 중에 YG엔터테이먼트 소속이 아니거나 나이가 40세에서 50세 사이인 사람을 찾아보세요.

조건값이 패턴에 맞으면 TRUE
SELECT column1, column2,...
FROM tablename
WHERE column LIKE pattern;
소속사 이름이 'YG엔터테인먼트'인 데이터를 검색
SELECT * FROM celeb WHERE agency LIKE 'YG엔터테인먼트';
SELECT * FROM celeb WHERE agency='YG엔터테인먼트';
'YG'로 시작하는 소속사 이름을 가진 데이터를 검색
SELECT * FROM celeb WHERE agency LIKE 'YG%';
'엔터테인먼트'로 끝나는 소속사 이름을 가진 데이터를 검색
SELECT * FROM celeb WHERE agency LIKE '%엔터테인먼트';
직업명에 '가수'가 포함된 데이터를 검색
SELECT * FROM celeb WHERE job_title LIKE '%가수%';
소속사 이름의 두번째 글자가 G인 데이터를 검색
SELECT * FROM celeb WHERE agency LIKE '_G%';
직업명이 '가'로 시작하고 최소 2글자 이상인 데이터 검색
SELECT * FROM celeb WHERE jobtitle LIKE '가%';
직업명이 '가'로 시작하고 최소 5글자 이상인 데이터 검색
SELECT * FROM celeb WHERE job_title LIKE '가____%';
직업명이 '영'으로 시작하고 '모델'로 끝나는 데이터 검색
SELECT * FROM celeb WHERE job_title LIKE '영%모델';
영화배우와 탤런트를 병행하는 연예인 검색
SELECT * FROM celeb
WHERE job_title LIKE '%영화배우%' AND job_title LIKE '%탤런트%';
직업이 하나 이상인 연예인 중 영화배우 혹은 탤런트가 아닌 연예인 검색


celeb 테이블에서 성별이 남자 이거나 직업명이 ‘탤런트’ 로 끝나면서 최소 5글자 이상인 데이터를 조회하세요.

celeb 테이블에서 이름이 두글자인 데이터를 조회하세요.

celeb 테이블에서 나이가 30세 이상 50세 이하면서 개그맨이 아닌 데이터를 조회하세요.

and job_title not like '%개그맨%';
celeb 테이블에서 아이유, 이미주, 유재석, 송강 중에 소속사 이름이 ‘나무’로 시작하는 데이터를 조회하세요.

celeb 테이블에서 아이유, 이미주, 송강, 이수현 중에 가수만 직업으로 가졌거나, 가수를 병행하지 않고 탤런트를 하는 사람을 찾으세요.
<강의>

<내가 쓴 답>

UNION : 중복된 값을 제거하여 알려준다.
UNION ALL : 중복된 값도 모두 보여준다.
test1 의 모든 데이터와 test2의 모든 데이터를 중복된 값을 포함하여 검색
SELECT FROM test1
UNION ALL
SELECT FROM test2;

test1 의 모든 데이터와 test2의 모든 데이터를 중복된 값을 제거하여 검색
SELECT FROM test1
UNION
SELECT FROM test2;

성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테인먼트인 데이터를 검색하는 쿼리를 union all로 실행

성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테인먼트이니 데이터를 검색하는 쿼리를 union으로 실행

가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와, 1980년대에 태어난 연예인의 이름, 생년월일, 나이를 검색하는 쿼리를 union으로 실행

직업이 가수인 (가수를 포함하는) 데이터를 검색하는 쿼리와 직업이 텔런트인 (텔런트를 포함하는) 데이터를 검색하는 쿼리를 중복을 제거하여 합쳐서 실행하세요.

성이 이씨인 데이터를 검색하는 쿼리와 1970년대생을 검색하는 쿼리를 중복을 포함하여 합쳐서 실행하세요.

두 개 이상의 테이블을 결합하는 것
두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식
SELECT column1, column2,...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
INNER JOIN snl_show
ON celeb.name = snl_show.host;

두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식
SELECT column1, column2,...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

두 개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식
SELECT column1, column2,...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

두 개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 방식
SELECT column1, column2,...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;








마지막 줄
and not (job_title like '%영화배우%' or job_title like '%탤런트%');
snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나
소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색하세요.


SELECT CONCAT('이름:',name) FROM celeb;

SELECT column as alias
FROM tablename;
name을 이름으로 별칭을 만들어서 검색

name은 이름으로, agency는 소속사로 별칭을 만들어서 검색

name과 job_title을 합쳐서 profile 이라는 별칭을 만들어서 검색

snl_korea에 출연한 celeb을 기준으로 두 테이블을 조인하여, celeb 테이블은 c, snl_show 테이블은 s 라는 별칭을 만들어서 출연한 시즌과 에피소드, 이름, 직업을 검색

snl_korea에 출연한 celeb을 기준으로 두 테이블을 조인하여 다음과 같이 각 데이터의 별칭을 사용하여 검색
- 시즌, 에피소드, 방송일을 합쳐서 '방송정보'
- 이름, 직업을 합쳐서 '출연자 정보'

as는 생략가능
이름이 3글자인 연예인 정보를 검색하여 다음과 같이 출력하세요



SELECT DISTINCT column1, column2,...
FROM tablename;
연예인 소속사 종류를 검색 - 중복 포함
SELECT agency FROM celeb;
연예인 소속사 종류를 검색 - 중복 제외
SELECT DISTINCT agency FROM celeb;
가수 중에서, 성별과 직업별 종류를 검색 - 중복 포함
SELECT sex, job_title FROM celeb WHERE job_title like '%가수%';
가수 중에서, 성별과 직업별 종류를 검색 - 중복 제외
SELECT DISTINCT sex, job_title FROM celeb WHERE job_title like '%가수%';
celeb 테이블에서 성별과 소속사 별 종류를 검색하여 성별, 소속사 순으로 정렬하세요.

검색결과를 정렬된 순으로 주어진 숫자만큼만 조회
SELECT column1, column2,..
FROM tablename
WHERE condition
LIMIT number;
celeb 데이터 3개만 가져오기
SELECT * FROM celeb LIMIT 3;
나이가 가장 적은 연예인 4명 검색

celeb 테이블에서 남자 연예인 중 나이가 가장 많은 2명을 조회하세요.



AWS 홈페이지에서 RDS 데이터베이스 생성
->
터미널에서 MySQL RDS 접속
->
mysql -h "엔드포인트" -P 포트번호 -u 사용자이름 -p
->
과금될 수 있으므로 AWS RDS를 사용하지 않을 때는 중지시켜야 한다.
cd sql_ws
mysql -u root -p zerobase
sql file 실행
source test01.sql
결과 확인
desc police_station;
외부에서 바로 실행
sql_ws 에서
mysql -u root -p zerobase < test02.sql
이후에 sql 접속하면
확인가능하다.
mysqldump -u root -p zerobase > zerobase.sql
vscode 에서 zerobase.sql확인
데이터베이스를 백업한 SQL File을 실행하여 그 시점으로 복구하거나 이전할 수 있다. (SQL File을 실행하는 방법과 동일함)
AWS RDS (database-1) 서비스가 사용가능한 상태에서 접속
sql_ws % mysql -h 엔드포인트 -P 포트번호 -u admin -p
AWS RDS (database-1)의 zerobase Database를 복원
mysql > source zerobase.sql
table 단위로도 백업할 수 있다.
sql_ws % mysqldump -u username -p dbname tablename > backup.sql
Local Database 에서 celeb Table 백업
sql_ws % mysqldump -u root -p zerobase celeb > celeb.sql
AWS RDS의 zerobase로 연결
후
복구 : source celeb.sql
데이터를 제외하고 테이블 생성 쿼리만 백업할 수 있다.
Local Database에서 snl_show Table Schema 백업
sql_ws % mysqldump -d -u root -p zerobase snl_show > snl.sql
mysqldump --set-gtid-purged=OFF -h "hostname" -P port번호 -u username -p databasename filename.sql
python에서 MySQL Driver 설치
pip install mysql-connector-python
설치확인
import mysql.connector
mydb = mysql.connector.connect(
host = "<hostname>",
user = "<username>",
password = "<password>"
)
local = mysql.connector.connect(
host = "<hostname>",
user = "<username>",
password = "<password>",
database = "<databasename>"
)
mydb.close()
local.close()
remote.close()

- 결과확인

테이블 삭제


SQL File을 실행하기 위한 코드
remote = mysql.connector.connect(
host = "database-1.ccgidvolmpk3.ap-northeast-2.rds.amazonaws.com",
user = "admin",
port = 3306,
password = "ahrgoals",
database = "zerobase"
)
cur = remote.cursor()
sql = open("test03.sql").read()
cur.execute(sql)
remote.close()




csv에 있는 데이터를 Python으로 insert

zerobase database에 연결
cursor 만들기 : 읽어올 양이 많은 경우 buffer설정을 해준다.
cursor = conn.cursor(buffered=True)
sql = "INSERT INTO police_station VALUES (%s,%s)"
데이터 입력
commit()은 database에 적용하기 위한 명령

결과 확인

검색결과를 Pandas로 읽기


AWS RDS(database-1) zerobase에 접속
2020_crime.csv 데이터 읽어오기
INSERT 쿼리 작성
sql = """INSERT INTO crime_status VALUES ("2020",%s,%s,%s,%s)"""
cursor = conn.cursor(buffered=True)
데이터를 crime_status 테이블에 INSERT

crime_status 테이블의 데이터 조회


하나의 칼럼을 기본키로 설정하는 경우

여러개의 칼럼을 기본키로 설정하는 경우

존재하는 테이블에 하나의 칼럼을 기본키로 지정하는 경우

존재하는 테이블에 여러개의 칼럼을 기본키로 지정하는 경우

하나의 칼럼이 기본키로 설정된 경우

여러개의 칼럼이 기본키로 설정된 경우(삭제하는 방법은 동일)

CREATE TABLE에서 FOREIGN KEY를 지정하는 경우

CREATE TABLE에서 FOREIGN KEY를 지정하는 경우, CONSTRAINT를 생략할 수 있다.

TABLE이 생성된 이후에도 ALTER TABLE을 통해 FOREIGN KEY 지정가능



COUNT : 총 갯수를 계산해주는 함수
SUM : 합계를 계산해 주는 함수
AVG : 평균을 계산해주는 함수
MIN : 가장 작은 값을 찾아주는 함수
MAX : 가장 큰 값을 찾아주는 함수
FIRST : 첫번째 결과값을 리턴하는 함수
LAST : 마지막 결과값을 리턴하는 함수
SELECT COUNT (column)
FROM tablename
WHERE condition;
police_station 테이블에서 데이터는 모두 몇 개?

crime_status 테이블에서 경찰서는 총 몇군데?

crime_type은 총 몇 가지?

SELECT SUM (column)
FROM tablename
WHERE condition;
범죄 총 발생건수는?

살인의 총 발생건수는?

중부 경찰서에서 검거된 총 범죄 건수는?

police_station에서 경찰서는 총 몇개이고, 각각 경찰서 이름은 무엇인지 확인하세요

crime_status에서 status_type은 총 몇개이고, 각각 타입은 무엇인지 확인하세요

종로경찰서와 남대문경찰서의 강도 발생 건수의 합을 구하세요


SELECT AVG(column)
FROME tablename
WHERE condition;
평균 폭력 검거 건수는?

중부경찰서 범죄 평균 발생 건수

SELECT MIN(column)
FROM tablename
WHERE condition;


SELECT MAX(column)
FROME tablename
WHERE condition;
살인이 가장 많이 검거된 건수는?

강남 경찰서에서 가장 많이 발생한 범죄 건수는?

살인의 평균 발생 건수를 검색하고 확인


서초경찰서의 범죄 별 평균 검거 건수를 검색하고 확인

구로경찰서와 도봉경찰서의 평균 살인 검거 건수를 검색하고 확인


광진경찰서에서 가장 낮은 범죄 검거 건수를 검색하고 확인


성북경찰서에서 가장 낮은 범죄 발생 건수를 검색하고 확인

영등포경찰서에서 가장 높은 범죄 발생 건수를 검색하고 확인



SELECT column2, column2,...
FROM tablename
WHERE condition
GROUP BY column1, column2,...
ORDER BY column1, column2,...
crime_status에서 경찰서별로 그룹화하여 경찰서 이름을 조회

경찰서 종류를 검색 - DISTINCT를 사용하는 경우 (ORDER BY를 사용할 수 없음)

경찰서 별로 총 발생 범죄 건수를 검색

경찰서 별로 평균 범죄 검거 건수를 검색

경찰서 별 평균 범죄 발생건수와 평균 범죄 검거 건수를 검색

조건에 집계함수가 포함되는 경우 WHERE 대신 HAVING 사용
경찰서 별로 발생한 범죄 건수의 합이 4000건보다 큰 경우를 검색

경찰서 별로 발생한 폭력과 절도의 범죄 건수 평균이 2000이상인 경우를 검색


경찰서 별로 가장 많이 검거한 범죄 건수를 가장 적은 건수 순으로 5개 검색

경찰서 별로 가장 적게 검거한 건수 중 4건보다 큰 경우를 건수가 큰 순으로 정렬하여 검색

'대문'으로 끝나는 이름의 경찰서 별 범죄발생 건수의 평균이 500건 이상인 경우를 검색

하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다.
메인 쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
서브쿼리는 메인쿼리의 칼럼 사용 가능
메인쿼리는 서브쿼리의 칼럼 사용 불가
Subquery 사용시 주의
Subquery 종류
SELECT 절에서 사용하는 서브쿼리. 결과는 하나의 Column이어야 한다.