String, 문자열 함수
char타입의 배열로 문자열을 표현한다.
문자열을 특수한 배열로 취급함
0==>아스키코드 0을 의미하며 NULL문자를 의미한다.
NULL은 0이라고 적어도 되고 '\0'으로 적어도 됨
NULL문자열을 넣어줌으로써 배열에 저장되는 정보는 문자열이라고
컴파일러에게 알려줌
문자열 길이 구하는 함수 ==> strlen()
문자열을 결합 ==> strcat()
문자열 복사 ==> strcpy( target, source )
#include <stdio.h>
#include <string.h>
int main(){
char ch[6]={'H','a','p','p','y',0};
printf("%s\n",ch);
char ch2[5]={'G','o','o','d'};
char ch3[]={'G','o','o','d','\0'};
printf("%s\n",ch2);
printf("%s\n",ch3);
char data[6]="Hello";
printf("%s\n",data);
//문자열 길이 구하기
int cnt = 0;
while(data[cnt]!=0){
cnt++;
}
printf("%s문자열의 길이 %d\n",data,cnt);
//문자열 길이 구하는 함수 이용하기 ==> strlen()
int len = strlen(data);
printf("%d\n",len);
//남은 공간은 전부 null로 채워진다.
char buff[10] = "Good ";
char buff2[10] = "Job~~";
//strcat() 문자열을 결합해준다. 문자열 끝에 널문자를 추가하지는 않음
strcat(buff,buff2);
puts(buff);
//뒤에오는 문자 3개를 결합
strncat(buff,"12345",3);
char buff3[10];
char buff4[10]="Love";
//strcpy(target, source)
strcpy(buff3,buff4);
puts(buff3);
return 0;
}
포인터
포인터는 변수의 일종으로, 포인터가 갖는 값은 일반변수와 달리 실제적인 데이터값이 아니라,
데이터가 저장된 기억장소의 주소값이다.
C언어에서 포인터란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부른다.
char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다.
&주소연산자, *참조 연산자
배열은 배열 자체가 포인터이다.
#include <stdio.h>
int main(){
int i=84;
printf("i의 값 %d\n",i);
printf("i의 주소값 %p\n",&i);
int* pi = &i;
printf("pi의 값 %p\n",pi);
//포인터를 이용해서 다른 값을 변경시켜보자.
int x=8000;
int *px=&x;
printf("x값을 출력 %d px값을 출력 %p\n",x,px);
printf("*px = %d\n", *px);
*px=7000;
printf("*px = %d\n", *px);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int main1(){
int i=84;
printf("i의 값 %d\n",i);
printf("i의 주소값 %p\n",&i);
int* pi = &i;
printf("pi의 값 %p\n",pi);
//포인터를 이용해서 다른 값을 변경시켜보자.
int x=8000;
int *px=&x;
printf("x값을 출력 %d px값을 출력 %p\n",x,px);
printf("*px = %d\n", *px);
*px=7000;
printf("*px = %d\n", *px);
return 0;
}
int main(){
int days= 365;
int month=12;
int table[5]={1,2,3,4,5};
printf("days의 주소는 %p\n",&days);
printf("month의 주소는 %p\n",&month);
printf("table의 주소는 %p\n",table);
printf("table[0]의 주소는 %p\n",&table[0]);
printf("table[1]의 주소는 %p\n",&table[1]);
//포인터 변수 선언
//자료형 *변수명;
int *a; //주소갑 저장 가능한 변수
int b=10;
a=&b;
//a 주소값
//*a (간접연산자) ==> 포인터 변수가 가지는 데이터값을 구하는 연산자
printf("%p\n",a);
printf("%d\n",*a);
int *p, i=3, j;
p=&i;
j=*p;
j++;
printf("*p=%d\n",*p); //p주소에 들어있는 데이터 값
printf("p=%d\n",p); //i의 주소값
printf("j=%d\n",j); //4
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int main(){
int *p, a[]={10,20,30,40,50};
p=&a[0]; // = p=a;
printf("%d\n",*p);
printf("%d\n",a[0]);
p+=2;
printf("%d\n",*p);//30
printf("*(p+1) %d\n",*(p+1)); //40
printf("%d\n",*p+1); //31
char buff[10]="Happy";
char *str = "Excellent";
printf("%s",str);
return 0;
}
pass by value, pass by reference
#include <stdio.h>
//정수값을 매개변수로
void change1(int x){//pass by value
x = 100;
}
//주소값을 매개변수로
void change2(int *x){//pass by reference
*x=7000;
//*x를 변경하는 것은 a값을 변경하는 것과 동일
}
int main(){
int a = 55;
printf("--함수 호출 전에 a 값 : %d\n",a);
change1(a);
printf("--change1 함수 호출 후 a 값 : %d\n",a);//5
change2(&a);
printf("--change2 함수 호출 후 a 값 : %d\n",a);//7000
return 0;
}
swap 예제
#include <stdio.h>
void swap(int *a, int *b){
int temp = *b;
*b=*a;
*a=temp;
}
int main(){
int a = 30, b=100;
printf("%d, %d\n",a,b);
//a와 b의 값을 서로 바꾸는 사용자정의 함수를 구현해보세요
swap(&a,&b);
printf("%d, %d\n",a,b);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
VIEW
--> 일종의 가상 테이블
데이터를 다양한 관점에서 참조할 수 있도록 함
(VIEW를 생성하기 위해서는 권한이 필요하다)
system또는 sys 계정으로 접속해서
scott에게
grant create view to scott;
1. 뷰 생성
CREATE VIEW 뷰이름
AS
SELECT 컬럼명1, 컬럼명2...
FROM 뷰에 사용할 테이블명
WHERE 조건
-- EMP테이블에서 20번 부서의 모든 컬럼을 포함하는 EMP20_VIEW를 생성
CREATE VIEW EMP20_VIEW
AS
SELECT * FROM EMP
WHERE DEPTNO=20;
select * from user_views
where view_name='EMP20_VIEW';
--member테이블에서 나이가 19세 이상만 고객 정보만 모아 MEMBER_19VW를 생성한 뒤 조회
CREATE VIEW MEMBER_19VW
AS
SELECT * FROM MEMBER
WHERE AGE>=19;
select * from MEMBER_19vw;
--MEMBER테이블에서 제일 나이 많은 사람의 나이를 15세로 수정
UPDATE MEMBER SET AGE=15
WHERE AGE =
(SELECT MAX(AGE) FROM MEMBER);
--EMP에서 30번 부서 사원정보만 모아 EMP30_VIEW를 만들되, EMPNO를 NUM으로,
--ENAME은 NAME으로 SAL을 SALLARY로 바꾸어 생성
CREATE VIEW EMP30_VIEW
AS
SELECT EMPNO NUM, ENAME NAME, SAL SALLARY, DEPTNO
FROM EMP WHERE DEPTNO=30;
2. 뷰 삭제
DROP TABLE EMP30_VIEW
3. 뷰 수정
뷰가 없으면 생성하고 있으면 수정한다.
뷰를 수정하면 원본도 바뀐다 하지만 조인을 하면 원본은 수정되지 않는다.
CREATE OR REPLACE VIEW EMP20_VIEW (EMP_ID,NAME, JOB,DNO)
AS
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE DEPTNO=20;
--EMP와 DEPT를 JOIN하여 VIEW를 만드세요 VIEW이름은 EMP_DEPT_VW
CREATE VIEW EMP_DEPT_VW
AS
(SELECT e.*,d.loc,d.dname FROM EMP e left outer join DEPT d
ON e.deptno=d.deptno);
--EMP에서 급여가 제일높은 사람 TOP5만 추출해서 EMP_TOP5_VW를 생성
create or replace view emp_vw
as
select * from emp
where sal is not null
order by sal desc;
select * from emp_vw where rownum<6;
--from 절에 사용된 subquery를 inline-view라고 한다.
select rownum, emp_top_view.* from
(select * from emp order by sal desc) emp_top_view
where rownum<6;
VIEW 생성시 줄 수 있는 옵션
(1) WITH READ ONLY
(2) WITH CHECK OPTION
(1) VIEW에서 WITH READ ONLY 옵션을 줄 경우
CREATE OR REPLACE VIEW EMP10_VIEW
AS
SELECT * FROM EMP WHERE DEPTNO=10
WITH READ ONLY;
(2) WITH CHECK OPTION
check 조거을 만족하지 않으면 insert나 수정이 되지 않는다.
CREATE OR REPLACE VIEW MEMBER_19VW
AS
SELECT * FROM MEMBER
WHERE AGE>=19
WITH CHECK OPTION CONSTRAINT MEMBER_AGE19_CK;
SYNONYM
sql 권한을 줄 수 있음
grant all on mynote_table to scott;
conn scott/tiger;
select msg from mystar.mynote_table;
grant create synonym to scott;
create synonym mnote for mynote_table;
select * from mnote;
drop synonym mnote;