HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📩
캐글 데이터로 살펴보는 데이터분석 With Python and SAS
/
🕹️
5.3.2. proc
/
🕹️
5.3.3. SAS의 SQL
🕹️

5.3.3. SAS의 SQL

목차

목차1. sql이란2. sql 기본구조3. 테이블 만들기4. 기존 그래프를 가져와서 테이블 만들기5. 데이터 입력하기6. 평균, 분산, 간단한 숫자 세기7. 새 칼럼 이름 부여8. AND와 OR9. 데이터 정렬10. 그룹별로 연산

1. sql이란

데이터베이스 관리 시스템에서 데이터를 관리하기 위해 사용하는 프로그래밍 언어입니다.
 

2. sql 기본구조

sql 기본 구조
sql 기본 구조
 
💡
주의사항 : WHERE 과 GROUP BY 의 순서가 뒤바뀐다면 에러가 나게 됩니다.
 

3. 테이블 만들기

 
 
notion image
 

4. 기존 그래프를 가져와서 테이블 만들기

 
 
notion image
 

5. 데이터 입력하기

TABLE2를 가져와 새로운 데이터를 입력하도록 하겠습니다.
1) 매 행마다 입력할 칼럼명을 지정합니다.
 
 
notion image
 
데이터를 입력할 칼럼을 지정하지 않으므로, 칼럼수만큼 데이터가 없을 경우 에러가 발생하게 됩니다.
 
2) 누락값이 있더라도 VALUE명령어를 사용하여 입력하는 방법입니다.
 
 
notion image
 
사칙연산 사용하는 방법입니다.
 
 
notion image
 
+(더하기), -(뺄셈), *(곱하기), /(나누기) 사칙연산을 이용하실 수 있습니다.
 

6. 평균, 분산, 간단한 숫자 세기

  • SUM(XXX,YYY) : 칼럼XXX와 YYY의 값을 모두 더하는 것입니다.
  • MEAN(XXX) : 칼럼XXX의 평균값을 구합니다.
  • MIDIAN(XXX) : 칼럼XXX의 중앙값을 구합니다.
  • MIN(XXX) : 칼럼XXX에서 가장 작은 값을 구합니다.
  • MAX(XXX) : 칼럼XXX에서 가장 큰 값을 구합니다.
  • VAR(XXX) : 칼럼XXX의 분산을 구합니다.
  • STD(XXX) : 칼럼XXX의 표준편차를 구합니다.
 
 
notion image
 
다음으로 SUM(HEIGHT,WEIGHT)을 보겠습니다. 칼럼 TEMA001이 생성됐습니다. 각 행에서 칼럼HEIGHT와 칼럼WEIGHT를 더합니다. 그래서 각각의 행이 값이 다릅니다. 다만 특이점이 우리는 분명 SELECT명령어에서 변수HEIGHT와 WEIGHT를 선택하지 않았다는 점입니다.
여기서 SQL명령어의 특징을 볼 수 있습니다.
우리가 SELECT로 칼럼WEIGHT을 표현하지 않더라도, FROM 테이블에 칼럼WEIGHT가 있을 경우, SQL은 이를 인식하고 계산합니다.
SELECT명령어는 칼럼을 표현할지 말지를 결정하는 역할만을 하는 셈입니다.
 

7. 새 칼럼 이름 부여

 
 
notion image
 
 
특정 데이터 추출하는 방법입니다.
 
notion image
 

8. AND와 OR

 
notion image
 

9. 데이터 정렬

 
notion image
 
오름차순으로 정렬된 것을 확인할 수 있습니다. ORDER BY 구문을 통해서 정렬을 할 때 칼럼AGE만 바뀌는 게 아니라 전체 칼럼이 모두 함께 이동합니다.
 
내림차순으로 정렬을 하려면 ‘ORDER BY AGE DESC'를 사용합니다.`
 
notion image
 
여러 개 칼럼을 동시에 정렬하는 방법입니다. ' , '를 사용하여 변수를 구분해줍니다.
 

10. 그룹별로 연산

클래스를 그룹으로 묶에 반별로 score 점수를 내고 변수명은 sum_score으로 지정해 주었습니다.
 
notion image
 
그룹별 특정 데이터 추출하는 방법입니다.
GROUP BY : 명령어로 생성된 값에서 특정 조건을 만족하는 행만을 추출합니다.
 
notion image
 
만약 GROUP BY명령어 다음에 WHERE명령어를 쓸 경우 에러가 발생합니다.
그렇다고 GROUP BY명령어 앞쪽에 WHERE명령어를 사용하는 경우에도 에러가 발생합니다.
 
 
GROUP BY명령어 다음에는 반드시 HAVING명령어가 나와야 하기 때문입니다. 이는 SAS SQL의 문법규칙입니다.
 
왜냐하면 sum_score는 기존 테이블에는 존재하지 않는 데이터이기 때문입니다.
sum_score는 SQL명령어에 의해서 생성됐습니다.
WHERE 명령어는 SQL명령어에 의해 새로 생성된 칼럼은 고려하지 않습니다.
오직 FROM으로 불러온 테이블에 sum_score가 존재하는지 확인합니다.
테이블에 sum_score가 없으므로 해당 명령어는 에러가 발생하게 됩니다.
만약 이를 에러없이 수행하고 싶다면 아래와 같이 Group By 절 다음 Having 절을 사용하여 조건을 지정해야 합니다.
 
HAVING명령어는 SQL명령어에 의해 생성되고 계산된 후의 모든 칼럼을 대상으로 명령을 수행하기 때문입니다.
 
이렇게 해서 sas를 이용한 sql문을 마치도록 하겠습니다. 다른 sql문도 sql 기본구조 안에 넣으면 활용할 수 있습니다.
proc sql; /*SQL 문장*/ quit;
PROC SQL; CREATE TABLE AS SELECT FROM WHERE GROUP BY HAVING ORDER BY
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;
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;
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;
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;
SELECT SUM(변수), SUM(변수1,변수2), MEAN(변수), MIDIAN(변수), MIN(변수), MAX(변수), VAR(변수), STD(변수), COUNT(변수), COUNT(변수1,변수2)
proc sql; create table mysas.table3 as select NAME, sum(HEIGHT,WEIGHT) from mysas.table2 ; quit; PROC PRINT DATA=mysas.table3; run;
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;
PROC SQL; CREATE TABLE mysas.table6 AS SELECT NAME, AGE, HEIGHT FROM mysas.table2 WHERE AGE=20 AND ADDR='JEJU' ; QUIT;
PROC SQL; CREATE TABLE mysas.table7 AS SELECT * FROM mysas.subject_test1 ORDER BY score ; QUIT;
PROC SQL; CREATE TABLE mysas.table7 AS SELECT * FROM mysas.subject_test1 ORDER BY score desc ; QUIT;
ORDER BY name, score: name를 정렬하고, name별로 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;
WHERE sum_score >= 175 GROUP BY class_
GROUP BY class_ HAVING sum_score >=175