본문 바로가기
Programming/SQL

[SQL] 문법 정리

by 그렉그의 2023. 5. 24.
1. 관계형 DB(RDB)  
관계형 DB(RDB)  
- 정형화 되어있고, oracle mysql, maria db 등등이 있음                                                                          - 2차원 테이블 형태로 데이터를 관리함 비정형, mongoDB, {key: value} 형식임
DBMS 독립적: ANS1 SQL  
DQL, DML+TCL, DDL  
2. Data 종류  
수치: 정수, 실수  
문자  
날짜: ‘A’, ‘ABC’, char (byte): 고정, 최대 2000 byte, varchar2(byte): 가변, 최대 4000 byte  
3. DQL  
projection: 컬럼 선택 (select 컬럼명 선택)  
selection:  선택(where )  
join: 연결하는  foreign key(참조키)  
4. Selection   
select *, 컬럼명(쉼표), 연산, 연결(|| or concat)
from  
where   
여러개 선택 in(, 2, 3)
비슷한  검색 - like( %: 0  이상 문자 치환)
- _: 반드시 한개와 치환
5. null   
연산  null 반환  nvl(컬럼, 대체 )
6. 제약조건  
table data  무결성 보장  
primary key  자동으로 index 생성 
중복되는 이름이 아닌 유니크한 key 찾음 
unique null 허용(자동으로 Index 생성)
not null 제약조건을 변경하는 문법
check 비즈니스 규정
foreign key  참조용
1. 함수  
문자 길이, 첫글자, 대문자, 공백제거, 채우기, 치환,
날짜  DBMS 의존적인 함수 
- 남은 개월 연산 
- 현재 날짜
수치 반올림, 절삭

-- 1. 테이블 정보 확인 (oracle에서는 show tab과 같음)

show table status

 

-- 2. 모든 컬럼 보기

select *

from emp

 

-- 3. 보고싶은 컬럼만 select

select deptno, loc

from dept

 

-- 4. 컬럼명 별칭 alias (띄어쓰기해서 as 쓰고 싶을 때는 "부서 번호" 사용),show table status;

 

select deptno, loc as 부서_번호, Loc 위치

from dept

 

-- 5. 연산하기

 

select empno, sal, sal+100

from emp

 

-- 6. 연결하기

 

select concat(ename, sal)

from emp;

 

-- 8. 중복값 제거

-- select distinct 컬럼명,컬럼명 as 별칭, 컬럼 || 컬럼(값),  컬럼 + 100,

-- oracle 에서는 from 절 필수

-- select ~ from 절은 항상 모든 레코드 출력된다. ==> 항상 12개가 나옴

select distinct(job) 

from emp;

 

-- 9. null 값은 연산시 항상 null 이 나옴

-- Null 값은 임의의 값으로 변경해서 연산해야 됨(함수)

-- nvl 함수를 사용시, nvl(컬럼명, 값(null인 경우에 치환할 값))

select empno, sal, comm, (sal*12) +  + nvl(comm, 0) as yearly

from emp

-- 기본적으로 컬럼은 null 값을 갖게 되는데 강제적으로 NULL 값을 허용하지 않을 수 있음

-- 제약조건 type(데이터 무결성을 위함- 데이터를 믿고 사용할 수 있게끔 보장하기 위함): primary key(레코드 식별), unique(유일한 값,null 허용), not null(null 허용 x, 반드시 값을 가져야 하며 record 식별이 가능), check(비즈니스 규칙 정하기), foreign key(참조키: 두개 이상의 테이블을 연결할 때 씀)

-- 컬럼에서 Null 조회 : isNull 연산자 이용, is not null(부정)

-- 정렬(오름차순, 내림차순): 오라클에서는 null을 최댓값으로 처리하게됨

-- not  null  추가 시 Null 허용 방지용 방지

 

-- 10. where 문 사용

select empno, ename, sal

from emp

where sal = 800

 

select empno, ename, sal

from emp

where ename = "ford"

 

 

select empno, ename, sal, Hiredate

from emp

where HIREDATE= "80/12/17"

 

 

-- 범위 찾을 시, between a and b: a와 b가 포함됨

select empno, ename, sal, Hiredate

from emp

where sal between 800 and 1000

 

 

-- 한꺼번에 여러개 지정, 내부적으로 또는 으로 연산됨

select empno, ename, sal

from emp

where sal in (800,1500)

 

 

-- null 값 찾기

select empno, ename, sal, hiredate

from emp

where comm in null;

 

 

-- 비슷한 값 찾기 like + % 또는 

select empno, ename, sal, hiredate

from emp

where ename like 'A%' --A로 시작하는 사원 조회

-- where ename like '%A%' --A를 포함하는 사원 조회

-- where ename like '%A' --S로 끝나는 사원 조회

 

-- 두번째가 A인 사원 조회

select empno, ename, sal, hiredate

from emp

where ename like '_A%' --A로 시작하는 사원 조회

 

-- 문제: 이름이 5글자고 마지막은 N으로 끝나는 사원 조회

select empno, ename, sal, hiredate

from emp

where ename like '____N' -- A로 시작하는 사원 조회, 뒤에 %는 붙지 않음 왜냐하면 뒤에 글자는 없기 때문. 

 

-- 논리 연산자: and, or, not

select empno, ename, sal, hiredate

from emp

where job = 'salesman' and sal >= 1500

 

select empno, ename, sal, hiredate

from emp

where job = 'salesman' or sal >= 1500

 

-- not in 부정 포함

SELECT empno, ename, sal

from EMP

where NOT ename = 'FORD';

 

SELECT empno, ename, sal, hiredate

from EMP

where ename IN ('SMITH','FORD');

 

SELECT empno, ename, sal, hiredate

from EMP

where not ename IN ('SMITH','FORD');

 

-- 정렬(기본적으로 오름차순임)

SELECT empno, ename, sal, hiredate

from EMP

order by sal desc

 

-- order by의 뒤에 올 수 있는 것 중 3가지가 있음 1. as

SELECT empno, ename, sal, hiredate as salary, hiredate

from EMP

order by sal desc

 

-- order by 컬럼명

SELECT empno, ename, sal as salary, hiredate

from EMP

order by salary -- 컬럼명 써도 가능함

 

-- order by 컬럼순서

SELECT empno, ename, sal as salary, hiredate

from EMP

order by 3 -- 컬럼명 써도 가능함

 

 

-- 4. 다중 정렬 : ordery by 컬럼명 1, 컬럼명 2

SELECT empno, ename, sal as salary, hiredate -- 컬럼명 1으로 정렬하고 같다면 컬럼 2로 다시 정렬

from EMP

order by salary, hiredate desc 

-- order by 3,4 desc 도 가능함

 

 

 

 

-- 230523

-- 1. 단일행 함수 - 문자관련

-- dual = 더미 테이블, 이때 존재하는 임의의 table 관련 작업이 아닌 경우(연산)에 사용됨(for test용도)

selet lower('MANAGER'), upper('manager') from dual

 

select empno, ename, deptno

from emp

where lower(ename) = 'smith'

 

-- 2. 문자열 연결 

select concat('oracle','server') from dual

 

-- 3. 문자열 끼우기 

select lpad('miller',10), rpad('miller',10) from dual

select lpad('miller',10,'*') from dual

select ename, lpad(ename, 15, '*') from emp

 

-- 4. 부분열 반환 

Select substr('000101-3234232',8,2) from dual -- 8번째에서 2개 내놔 

 

-- 5. 문자열 길이 

select length('000101-3234232')

 

-- 6. 함수 중첩

select length(substr('00101-3234232',8))

 

-- 7. 문자열 치환 (마지막에 변경 문자를 안 주면 공백으로 지정)

select replace('JACK and JUE','J','BL')

 

-- 8. 특정 문자의 위치 반환(특정 문자의 위치 반환)

select instr('miller','l')

 

-- 9. 공백 제거  (특정 문자는 제거 불가함)

select ltrim(' millerm ')

select rtrim(' millerm ')

 

select trim(leading 1 from 111123456111) -- 앞에 1

select trim(trailing 1 from 1111234451111) -- 뒤에 1

select trim(both 1 from 1112341111)

 

 

select '891202-1234567' from dual;

select replace('891202-1234567', '234567', '******')

select replace('891202-1234567',1,8,'*')

 

select rpad('891202-1234567',8,'*')

 

-- 10. 올림 값

select ceil(10.1) 

-- 내림값

select floor(10.1)

-- 나머지 구하기

select mod(10,3)

 

select round(456.66)

select round(456.66,-2) 0.1 -- 기준으로 왼쪽 값 500

 

-- 11. 절삭

select truncate(456.789,-2) -- 400

select truncate(456.889, 0) -- 456

 

-- 12. 부호 식별(양수면 1, 음수면 -1, 0이면 0)

select sign(100), sign(-10), sign(0) 

 

-- 13. 현재 날짜 구하기 

select sysdate()

 

select SYSDATE(), NOW() from DUAL;

SELECT CURDATE(),  CURRENT_DATE(),  CURRENT_DATE FROM DUAL;

SELECT CURTIME(),  CURRENT_TIME(),  CURRENT_TIME FROM DUAL;

 

-- 14. 두 날짜 사이의 일수 계산 

select datediff('2023-01-04','2022-01-04') 

 

-- 15. 날짜에 날짜 더하기 

select date_add('2008-01-02', interval 1 day) as A1,

date_add('2008-01-02', interval 1 month) as A2,

date_add('2008-01-02', interval 1 year) as A3,

NOW() as B4,

DATE_SUB(NOW(), INTERVAL 10 MINUTE) as B5,

DATE_SUB(NOW(), INTERVAL 2 HOUR) as B6

 

-- 16. 월의 마지막 날 반환

select last_day(sysdate()) from dual

 

-- 17. 날짜에서 특정 정보만 얻기

select now(),

extract(second from now())

 EXTRACT(MINUTE FROM NOW()),

EXTRACT(HOUR FROM NOW()),

EXTRACT(DAY FROM NOW()),

EXTRACT(MONTH FROM NOW()),

EXTRACT(YEAR FROM NOW()),

EXTRACT(YEAR_MONTH FROM NOW())

 

 

-- 18. 변환 함수 문자 -> 숫자

select CAST('100' AS INT )+100

 

select CAST(1000 AS CHAR) -- '1000'

 

-- 19. 문자를 날짜로 변환

select str_to_date('2020-08-08','%Y-%m-%d')

select str_to_date('2020년03월 05일')

 

-- 20. 날짜를 문자로 변환 

select now(),

date_format(now(),'%Y/%m/%d'),

   DATE_FORMAT(NOW(),'%Y/%m/%d'),

       DATE_FORMAT(NOW(),'%Y년 %m월 %d일'),

       DATE_FORMAT(NOW(),'%H:%i:%S'),

DATE_FORMAT(NOW(),'%Y')

 

--  

 

-- 21. case 함수

select empno, ename, sal, job,

case job when 'analyst' then sal*1.1

-- case로 새로운 열 만들때 

end '급여'

from emp

 

 

select empno, ename,

case when sal >=0 and sal<=1000 then 'A'    

end "등급"

from emp

 

select empno, ename, 

       CASE when sal >=0 and sal <=1000 then 'E' 

            when sal >1000 and sal <=2000 then 'D'

            when sal >2000 and sal <=3000 then 'C'

            when sal >3000 and sal <=4000 then 'B'

            when sal >5000 and sal <=5000 then 'A'

      END "등급"

from emp;

 

 

-- 그룹함수

select max(sal), min(sal), sum(sal), avg(sal), count(*)

from emp

 

-- group by 절 

select deptno, sum(sal)

from emp

group by deptno

 

select deptno, sum(sal)

from emp

 

group by deptno

having sum(sal)>8000

 

 

'Programming > SQL' 카테고리의 다른 글

[SQL 정리] DDL  (0) 2023.05.28
[SQL 정리] DML  (0) 2023.05.25
[SQL 정리] 서브쿼리  (0) 2023.05.25
[SQL 정리] 조인  (0) 2023.05.25
[SQL 정리] 함수  (0) 2023.05.25