SQL이란? (2/3)

jungnoeun·2021년 7월 17일
0

bc

목록 보기
3/7

DML

  • Data Manipulation Language
  • 데이터를 조작하기 위해 사용한다.
  • insert(등록), delete(삭제), update(수정), select(검색) 등이 해당한다.






SELECT

select 구문의 기본문형

select (distinct) 칼럼명 (ALIAS) 
FROM 테이블명;
  • select: 검색하고자 하는 데이터(칼럼)을 열람한다.
  • distinct: 중복행을 제거한다.
  • ALIAS: 해당 칼럼에 대한 다른 이름을 부여한다.
  • from: 선택한 칼럼이 있는 테이블을 명시한다. 즉, 해당 칼럼이 어느 테이블 소속인지를 명시한다.



전체 데이터 검색(열람)

  • select 뒤에 *을 써서 나타낸다.
mysql> select * from department;

-> department 테이블의 모든 데이터를 출력한다.


  • 만약, 특정 컬럼만 보고 싶다면 *대신에 칼럼명을 나열한다.
mysql> select deptno from department;

-> department 테이블에서 deptno칼럼을 나열하겠다.


  • 여러개의 특정 컬럼을 보고 싶다면 ,을 이용해 칼럼명을 나열한다.
mysql> select deptno,name from department;

-> department 테이블에서 deptno와 name 칼럼을 나열하겠다.




-> 이러한 칼럼명들은 desc table명; 와 같은 쿼리를 통해서 해당 테이블에 어떤 칼럼이 있는지 알 수 있다.









컬럼에 Alias 부여

  • select에서 ,다음은 다음 칼럼을 찾기 때문에 Alias를 매칭할 때는 ,를 쓰지 않는다.

  • 칼럼에 대한 Alias(별칭)를 부여해서 나타나는 칼럼의 Heading을 바꿀 수 있다.

mysql> select empno as 사번, name as 이름, job as 직업 from employee;

-> employee 테이블에서 직원의 사번, 이름, 직업을 출력하여라.
그럼 empno라고 나왔던 자리에 사번이라는 이름이 들어간다. 나머지도 마찬가지이다.
또한, as를 생략하고 띄어쓰기로 Alias를 지정할 수 있다.

mysql> select empno 사번, name 이름,job 직업 from employee;

-> 바로 위의 명령어와 같다.









컬럼의 합성(concatenation)

  • 문자열 결합함수 concat를 사용한다.
mysql>select concat(empno,'-',deptno) as '사번-부서번호' 
from employee;

-> employee 테이블에서 사번과 부서번호를 하나의 칼럼으로 출력

단, 이때 Alias에 공백이 있을 때 반드시 ''으로 감싸줘야 한다.
as를 사용하지 않는 경우, 공백이 나오면 Alias라고 인식을 하고, 다시 공백이 나오면 from이 나올것이라고 기대한다. 근데 from이 아니면 에러를 발생시킨다.









중복행의 제거(distinct)

  • 중복되는 행이 출력될 경우, distinct 키워드로 중복행을 제거한다.
mysql> select deptno from employee;

-> 사원 테이블의 모든 부서번호를 출력한다. (사원수만큼 출력된다.)

mysql> select distinct deptno from employee;

-> 사원테이블의 부서번호를 중복되지 않게 출력한다.








정렬하기

  • order by 절 (칼럼 또는 표현식)
select (distinct) 칼럼명 (Alias)
from 테이블명
order by 칼럼이나 표현식 (asc 또는 desc)
  • asc: 오름차순 정렬, 기본값
  • desc: 내림차순
mysql> select empno, name from employee order by name;

-> 나는 이름을 기준으로 정렬하고 싶다.
위처럼 오름차순, 내림차순을 설정하지 않은 경우, 기본적으로 오름차수능로 정렬된다.
내림차순으로 정렬하고 싶은 경우,

mysql> select empno, name from employee order by name desc;

-> 나는 이름을 기준으로 내림차순으로 정렬하고 싶다.

mysql> select empno, name from employee order by 2 desc;

-> 나는 두번째 칼럼을 기준으로 내림차순으로 정렬하고 싶다.
즉, 이름의 내림차순 정렬이 되는 것이다.









특정 행 검색 (where절)

  • select절을 사용하는 이유가 원하는 조건을 가진 값을 찾아오고 싶어하는 것이다. 이때 where절을 사용하면 조건을 부여할 수 있다.
    where 형식 연산자 값
select (distinct) 칼럼명 (ALias)
from 테이블명
where 조건식
order by 칼럼이나 조건식 (asc 또는 desc)

조건식: 칼럼의 이름이나 표현식의 상수, 연산자로 구성됨

예) where title = 'staff': title이 staff인 애 찾아라
where salary between 1000 and 2000: 월급이 1000~2000인애만 보여줘라



  • 산술비교 연산자
mysql> select name, hiredate from employee where hiredate <'1981-01-01';

-> employee 테이블에서 hiredate(고용일)이 1981년 이전인 사원의 이름과 고용일을 보여달라.


  • 논리연산자
mysql> select name, deptno from employee where deptno = 30;

-> employee 테이블에서 deptno(부서번호)가 30인 사원의 이름과 부서번호를 보여줘라.

mysql> select name, deptno from employee where deptno = 10 or deptno = 10;

-> employee 테이블에서 부서번호가 10이거나 30인 직원의 이름과 부서번호를 보여줘라.

마찬가지로 and,or,not도 가능하다.


  • IN 키워드
mysql> select name, deptno from employee where deptno in (10,30);

-> employee 테이블에서 deptno(부서번호)가 10이거나 30인 직원의 이름과 부서번호를 보여줘라.


  • LIKE 키워드
    : 와일드 카드를 이용하여 특정문자를 포함한 값에 대한 조건을 처리한다.
    - % : 0에서부터 여러개의 문자열을 나타낸다.
    - _ : 단하나의 문자를 나타내는 와일드카드
select name, deptno from employee where name like '%A%';

-> employee 테이블에서 이름에 A가 포함된 사원의 이름과 부서번호를 보여줘라.

  • like 표기
    • A% : A로 시작하는
    • %A : A로 끝나는
    • %A% : A가 들어가는
    • _A% : 두번째가 A인
      -> mysql은 1부터 수를 센다.









함수의 사용

UCASE, UPPER

mysql> select upper('Seoul'), ucase('SEOul');

-> 다 대문자로 바꿔줘라.

  • from 테이블이 없는 이유: 오라클db의 경우 해당 테이블에 있는 값이 아니라 할지라도 반드시 테이블이 존재해야 하기 때문에, from절 다음이 반드시 있어야 해서 DUAL이라는 임시 테이블을 하나 놓고 반드시 from dual하고 써주기도 한다. 하지만 MySQL은 위처럼 아예없이 조회가 가능하다.




LCASE, LOWER

mysql> select lower('SEOUL'), lcase('SeOul');

-> 전부 소문자로 바꿔줘라.

select lower(name) from employee;

-> employee 테이블에 있는 모든 직원의 이름을 소문자로 출력해라.




substring

mysql> select substring('Happy Day',3,2);

-> 해당 문장의 3번째부터 2개의 문자를 출력해라. 결과는 pp가 나온다.
위에서 말했듯이 MySQL은 처음 인덱스가 1부터 시작하기 때문이다.



LPAD, RPAD

  • 출력해야 하는데 공백이 존재할 때 왼쪽(또는 오른쪽)에 내가 지정한 문자를 채워준다.
mysql> select LPAD('hi',5,'?'), RPAD('joe',7,'*');

-> 결과는 ???hi****joe가 나온다.
위는 hi를 5자리로 출력하는데 생기는 빈공간만큼 왼쪽에 ?을 넣어 출력하라는 것이고, 마찬가지로 joe를 7자리로 출력하는데 생기는 공백만큼 *를 넣어서 출력하라는 뜻이다.




TRIM, RTRIM, LTRIM

  • 공백을 없애준다.
select TRIM(' Hi ');
select RTRIM(' Hi '), LTRIM(' Hi ');

-> 차례대로 앞뒤의 공백, 왼쪽의 공백, 오른쪽의 공백을 없애주는 함수이다.
결과는 HI , ''Hi, Hi''가 나온다.




절대값 구하기 (ABS(x))

  • ABS(x) : x의 절댓값을 구한다.
mysql> select abs(-2), abs(2);

-> 결과는 2 2가 나온다.










이외에도..

  • MOD(n,m) % : n을 m으로 나눈 나머지 값을 출력합니다.
  • FLOOR(x) : x보다 크지 않은 가장 큰 정수를 반환합니다. BIGINT로 자동 변환합니다.
  • CEILING(x) : x보다 작지 않은 가장 작은 정수를 반환합니다.
  • ROUND(x) : x에 가장 근접한 정수를 반환합니다.
  • POW(x,y) POWER(x,y) : x의 y 제곱 승을 반환합니다.
  • GREATEST(x,y,...) : 가장 큰 값을 반환합니다.
  • LEAST(x,y,...) : 가장 작은 값을 반환합니다.
  • CURDATE(),CURRENT_DATE : 오늘 날짜를 YYYY-MM-DD나 YYYYMMDD 형식으로 반환합니다.
  • CURTIME(), CURRENT_TIME : 현재 시각을 HH:MM:SS나 HHMMSS 형식으로 반환합니다.
  • NOW(), SYSDATE() , CURRENT_TIMESTAMP : 오늘 현시각을 YYYY-MM-DD HH:MM:SS나 YYYYMMDDHHMMSS 형식으로 반환합니다.
  • DATE_FORMAT(date,format) : 입력된 date를 format 형식으로 반환합니다.
  • PERIOD_DIFF(p1,p2) : YYMM이나 YYYYMM으로 표기되는 p1과 p2의 차이 개월을 반환합니다.
profile
개발자

0개의 댓글