[SQL] 극악무도한티스토리를고발합니다 이것저것보장하라아무거나규탄한다그리고 SQL 명령어의 종류 (feat. JAY PARK)
제목이 왜 이 꼬라지인지는 글 맨 마지막을 보면 알 수 있습니다
이름에서부터 알 수 있듯이 SQL은 '언어'잖아요?
그래서 이 언어는 어떻게 구성되어 있는지 알아보는 시간을 가져보겠어요~
근데 웬 박재범이냐구요?
그냥요
1. DDL (Data Definition Language)
직역하자면 데이터를 정의하는 언어로, 테이블과 같은 스키마(DB의 구조)를 정의 및 관리하는 명령어들로 구성
Column(열) 단위로 조작하게 된다
1. CREATE : 생성
- CREATE TABLE : 새로운 테이블 생성
- CREATE VIEW : DB의 일부 데이터에 대한 VIEW(가상의 테이블)를 생성
- CREATE DATABASE : 새로운 DB 생성
- CREATE INDEX : 인덱스를 생성하여 데이터 검색 속도를 향상시킴
2. ALTER : 수정
- ALTER TABLE : 이미 존재하는 테이블의 구조를 변경 (Column을 추가, 삭제, 제약조건 등을 변경)
--테이블 컬럼 추가 (ADD)
ALTER TABLE 테이블명 ADD 컬럼명 데이터타입;
-- 테이블 컬럼 데이터타입 변경 (MODIFY)
ALTER TABLE 테이블명 MODIFY 컬럼명 데이터타입;
-- 테이블의 컬럼명 변경 (RENAME)
ALTER TABLE 테이블명 RENAME COLUMN 기존컬럼명 TO 변경컬럼명;
--테이블 컬럼 삭제 (DROP)
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
- ALTER INDEX : 이미 존재하는 인덱스의 구조를 변경
Cf) ALTER SESSION : DB 연결에 영향을 미치는 조건이나 매개변수를 수정
--ORACLE DataBase에서 "_ORACLE_SCRIPT" 모드를 활성화하는 쿼리
ALTER SESSION SET = "_ORACLE_SCRIPT" = TRUE;
구체적인 내용은 ORACLE 홈페이지에서 아주 잘 설명해주고 있다.. 사용 방법까지도..!
SQL Language Reference
docs.oracle.com
3. DROP : 삭제
이 친구는.. 뒤에 DML에서 다룰 DELETE와 혼동하기 쉬운 녀석인데요... 왜 이렇게 글을 쓰는데 익숙할까요? ㅎㅎ
이게 바로 데자뷰? 티스토리 나쁜놈.. 아무튼 CREATE와 마찬가지로 TABLE, VIEW, DATABASE, INDEX를 삭제하는데 사용 가능하다. 데이터를 담는 구조를 지워버리는 점에 주의할 것!
2. DML(Data Manipulation Language)
데이터를 조작하는 언어로,
DB에 존재하는 데이터를 조회, 생성(삽입), 수정, 삭제하는 명령어들로 구성
Row(행) 단위로 조작하게 된다
DDL은 데이터가 모여있는 구조 자체를 다루는 명령어였다면, DML은 데이터 그 자체를 다루는 점에 주의하자
1. INSERT : 데이터 삽입
- DB 테이블에 새로운 레코드(행) 삽입
INSERT INTO 테이블명 (column1, column2, colmn3,...)
VALUES(값1, 값2, 값3,...);
2. UPDATE : 데이터 수정
- 이미 존재하는 데이터를 업데이트(수정)
- 데이터 구조를 수정하는 ALTER와 혼동하지 않도록 주의
UPDATE 테이블명 SET 열1=값1, 열2=값2, ...
WHERE 조건;
3. DELETE : 데이터 삭제
- 데이터베이스 테이블에서 레코드(데이터) 삭제
DELETE FROM 테이블명 WHERE 조건;
드디어 나왔다 DROP이랑 지지리도 헷갈리던 그 녀석. SQLD 시험 공부하면서 MySQL로 쿼리를 잠깐 깔짝대고 맨땅에 헤딩하듯이 노랭이 문제집만 미친듯이 풀어제꼈지만 곧 죽어도 차이점이 외워지지 않던 이녀석! 덕분에 시험 공부를 했음에도 불구하고 머릿속에 남은 것은 하나도 없었다. 하지만 지금의 난 달라~
DROP | DELETE |
DDL 명령어로, 데이터 구조 (테이블 or column 등등...) 를 삭제해버림 |
DML 명령어로, 데이터 구조 내에 데이터(row)를 삭제해버림 |
DROP과 DELETE의 차이점
한 마디로 DROP은 데이터가 살고있는 집을 철거해버려서 데이터조차 남지 않게 만드는 것이고,
DELETE는 데이터 집은 그대로 두되 안에 살고있던 데이터만 내쫓아버리는 것
이렇게 쉬운 차이를 2년 전의 나는 왜 그렇게 헷갈려했을까.. 당연함 개념은 1도 모르고 문제만 풀어제꼈음
4. SELECT : 데이터 조회
- 데이터베이스 테이블에서 데이터를 조회하고 검색
--column :조건에 맞는 데이터의 정보 1,2,...,n
SELECT column1, column2, ...,column
FROM 테이블명
WHERE 조건;
--데이터의 모든 정보 조회
SELECT * FROM 테이블명
WHERE 조건;
사실 이 SELECT문은 데이터를 조회하는 기능으로 SQL 명령어 중 압도적으로 쓸 일이 많은데...
그래서 조회 및 조회 보조 기능을 가진 명령어들을 따로 묶어서 아래와 같이 분류하기도 한다.
3. DQL(Data Query Language)
데이터베이스에서 검색하고 조회하는데 사용
SELECT문을 사용해서 데이터를 검색하고 필터링하며, 원하는 정보를 추출한다
1. SELECT
- 테이블에서 데이터를 선택하고 반환
- 필드 목록, 테이블, 조건 및 정렬을 지정할 수 있음
2. FROM
- SELECT 문에서 데이터를 검색할 대상 테이블을 지정
SELECT * FROM 테이블명; //테이블의 전체 열에 해당하는 데이터를 선택
3. WHERE
- 검색 결과를 필터링하기 위한 조건을 지정, 특정 조건을 충족하는 행만 반환
SELECT 컬럼명 FROM 테이블명 WHERE 조건;
특정 조건을 충족하는 행을 반환하는 만큼, WHERE절은 데이터 각 개에 대한 조건을 건다고 보면 된다
(뒤에 설명할 HAVING과 혼동하지 말것)
4. GROUP BY
- 검색 결과를 그룹화하고 그룹 단위로 데이터를 집계할 때 사용
- HAVING절과 함께 쓰임
4-1. HAVING
GROUP BY와 함께 사용되며, 그룹화된 데이터에 대한 조건 지정
> 조건을 충족하는 그룹만 반환
/*예시 :
table1에서 column1을 기준으로 그룹화 했을 때,
column2의 평균값이 10 미만인 그룹만 골라서 그룹별 column2 평균값을 반환 */
SELECT column1, AVG(column2)
FROM table1
GROUP BY column1
HAVING AVG(column2) < 10; --GROUP화된 데이터에 대한 조건 지정
GROUP BY와 HAVING에 대한 이야기는 다른 글을 통해 따로 다룰 예정...
5. DISTINCT
- 중복제거 키워드로, SELECT로 DB에서 컬럼을 조회할 때 중복되는 값을 제거함
- DISTINCT 키워드를 붙인 컬럼은 중복 값을 합쳐 한 번만 출력한다
SELECT distinct 컬럼명
FROM 테이블명;
- DISTINCT 뒤에 2개 이상의 컬럼을 사용하면, 뒤에 있는 모든 컬럼에 대해 하나의 행으로 인식하여 그 행의 중복을 제거
--예시
SELECT distinct 컬럼1, 컬럼2, 컬럼3
FROM 테이블명;
6. ORDER BY
- 검색 결과를 정렬하기 위해 사용, 정렬할 열 및 정렬 순서를 지정
- 기본적으로 ASC(오름차순)이 적용되며, DESC(내림차순)으로 지정 가능
SELECT 컬럼명 FROM 테이블명
ORDER BY 컬럼명 ASC; --오름차순
SELECT 컬럼명 FROM 테이블명
ORDER BY 컬럼명 DESC; --내림차순
SELECT 컬럼명 FROM 테이블명
ORDER BY 컬럼명 ; --오름차순 (디폴트 정렬기준이 오름차순이기 때문)
이미 검색된 결과를 정렬하는 순서에만 영향을 미치지, 출력될 데이터의 필터링 자체에는 그 자체로 영향을 줄 수 없다
(뒤에 나올 FETCH를 활용하면 가능하다고 볼 수 있긴하다)
7. UNION
- SQL의 두 개 이상의 SELECT문 결과를 합쳐서 하나의 결과 집합으로 변환하는 연산자
- 중복된 행을 제거해서 중복 행을 포함하지 않는 결과를 생성
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
사실 UNION ALL 을 사용하면 중복된 행도 포함하는 결과를 생성 가능하다
그리고 이는 DUAL이라는 오라클에서 제공하는 어떤 친구와 함께 아주 편리한(?) 기능도 구현이 가능한데 이건 다른 게시글로...
8. JOIN
- 다수의 테이블을 연결하여 데이터를 결합하는데 사용
- INSERT JOIN / LEFT JOIN / RIGHT JOIN / FULL OUTER JOIN 등... 다양한 결합유형 존재
나왔다 SQL의 꽃 JOIN문.
사실 나는 아직 응애수준이라서 이게 꽃인지 어떤지는 잘 모르겠지만, 암튼 경력직 사람들 말로 꽃이라고 하니까
대충 그런다보다 하고 열심히 공부하자. 사람일 어케 될지 모름
예제를 통해 이해해봅시다
SELECT e.ename,d.dname, e.dno
FROM employee e
JOIN department d ON d.dno = e.dno;
일단 코드가 너무 길어지는 것을 방지하기 위해 employee라는 테이블을 'e'라는 별칭으로, department라는 테이블을 'd'라는 별칭으로 지칭하겠다. 원래는 AS를 통해 지칭해야되는데.. SQL의 Alias라는 기능(?)이 착하게도 코드 두 글자를 덜 쓰는 수고를 덜어줬다. 아무때나 막 줄여쓸 수 있는 것은 아니니 주의. (예를들어 WHERE절...)
그리고 전체 직원의 이름, 부서이름, 부서번호를 한 번에 확인하고자 하는데?
아쉽게도 employee 테이블에는 부서 이름을 나타내는 column이 존재하지 않는다
그리고 우리는 e와 d, 두 테이블의 dno(부서번호)가 지칭하고 있는 데이터가 동일한 점을 알아챘다
그래서 JOIN문을 통해 e.dno 와 d.dno를 같다고 명시해준 다음 출력을 해주면?
의도한대로 전체 직원 이름, 부서 이름, 부서 번호가 매칭되어 나온 것을 확인할 수 있다 ^_____^
놀랍게도 14명이 전 직원 맞구요, 회사규모가 조금 작나봐요 데이터 파일을 저렇게 받은걸 어캅니까!
암튼 이렇듯 JOIN문은 동일한 데이터를 나타내는 컬럼을 기준으로 두 테이블을 묶어서 데이터를 결합할 수 있다는 장점을 가진 아주 다재다능한 친구다 호호~ 그리고 마지막으로
**다양한 JOIN문 종류
1) INNER JOIN (=JOIN)
데이터베이스에서 여러 테이블 간의 관계를 설정하고, 데이터를 결합
두 개 이상의 테이블을 연결하여 공통된 값을 기준으로 행을 결합
2) LEFT JOIN / RIGHT JOIN
왼쪽 테이블 (첫 번째 테이블)을 기준으로 오른쪽 테이블에서 일치하는 행을 선택
왼쪽 테이블에 있는 모든 행이 결과 집합에 포함되고, 오른쪽 테이블과 일치하는 행이 없으면 NULL값 포함
(RIGHT JOIN의 경우는 반대)
3) FULL JOIN (FULL OUTER JOIN)
왼쪽 테이블과 오른쪽 테이블의 모든 행을 포함해서 양쪽 테이블의 데이터를 모두 가져옴
두 테이블에 일치하는 행이 있는 경우에는 해당 데이터를 포함
왼쪽 테이블 또는 오른쪽 테이블의 한 쪽에만 있는 데이터는 NULL값 포함
주로 양쪽 테이블의 모든 데이터를 가져와야 할 때 사용
9. CASE
- 조건에 따라 다른 결과를 반환, 주로 SELECT문에서 사용
- 다양한 조건에 따라 다른 값을 출력하거나 계산하는데 유용
- 여러 WHEN을 사용해서 여러 조건을 처리 가능하며, 각 조건에 해당하는 결과를 정의
사용법은 아래와 같다
CASE
WHEN 조건1 THEN 결과1 --조건에 따라 표현하고자 하는 결과 작성
WHEN 조건2 THEN 결과2
...
WHEN 조건n THEN 결과n
ELSE 기본값
END
CASE 다음에 WHEN 절을 사용해서 조건을 지정 > 조건을 만족하는 경우 해당 조건의 결과를 반환
THEN : 조건을 만족했을 때 반환할 결과 값을 지칭
ELSE : 모든 조건이 만족되지 않을 때 반환할 기본값을 정의하는데 사용 (선택사항)
END : CASE문의 종료
10. FETCH
아으 드디어 마지막놈
- 결과 집합에서 일부 행을 가져오거나, 특정 순서로 정렬된 결과에서 특정 범위의 행을 검색하는데 사용
아까 말했던 ORDER BY와 함께 쓰일 수 있는 놈이다. 사실 둘이 꼭 묶어 쓸 이유는 전혀 없다
ORDER BY로도 데이터를 출력할 때 필터링(?) 기능을 구현할 수 있다 정도를 말하고자 했을 뿐..
암튼 예를 들자면
SELECT * FROM 테이블
FETCH FIRST 10 ROWS ONLY; --처음에 10개 행을 가져올 때
SELECT * FROM 테이블
OFFSET 10 ROWS --처음 10개 행을 건너뛰고
FETCH FIRST 10 ROWS ONLY; --11번째부터 20번째 행을 가져올 때
위와 같이 작성이 가능한데,
"다른데 보면 ROWS말고 ROW 쓰던데요?", "FIRST가 아니라 NEXT 아닌가요?" 할 수 있겠다.
하지만 위의 두 케이스는 기능적으로 아무런 차이도 없기 때문에 그냥 아무거나 입맛따라 골라쓰세요 왜 그런지는 모르겠고 사용자의 선택지를 코딱지만큼이나마 늘려주려는 오라클의 배려라고 생각할랍니다..
궁금하면 찾아서 저도 좀 알려주세요
믿지 않을 사람들을 위하여..
전직원들의 연봉을 내림차순으로 출력하면 아래와 같은 결과가 나온다
SELECT salary FROM employee
ORDER BY salary DESC;
그리고 3줄을 건너뛰고 5개 행을 출력하는 쿼리를 작성하면
SELECT salary FROM employee
OFFSET 3 ROWS
FETCH FIRST 5 ROWS ONLY;
그리고 FIRST를 NEXT로 바꿔보면..
SELECT salary FROM employee
OFFSET 3 ROWS
FETCH NEXT 5 ROWS ONLY;
굳
사실 귀찮아서 ROW랑 ROWS까진 안해봤어요
3. DCL(Data Control Language)
데이터를 제어하는 언어로,
DB에 접근하고 객체들을 사용할 수 있는 권한을 관리하는 명령어들로 구성
1. GRANT : 권한부여
- 권한을 부여하는 키워드로,
역할 혹은 사용자가 SELECT, INSERT, UPDATE, DELETE, CREATE TABLE 등을 수행하는 권한을 지정할 수 있음
GRANT 권한 TO 역할 혹은 사용자 [WITH GRANT OPTION];
**권한종류
1) CREATE SESSION
사용자가 데이터베이스에 로그인하고 세션을 생성하는데 필요한 권한 > 사용자에 데이터베이스 로그인 권한 부여
2) CREATE ANY TABLE
사용자가 데이터베이스 내에서 어떤 스키마나 테이블을 생성할 수 있는 권한
> 사용자는 어떤 스키마에서든 테이블을 만들 수 있게됨
3) CONNECT
사용자가 데이터베이스에 연결하는데 필요한 권한
4) RESOURCE
사용자가 테이블, 시퀀스 등의 리소스를 생성할 수 있는 권한 부여
5) DBA
데이터베이스 관리자 권한 (대빵), 사용자에게 거의 모든 데이터베이스 작업을 수행할 수 있는 권한 부여
2. REVOKE : 권한박탈
- 사용자나 역할에게 특정 데이터베이스에 대한 권한을 박탈하는 명령어
아 젠장 글 쓰다가 야밤에 다 날아가서 갑자기 혈압이오르네요 자러가겟습니다
아뇬ㅇ
자동저장은 고사하고 잘 쓰던 글도 냅다 날려버리는 극악무도한 티스토리를고발합니다ㅅ
20231017 이어서 씀
드디어 ㄷ ㅏ 썼습니다 티스토리 나쁜노 ㅁ진짜...
나에게 광고수익 허용한 것을 후회하게 해주겠어 두고보자