[Crash Course] SQL(1)

SELECT * FROM sample01 WHERE no=2;
SELECT * FROM sample01 WHERE no <> 2;
    • no열 값이 2가 아닌 행만 검색
    • 연산자를 통해 값이 서로다른 경우 참이 되는 조건식으로 변경
SELECT * FROM sample01 WHERE name = '이효진'
    • 문자열형 상수는  싱글퀴트(‘ ‘)로 표기
SELECT * FROM sample01 WHERE date = '2019-01-21 10:20:43'
    • 날짜시간 형일때도 싱글쿼트(‘ ‘)로 표기, 연월일은  -으로 구분, 시분초는 :로 구분표기

sample02

(1)과 (2) 동일

(1) SELECT * FROM sample02 WHERE a <> 0 AND b <> 0;
(2) SELECT * FROM sample02 WHERE (a=1 OR a=2) AND (b=1 OR b=2);
  • no가 4인 행
  • AND는 OR에 비해 우선 순위가 높다
  • (3) SELECT * FROM sample02 WHERE a=1 OR a=2 AND b=1 OR b=2;  (2)번과 다른 결과 값을 도출한다.
  • (3)의 sql은 SELECT * FROM sample02 WHERE a=1 OR (a=2 AND b=1) OR b=2; 와 같으며, 가로안 조건식부터 검색을 한다.
SELECT * FROM sample02 WHERE NOT (a <> 0 OR b <> 0);

no가 3인 행

LIKE

sample03

SELECT * FROM sample03 WHERE text LIKE %SQL%;

 no가 1,3인 행

SELECT * FROM sample03 WHERE text LIKE SQL%;

no가 1인 행

SELECT * FROM sample03 WHERE text LIKE %SQL;

no가 3인 행

SELECT * FROM sample03 WHERE text LIKE %\_%;

no가 2인 행

SELECT * FROM sample03 WHERE text LIKE 'It''s';

‘를 문자열 상수 안에 포함할 경우는 ‘를 두개 연속해서 기술한다.

    • 더 복잡한 패턴을 매칭할 경우는 정규 표현식을 사용한 편이 낫다.

ORDER BY

SELECT 열명 FROM 테이블명 ORDER BY  열명 DESC

내릴차순으로 정렬
1000 -> 500 -> 100 -> 50 -> 10

SELECT 열명 FROM 테이블명 ORDER BY  열명 ASC

오름차순으로 정렬
10 -> 50 -> 100 -> 500 -> 1000
SELECT명령은 데이터를 검색하는 명령으로ORDER BY는 테이블에 영향을 주지 않습니다.

sample04

NULL값을 가지는 행은 가장 먼저 표시되거나 가장 나중에 표시가 되는데, MYSQL의 경우는 가장 작은 값으로 취급해 ASC(오름차순)일 경우는 맨 앞에,  DESC(내림차순)일 경우는 가장 나중에 표시한다.
SELECT * FROM sample04 ORDER BY a, b;

SELECT * FROM sample04 ORDER BY b, a;
먼저 b열 정렬

SELECT * FROM sample04 ORDER BY a ASC , b DESC;
a열은 ASC(오름차순)로 b열은 DESC(내림차순)로 정렬

LIMIT - 결과 행 수 제한하기 & OFFSET 지정

LIMIT syntax

SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT  행수

OFFSET syntax

SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치
Sample05

OFFSET의 위치지정은  0부터 시작하므로 4부터 시작하여 3개의 데이터를 취득한다.

SELECT * FROM sample05 ORDER BY no DESC LIMIT 3;
Result
SELECT * FROM sample05 LIMIT 3 OFFSET 3;
Result

LIMIT는 표준SQL이 아니다.

    • mysql과 postgreSQL이외의 데이터베이스에서는 사용할수 없다.
    • SQL Server에서는  LIMIT와 비슷한 기능을 하는 TOP를 사용할수 있다.
      SELECT TOP 3 * FROM sample05;
    • Oracle 에서는 ROWNUM이라는 열을 사용해 WHERE구로 조건을 지정하여 행을 제한할수 있다.
      SELECT * FROM sample05 WHERE ROWNUM <=3;

      ROWNUM은 WHERE로 지정하므로 정렬전에 처리되어 LIMIT로 행을 제한 한 경우와 결괏값이 다르다.

수치연산

Sample06
SELECT *, price*quantity AS amount FROM sample06;
SELECT *, price*quantity amount FROM sample06;

한글일 경우 : “”(더블쿼터)

” “ : 더블쿼터로 둘러싸면 명령구문을 분석할 때 데이터베이스 객체의 이름으로 간주한다.
‘ ‘  : 싱글쿼터로 둘러싸는 것은 문자열 상수

SELECT *, price*quantity "금액" FROM sample06
금액을 내림차순으로 정렬
SELECT *, price*quantity AS amount FROM sample06 ORDER BY price* quantity DESC;
* 금액의 별명을 사용해 내림차순으로 정렬하기
SELECT *, price*quantity AS amount FROM sample06 ORDER BY amount DESC;
      • 데이터 객체의 명은 숫자로 시작해서는 안된다.
      • NULL로 연산하면 결과는 NULL이 된다.
함수연산
Sample07
Round 함수 : 반올림 함수
SELECT amount, ROUND(amount) FROM sample07;
소숫점 지정하기 (ex) 소수점 둘째자리에서 반올림하기
SELECT amount, ROUND(amount, 1) FROM sample07
// 출력 : 5961.6, 2138.4, 1080.0
(ex) 10단위로 반올림
SELECT amount, ROUND(amount, -2) FROM sample07
// 5961.60 => 6000

문자열 연산

      • + : SQL Server
      • || : Oracle, DB2, PostgreSQL
      • CONCAT : MySQL
sample08
CONCAT함수 (문자열결합)
SELECT CONCAT(quantity, unit) FROM sample08

// result : 10개, 24캔, 1장
SUBSTRING함수 (문자열의 일부분을 계산해서 반환해주는 함수)
SUBSTRING('20200220001', 1, 4) ;  // 2020
SUBSTRING('20200220001', 5, 2); // 02
TRIM함수(문자열의 앞뒤로 여분의 스페이스가 있을경우 제거해주는 함수)
TRIM('  ABC    '); // 'ABC'
CHARACTER_LENGTH함수(문자열의 길이를 계산해 돌려주는 함수)
      • EUC-KR에서 ASCII문자는 한글은 2바이트용량을 가짐
      • UTF-8에서 ASCII문자는 한글은 3바이트 용량을 가짐

날짜 연산

시스템 날짜 확인하기 SELECT CURRENT_TIMESTAMP; // 2020-02-19 10:10:30
  • CURRENT_TIMESTAMP는 인수가 필요없음.
  • FROM 생략가능하나  오라클과 같은 데이터 베이스에서는 생략불가
날짜의 덧셈과 뺄셈
SELECT CURRENT_DATE + INTERNAL 1 DAY; //2020-01-20 (현재날짜: 2020-01-19)
SELECT DATEDIFF('2020-01-20', '2020-01-05');
 

CASE문으로 데이터 변환하기

Sample09

SELECT a AS  ‘코드’,

CASE
WHEN a=1 THEN '남자'
WHEN a=2 THEN '여자'
WHEN a IS NULL THEN '데이터 없음'
ELSE '미지정'
END AS '성별' FROM sample09;
      • CASE문의 ELSE는 생략하지 않는 편이 낫다.
      • 단순 CASE문으로는 NULL값을 비교할수 없다.
      • NULL값인지 아닌지를 판정하기 위해서는 IS NULL을 사용

INSERT 행추가하기

INSERT INTO sample10(no,a,b) VALUES(3, NULL, NULL);
SELECT * FROM sample10;

INSERT INTO sample10(no) VALUES(3);
SELECT * FROM sample10;
// 비워있는 a, b열에 default값 0이 지정
// 열을 지정하지 않으면 디폴트값으로 행이 추가된다.

DELETE 행삭제하기

DELETE FROM sample10 WHERE no = 3;
SELECT * FROM sample10;

UPDATE 데이터 갱신하기


UPDATE sample10 SET b='2020-01-20' WHERE no = 2;
SELECT * FROM sample10;
    • 셀단위로 업데이트 할수 있다.
    • WHERE구에 조건을 지정하면 그에 일치하는 행을 갱신할 수 있으며, DELETE와 마찬가지로 조건에 맞는 모든 행이 갱신됩니다.