목차
목차1. sql이란2. sql 기본구조3. 테이블 만들기4. 기존 그래프를 가져와서 테이블 만들기5. 데이터 입력하기6. 평균, 분산, 간단한 숫자 세기7. 새 칼럼 이름 부여8. AND와 OR9. 데이터 정렬10. 그룹별로 연산
1. sql이란
데이터베이스 관리 시스템에서 데이터를 관리하기 위해 사용하는 프로그래밍 언어입니다.
2. sql 기본구조
sql 기본 구조
proc sql; /*SQL 문장*/ quit;
sql 기본 구조
PROC SQL; CREATE TABLE AS SELECT FROM WHERE GROUP BY HAVING ORDER BY
주의사항 : WHERE 과 GROUP BY 의 순서가 뒤바뀐다면 에러가 나게 됩니다.
3. 테이블 만들기
PROC SQL; CREATE TABLE 데이터셋 (변수명 CHAR(12) ,변수명 NUM ) ; QUIT;
PROC SQL; CREATE TABLE mysas.table2 (NAME CHAR(12) ,AGE NUM ,HEIGHT NUM ,WEIGHT NUM ,ADDR CHAR) ; QUIT;

4. 기존 그래프를 가져와서 테이블 만들기
PROC SQL; CREATE TABLE 테이블 AS SELECT 변수, 변수, 변수 FROM 기존 테이터셋 ; QUIT;
PROC SQL; CREATE TABLE mysas.table1 AS SELECT id, name, class_ FROM mysas.subject_test1_1 ; QUIT;

5. 데이터 입력하기
TABLE2를 가져와 새로운 데이터를 입력하도록 하겠습니다.
1) 매 행마다 입력할 칼럼명을 지정합니다.
PROC SQL; INSERT INTO 데이터셋 SET 변수명=값, 변수명=값 ; QUIT;
proc sql; insert into mysas.table2 set NAME='홍길동', AGE=20, HEIGHT=180, WEIGHT=70, ADDR='JEJU' ; quit; proc print data=mysas.table2; run;

데이터를 입력할 칼럼을 지정하지 않으므로, 칼럼수만큼 데이터가 없을 경우 에러가 발생하게 됩니다.
2) 누락값이 있더라도 VALUE명령어를 사용하여 입력하는 방법입니다.
INSERT INTO TEST (XXX,YYY,ZZZ) VALUE(‘AAA’,‘BBB’,111);
proc sql; insert into mysas.table2(NAME, AGE, ADDR) values('김길순', 55 ,'SEOUL') ; run; proc print data=mysas.table2; run;

사칙연산 사용하는 방법입니다.
PROC SQL; CREATE TABLE 테이블 AS SELECT 변수, 변수+변수 FROM 기존 테이터셋 ; QUIT;
proc sql; create table mysas.table3 as select NAME, HEIGHT / WEIGHT from mysas.table2 ; quit; PROC PRINT DATA=mysas.table3; run;

+(더하기), -(뺄셈), *(곱하기), /(나누기)
사칙연산
을 이용하실 수 있습니다.6. 평균, 분산, 간단한 숫자 세기
SELECT SUM(변수), SUM(변수1,변수2), MEAN(변수), MIDIAN(변수), MIN(변수), MAX(변수), VAR(변수), STD(변수), COUNT(변수), COUNT(변수1,변수2)
SUM(XXX,YYY)
: 칼럼XXX와 YYY의 값을 모두 더하는 것입니다.
MEAN(XXX)
: 칼럼XXX의 평균값을 구합니다.
MIDIAN(XXX)
: 칼럼XXX의 중앙값을 구합니다.
MIN(XXX)
: 칼럼XXX에서 가장 작은 값을 구합니다.
MAX(XXX)
: 칼럼XXX에서 가장 큰 값을 구합니다.
VAR(XXX)
: 칼럼XXX의 분산을 구합니다.
STD(XXX)
: 칼럼XXX의 표준편차를 구합니다.
proc sql; create table mysas.table3 as select NAME, sum(HEIGHT,WEIGHT) from mysas.table2 ; quit; PROC PRINT DATA=mysas.table3; run;

다음으로
SUM(HEIGHT,WEIGHT)
을 보겠습니다. 칼럼 TEMA001이 생성됐습니다. 각 행에서 칼럼HEIGHT와 칼럼WEIGHT를 더합니다. 그래서 각각의 행이 값이 다릅니다. 다만 특이점이 우리는 분명 SELECT명령어에서 변수HEIGHT와 WEIGHT를 선택하지 않았다는 점입니다.여기서 SQL명령어의 특징을 볼 수 있습니다.
우리가 SELECT로 칼럼WEIGHT을 표현하지 않더라도, FROM 테이블에 칼럼WEIGHT가 있을 경우, SQL은 이를 인식하고 계산합니다.
SELECT명령어는 칼럼을 표현할지 말지를 결정하는 역할만을 하는 셈입니다.
7. 새 칼럼 이름 부여
PROC SQL; CREATE TABLE TEST AS SELECT 변수명, 기존변수명 AS 새로운변수명 FROM SASHELP.CLASS ; QUIT;
PROC SQL; CREATE TABLE mysas.table4 AS SELECT NAME, _TEMA001 AS HW FROM mysas.table3 ; QUIT;

특정 데이터 추출하는 방법입니다.
PROC SQL; CREATE TABLE mysas.table5 AS SELECT NAME, AGE, ADDR FROM mysas.table2 WHERE AGE=20 ; QUIT;

8. AND와 OR
PROC SQL; CREATE TABLE mysas.table6 AS SELECT NAME, AGE, HEIGHT FROM mysas.table2 WHERE AGE=20 AND ADDR='JEJU' ; QUIT;

9. 데이터 정렬
PROC SQL; CREATE TABLE mysas.table7 AS SELECT * FROM mysas.subject_test1 ORDER BY score ; QUIT;

오름차순으로 정렬된 것을 확인할 수 있습니다.
ORDER BY
구문을 통해서 정렬을 할 때 칼럼AGE만 바뀌는 게 아니라 전체 칼럼
이 모두 함께 이동합니다.내림차순
으로 정렬을 하려면 ‘ORDER BY AGE DESC'
를 사용합니다.`PROC SQL; CREATE TABLE mysas.table7 AS SELECT * FROM mysas.subject_test1 ORDER BY score desc ; QUIT;

여러 개 칼럼을 동시에 정렬하는 방법입니다.
' , '
를 사용하여 변수를 구분해줍니다.ORDER BY name, score: name를 정렬하고, name별로 score을 정렬합니다.
10. 그룹별로 연산
클래스를 그룹으로 묶에 반별로 score 점수를 내고 변수명은 sum_score으로 지정해 주었습니다.
PROC SQL; CREATE TABLE mysas.table9 AS SELECT *, SUM(score) AS sum_score FROM mysas.subject_test1 GROUP BY class_ ; QUIT;

그룹별 특정 데이터 추출하는 방법입니다.
PROC SQL; CREATE TABLE mysas.table10 AS SELECT *, SUM(score) AS sum_score FROM mysas.subject_test1 GROUP BY class_ HAVING sum_score>=175 ; QUIT;
GROUP BY
: 명령어로 생성된 값에서 특정 조건을 만족하는 행만을 추출합니다.
만약 GROUP BY명령어 다음에 WHERE명령어를 쓸 경우 에러가 발생합니다.
그렇다고 GROUP BY명령어 앞쪽에 WHERE명령어를 사용하는 경우에도 에러가 발생합니다.
WHERE sum_score >= 175 GROUP BY class_
GROUP BY명령어 다음에는 반드시
HAVING
명령어가 나와야 하기 때문입니다. 이는 SAS SQL의 문법규칙입니다.왜냐하면 sum_score는 기존 테이블에는 존재하지 않는 데이터이기 때문입니다.
sum_score는 SQL명령어에 의해서 생성됐습니다.
WHERE 명령어는 SQL명령어에 의해 새로 생성된 칼럼은 고려하지 않습니다.
오직 FROM으로 불러온 테이블에 sum_score가 존재하는지 확인합니다.
테이블에 sum_score가 없으므로 해당 명령어는 에러가 발생하게 됩니다.
만약 이를 에러없이 수행하고 싶다면 아래와 같이 Group By 절 다음 Having 절을 사용하여 조건을 지정해야 합니다.
GROUP BY class_ HAVING sum_score >=175
HAVING명령어는 SQL명령어에 의해 생성되고 계산된 후의 모든 칼럼을 대상으로 명령을 수행하기 때문입니다.
이렇게 해서 sas를 이용한 sql문을 마치도록 하겠습니다. 다른 sql문도 sql 기본구조 안에 넣으면 활용할 수 있습니다.