SELECT로 데이터 조회하기
SELECT statement
- ID가 9인 임직원의 이름과 직군 알고 싶음
- selection condition: employee라는 table에서 어떤 tuple을 선택할지 조건 명시
- projection attributes: 내가 알고 싶은 attributes 지정하여 그 attributes에 대응하는 값들만 가지고 오겠다는 의미
- 즉 SELECT문을 수행하게 되면 selection condition을 통해 선택된 tuple의 값들 중에서, projection attributes에 의해 지정된 그 attribute에 대응하는 값만 가져오게 됨. 다시 말해, 위의 그림과 같이 교차된 값들만 가져옴
<정리> SELECT statement
SELECT attribute(s)
FROM table(s)
[WHERE condition(s)];
- SELECT 키워드 + 알고싶은 attribute list
- FROM 키워드 + 어떤 table에서부터 읽어올지 지정, query문에 따라 table 2개 이상 올 수 있음
- WHERE 키워드 + 관심있어 하는 tuple들만 가지고 오고 싶은 경우 조건 작성
SELECT statement
- project 2002를 리딩(leading)하고 있는 임직원의 ID와 이름과 직군을 알고 싶음
- leader_id를 통해 EMPLOYEE table에 접근 가능해짐
- leader_id가 EMPLOYEE table의 id를 가리키는 reference하는 foreign key 이기에
- PROJECT id는 PROJECT table에 있지만, 최종적으로 가져와야 하는 정보들은 EMPLOYEE에 있음
- 위 2개의 table 연관되어 있음
- join condition: 두 개의 table 연결시키는 역할
- join condition에 의해 project table에 있는 leader_id의 값인 13이 employee table에 있는 id의 값 13과 연결됨
- 이에 최종적으로, selection condition이 EMPLOYEE table의 해당 tuple까지도 선택함
- join condition에 의해 연결되었기에
- EMPLOYEE table과 PROJECT table에 동일한 이름의 attribute가 존재함 (id, name)
- attribute 이름은 같은 table 안에서만 겹치지 않으면 됨
- 서로 다른 table이라면 attribute 이름이 같을 수도 있음
- attribute 이름이 충돌하지 않는 경우, table 이름 써도 되고 안 써도 됨
- attribute 이름이 충돌하는 경우, 반드시 table 이름과 attribute 이름 같이 써야 됨
SELECT문과 관련된 기본적으로 제공되는 여러가지 키워드
AS
- AS는 테이블이나 attribute에 별칭을 붙일 때 사용
- AS는 생략 가능
- AS 키워드를 통해 각 테이블에 별칭을 붙인 경우
- select 결과로 나오는 attribute 이름에 대해 새로운 이름 부여한 경우
DISTINCT
- 디자이너들이 참여하고 있는 프로젝트들의 ID와 이름을 알고 싶음
- EMPLOYEE table: 디자이너들이 어떤 프로젝트에 일하고 있는지, 즉 POSITION attribute의 값이 DSGN으로 표시되어 있는 것에 관심 있기에 이 테이블 필요.
- PROJECT table: 그 임직원이 참여하고 있는 프로젝트에 관심이 있는 것이기에 이 테이블 필요.
- WORKS_ON table: 위 두 개의 테이블을 연결시켜주기에 이 테이블 필요. 이 테이블은 어떤 임직원이 어떤 프로젝트에서 일하고 있는지에 대한 정보를 담고 있기에.
- attribute 이름 앞에 DISTINCT 적어주면 attribute 조합에 대해서 중복된 tuple들은 제거해줌.
<정리> DISTINCT 사용하기
- DISTINCT는 select 결과에서 중복되는 tuples은 제외하고 싶을 때 사용함
LIKE
LIKE 사용하기
- 이름이 N으로 시작하거나 N으로 끝나는 임직원들의 이름을 알고 싶음
LIKE 사용하기
- 이름에 NG가 들어가는 임직원들의 이름을 알고 싶음
LIKE 사용하기
- 이름이 J로 시작하는, 총 네 글자의 이름을 가지는 임직원들의 이름을 알고 싶음
escape 문자와 함께 LIKE 사용하기
- 위에서 본 것과 같이 %, _가 특별한 의미를 가지는데, 그게 아닌 %, _를 문자 본연의 의미로 사용하고 싶을 때는?
- %로 시작하거나 _로 끝나는 프로젝트 이름을 찾고 싶다면?
- SELECT name FROM project WHERE name LIKE '\%%' or name LIKE '%\_';
- \% : \ 뒤에 %를 붙이게 되면 이 %를 특별한 의미의 %가 아니라, 문자 그대로의 % 의미로 사용하라는 의미
- \% 뒤에 나오는 %는 특별한 의미를 가지는 %임. 즉, 0개 이상의 임의의 개수를 가지는 문자를 의미
- 특별한 의미를 가지는 문자가 있을 때, 특별한 의미로서가 아니라 문자 본연의 의미를 가지도록 만들어주는 것을 escape라고 함.
- 위의 예시에서는 \(백슬래시)가 escape 문자가 됨.
*(asterisk)
- *(asterisk)는 선택된 tuples의 모든 attributes를 보여주고 싶을 때 사용함
*(asterisk) 사용하기
- ID가 9인 임직원의 모든 attribute를 알고 싶음
SELECT without WHERE
- 모든 임직원의 이름과 생일을 알고 싶음
<정리> SELECT without WHERE
- 테이블에 있는 모든 tuples를 반환함
주의 사항
- SELECT로 조회할 때 조건들을 포함해서 조회를 한다면 이 조건들과 관련된 attributes에 index가 걸려있어야 한다. 그렇지 않다면 데이터가 많아질 수록 조회 속도가 느려진다.
- ex: SELECT * FROM employee WHERE position = 'dev_back';
- employee table에서 position이 'dev_back'만 조회하고 싶은 경우, position에 대해서 인덱스가 걸려 있어야 employee table에 데이터가 아무리 많이 있더라도 이 query문을 실행하는 속도가 느려지지 않고 빠르게 유지될 수 있음.
- " index에 대한 내용은 나중에 영상에서 언급하겠다."
2. 오늘 내용은 MySQL 기준이다. 다른 RDBMS의 SQL 문법은 조금씩 다를 수 있음