11월, 2018의 게시물 표시

[SQL첫걸음]181117

데이터베이스 객체 테이블, 뷰, 인텍스 등 데이터베이스 내에 정의하는 모든 것을 일컫는 말 이름을 붙일 때 생기는 제약사항 기존 이름이나 예약서와 중복하지 않는다. 숫자로 시작할 수 없다. 언더스코어(_) 이외의 기호를 사용할 수 없다. 한글을 사용할 때는 더블쿼트(")로 둘러싼다. cf. MySQL에서는 백쿼트(`) 시스템이 허용하는 길이를 초과하지 않는다. 데이터베이스 객체는 스키마라는 그릇안에서 만들어진다. 스키마 데이터베이스의 구조와 제약조건에 대한 전반적인 명세를 기술 한 것 (설계도 개념) 데이터베이스를 구성하는 개체, 속성, 관계 및 데이터 조작 시 값들이 갖는 전반적인 조건을 정의한 것 외부스키마, 개념스키마, 내부스키마로 나뉘어짐 테이블 작성.삭제.변경 DML(Data Manipulation Language)는 데이터를 조작하는 명령 SELECT, INSERT, DELETE, UPDATE 등 DDL(Data Definition Language)는 데이터 정의하는 명령 스키마 내의 객체를 관리할 때 사용 CREATE, DROP, ALTER 등 CREATE 테이블, 뷰 등 우언하는 객체를 생성할 때 이용하는 명령 CREATE TABLE 테이블명 (   열 정의1,   열 정의2,   ... ) 열 정의란? 열의 이름, 자료형, 기본값, NULL허용 여부등의 정보 열이름 자료형 [DEFAULT 기본값] [NULL|NOT NULL] DROP 테이블 삭제할 때 이용. 실수하지 않도록 주의 DROP TABLE 테이블명 cf. DELETE 명령에 WHERE 조건을 지정하지 않으면 테이블 전체의 행을 삭제한다. 테이블 정의는 유지된다. (DROP은 테이블 자체를 없애버림) 그러나 행이 많으면 DELETE는 느림. 이때 TRUNCATE 명령을 이용할 수 있다. TRUNCATE는 모든 행의 데이터를 날린다. (조건 지정 불가) ALT...

[SQL첫걸음]181112

서브쿼리 SQL문장의 하부절에 쿼리를 사용하는 것 괄호로 묶어서 지정한다. 서브쿼리의 패턴 하나의 값을 반환하는 패턴 >> '스칼라 서브쿼리'라고 부른다. 복수의 행이 반환되지만 열은 하나인 패턴 하나의 행이 반환되지만 열이 복수인 패턴 복수의 행, 복수의 열이 반환되는 패턴 스칼라 값을 반환하는 SELECT명령을 특별 취급하는 이유는 서브쿼리로서 사용하기 쉽기 때문이다. 스칼라 서브쿼리는 WHERE 구에서 '=' 연산자로 비교할 수 있다. SELECT, SET, FROM, INSERT 등 다양한 구에서 서브쿼리를 사용할 수 있다. EXISTS 두 개의 테이블에서 같은 값을 가진 컬럼끼리 활용하여 한 테이블 내에서 조건을 걸 수 있다. EXISTS (SELECT 명령) UPDATE sample511 SET a = '있음' WHERE   EXISTS (SELECT * FROM sample 552 WHERE no2 = no); sample552이 no2열을 가지고 있고 열값은 숫자이다. no2의 각행의 값과 sample511 no열에 값을 비교해 같은 경우 a열의 값을 '있음'으로 변경(UPDATE)한다. NOT EXISTS을 이용해 참이 아닌 경우에 대한 조건을 줄 수 있다. EXISTS는 UPDATE(부모)와 관계가 있는 상관 서브쿼리이다. 일반 서브쿼리와 다르게 독립해서 쓸 수 없다. SELECT * FROM sample552 WHERE no2 = no; 는 오류 발생 >> 따로쓰면 no가 불명확 열명이 동일한 경우 앞에 테이블 이름을 붙여 구분할 수 있다. sample511, sample522에 no라는 동일한 열이 있다면 그냥 no = no으로 쓰면 오류가 난다. 이런 경우 sample511.no = sample522.no 이와 같이 작성해야 한다. IN 조건의 범위를 지정하는 데 사용된다....

[SQL첫걸음]181108

COUNT 행 개수를 구할 때 사용한다. 집계함수: 일반적으로 함수는 인수로 하나의 값을 지정하는데 집계함수는 인수로 집합을 지정 COUNT(열명 or 식) WHERE 구랑 같이 사용하는 것도 가능하다. SELECT COUNT(*) FROM sample51 WHERE name = 'A'; *는 모든 열을 뜻한다. NULL값은 카운트 되지 않는다. (모든 집계함수 동일) 특정열의 행에 NULL이 있으면 NULL을 뺀 나머지 숫자를 반환한다. *로 하면 NULL이 없는 열이 있다면 없는 열을 기준으로 값이 출력된다. DISTINCT 중복 된 값을 제외하고 출력한다. (집계함수) SELECT DISTINCT 열이름 FROM 테이블이름; 예약어로 콤마를 붙이지 않는다. COUNT와 같이 사용해 열에서 유니크한 값이 몇 개 있는지 구할 수 있다. SELECT COUNT(DISTINCT name) FROM sample51; SUM, AVG, MIN, MAX 집계함수, NULL 값 무시 SUM, AVG 수치형만 계산 / MIN, MAX 수치형, 문자열형, 날짜시간형 모두 가능 AVG에서 NULL값은 무시가 되기 때문에 NULL을 0으로 두고 계산하고 싶으면 CASE로 변환 후 계산해야 한다. (평균 구할 때 분모가 달라짐) GROUP BY 그룹화 할 때 이용하는 구문 SELECT * FROM 테이블명 GROUP BY 열1, 열2, ... 지정한 열명을 기준으로 그룹이 생겨난다. 지정 된 열의 값이 같은 행은 하나의 그룹으로 묶인다. (중복이 제거 된다.) 집계함수는 WHERE구의 조건식에서는 사용할 수 없다. 내부순서 처리 때문 (WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY) HAVING구를 이용해 조건을 걸어야 한다. HAVING과 WHERE모두 조건절 이지만 HAVING은 그룹화 된 곳...

[SQL첫걸음]181106

CASE 특정 조건에 맞을 때 정해진 규칙으로 처리할 때 이용 CASE WHEN 조건식1 THEN 식1   [WHEN 조건식2 THEN 식2 ...]   [ELSE 식3] END WHEN 뒤에 참, 거짓을 반환하는 조건식을 기술 참이 되는 경우 THEN 뒤의 식이 처리 WHEN과 THEN을 여러개 작성할 수도 있음. 이 경우 가장 먼저 만족하는 WHEN 뒤의 THEN이 처리 됨 어떤 조건도 만족하지 못한 경우 ELSE로 처리 됨. 생략도 가능하지만 명확히 지정해주는 게 보기 좋다. 생락하면 NULL 이 된다. SELECT a, CASE WHEN a IS NULL THEN 0 ELSE a END "a(null=0)" FROM sample37; a열 값 중 NULL값을 0으로 바꾸고 a(null=0)이라는 열에 표시하는 쿼리 COALESCE 함수를 이용해서도 NULL값을 변환할 수 있다. SELECT a, COALESCE(a, 0) FROM sample37; 인수도 여러개 지정할 수 있다. 가장 먼저 지정 된 인수의 값을 반환 인코드: 정보를 코드(수치데이터)로 바꾸는 작업 ex. 남/여를 1/2로 저장하자. 디코드: 코드(수치데이터)를 정보로 바꾸는 작업 ex. 1/2을 남/여로 표시하자. CASE는 '검색CASE'와 '단순CASE'로 구분된다. 검색CASE: CASE WHEN 조건식 THEN 식 / 앞에 소개한 CASE 단순CASE: CASE 식 WHEN 식 THEN 식 CASE 식1 WHEN 식2 THEN 식3   [WHEN 식4 THEN 식5 ...]   [ELSE 식6] END 식1의 값이 WHEN의 식2의 값과 동일한지 비교하고 같으면 식3을 결과값으로 비교예시: a열 값이 1이면 남자, 2이면 여자, 그외는 미지정으로 '성별'열에 출력 검색CASE SELECT a AS "코드", CASE   WHEN a=1 T...

[SQL첫걸음]181105

수치 연산 기본적인 연산은 sql에서 바로 할 수 있다. SELECT price * quantity FROM sample34; sample34에 있는 price와 quantity 칼럼을 곱한 결과값을 출력해라 AS를 붙이면 칼럼의 이름을 바꿀 수 있다. (별명지정) / AS는 생략도 가능하다 SELECT price * quantity AS amount FROM sample34; price * quantity 가 아닌 amount 열로 이름이 지정돼서 출력 WHERE에서도 연산을 이용할 수 있다. SELECT price * quantity FROM sample34   WHERE price * quantity >= 2000; price * quantity 가 2000이상인 행을 출력한다. 서버에서 처리 되는 순서를 알아야한다. WHERE가 SELECT보다 먼저 처리된다. 이에 SELECT에서 AS로 별명을 지어도 WHERE에서는 사용할 수 없다. SELECT price * quantity AS amount FROM sample34   WHERE amount >= 2000;  (x) ORDER BY는 SELECT보다 나중에 처리 되기 때문에 별명을 사용할 수 있다. SELECT price * quantity AS amount FROM sample34   ORDER BY amount DESC; NULL과 연산하면 결과는 NULL이 된다. 함수를 이용해 연산 할 수도 있다. 함수명(인수1, 인수2....) / 다양한 함수가 존재한다. ROUND(값, 반올림할 자리) SELECT amount, ROUND(amount, 1) FROM sample341; amount를 소수점 둘째자리에서 반올림 문자열&날짜 연산 CONCAT 문자열을 결합시켜주는 함수 CONCAT('10', '개') -> '10개' SUBST...

[SQL첫걸음]181103

ORDER BY 검색결과의 행 순서를 정하는 구문 오름차순, 내림차순을 정할 수 있다. 생략하면 오름차순 정렬 내림차순 ORDER BY 열명 DESC 오름차순 ORDER BY 열명 ASC 문자열 데이터의 대소관계는 사전식 순서에 의해 결정된다. 문자열형 열에 숫자 데이터가 입력 된 경우에는 숫자의 대소관계가 아닌 문자열의 대소관계를 따른다. EX. 1, 2, 10, 11 숫자가 문자열형 열에 입력 돼 있을 때 오름차순 정렬을 하면? >> 1, 10, 11, 2 순서로 정렬 됨 복수 열을 지정할 수 있다. ORDER BY a, b; >> a로 오름차순 정렬 후 b로 오름차순 정렬 ORDER BY b, a; >> b로 오름차순 정렬 후 a로 오름차순 정렬 열 별로 정렬 방법을 지정할 수 있다. ORDER BY a DESC b ASC; >> a로 내림차순 정렬 후 b로 오름차순 정렬 MYSQL에서 NULL 값은 가장 작은 값으로 취급해 ASC에서는 가장 먼저, DESC에서는 가장 나중 (제품마다 차이가 있다.) LIMIT 반환되는 행의 개수를 제한할 수 있다. 표준 SQL은 아니다. MYSQL에서 쓸 수 있다. SELECT * FROM sample33 LIMIT 3; sample33 테이블의 상위 3개의 데이터만 출력 OFFSET을 이용해서 원하는 행부터 출력할 수 있다. OFFSET은 0부터 시작되므로 '시작할 행 - 1'로 기억해둔다. SELECT * FROM sample33 LIMIT 3 OFFSET 3; 4번째 행부터 3개 행을 출력한다.