https://www.acmicpc.net/problem/1740


와 너무 신기한 문제에요..ㅠㅠ

N이 진짜 말도안되게 커서 어떻게 접근해야할지 감도 안왔습니다..


규칙이 있나 찾아봤는데 규칙이 있는 것도 아니였습니다.


자료를 찾다보니... 3의 제곱수를 하나씩만 사용할 수 있는게 힌트였습니다!


진짜 엄청난 힌트더군요..


자꾸 사람들이 2진수 이야기를 하길래 무슨 소린가...했는데..


3의 제곱수를 하나씩만 사용한다는 얘기는 !!!

27 9 3 1 이렇게 있다고 치면!

                

27

9

3

1

0

0

0

1

0

0

1

0

0

0

1

1

0

1

0

0

0

1

0

1

0

1

1

0

0

1

1

1

1

0

0

0

1

0

0

1


어디서 많이 보던!!!!!! 표입니다!

그렇습니다! 하나만 쓰게되면 이진수처럼 됩니당!

그래서 N을 2진수로 바꾼 후에 이 2진수를 3진수를 이용해서 10진수로 바꾸면! 결과가 나옵니다.


예제에 N = 4였습니다.

4는 2진수로

100 입니다! 3진수로 100은 9입니다.

그래서 답은 9죠!


진짜 재밌는 문제입니다..... 소오름~~~

아래는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string.h>
#include <queue>
#include <iostream>
 
#define ll long long
using namespace std;
 
int main() {
    ll n;
    scanf("%lld"&n);
    
    queue<bool> q;
    while (n) {
        q.push(n % 2);
        n /= 2;
    }
 
    ll ans = 0;
    ll add = 1;
 
    while (!q.empty()) {
        ans += q.front() * add;
        add *= 3;
        q.pop();
    }
 
    printf("%lld", ans);
    
    return 0;
}
 
cs


'알고리즘 > 수학' 카테고리의 다른 글

[13412] 서로소 쌍  (0) 2017.09.07
[2436] 공약수  (2) 2017.09.01

중위표기식의 식을 입력 받아서 후위 표기식으로 바꾼 후

계산하는 스택 계산기입니다.


후위로 바꾸는 방법을 모르신다면 아래의 글을 참고해주세요

http://donggod.tistory.com/45


그리고 정석적인 방법이 아닙니다!!!

그냥 제가 생각나는데로 코딩했기 때문입니다...ㅠ_ㅠ....(근데 이게 정석일수도? 냐하하..)


문자열로 받은 식을

후위로 바꿉니다.

후위로 바꿀 때 숫자 뒤에는 항상 '$'을 붙였습니다. 문자열이기 때문에 숫자라는 구분을 넣어준 것입니다.


예를들어 1000 + 300

이면

1000300+가 될텐데 1000300인건지 아니면 1000 300 인것인지 구분하기 위함입니다.

그래서 1000$300$+가 됩니다.


후위를 스택으로 계산하는 방법은

후위식에서 AB+C+라는 식이 있으면


A와 B를 스택에 삽입하고 기호를 만나면 스택에서 가장 위의 값 두개를 팝하고 +연산을 한 후에

다시 스택에 넣습니다.

과정을 보여드리자면


스택 : A,B

기호 : +


그럼 A와 B를 꺼내서 (A+B)라는 값이 만들어집니다


이것을 다시 스택에 넣습니다.


스택 : (A+B)

기호 : 


또 스택에 C가들어오겠죠

스택 : (A+B),C

기호 : +


또 두개를 꺼내서 계산합니다


(A+B+C)라는 값이 만들어지곘죠


스택 : A+B+C

기호 :


완성됐습니다!


아래는 코드입니다.

궁금한 점은 댓글 주세요


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <cstdio>
#include <iostream>
#include <utility>
#include <stack>
#include <string.h>
using namespace std;
 
 
//이전 자료구조 글을 참고하세요 [1918] 후위표기식
// http://donggod.tistory.com/45
//그 코드에서 바뀐 부분만 주석 달겠습니다.
void prefix(char *str, char *output) {
    stack<char> s;
    int oIdx = 0;
 
    for (int i = 0; i < strlen(str); i++) {
        //A~Z가 아닌 숫자로 바뀜
        //숫자일 때 까지 output에 넣고
        //마지막에 '$'를 삽입
        //ex) 1000+30 이면 1000$30$+
 
        if (str[i] >= '0' && str[i] <= '9') {
            int j;
            for (j = i; str[j] >= '0' && str[j] <= '9'; j++) {
                output[oIdx++= str[j];
            }
            output[oIdx++= '$';
            i = j - 1;
        }
        else {
            if (str[i] == '(') s.push(str[i]);
            else if (str[i] == ')') {
                while (s.top() != '(') {
                    output[oIdx++= s.top();
                    s.pop();
                }
                s.pop();
            }
            else if (str[i] == '*' || str[i] == '/') {
                while (!s.empty() && (s.top() == '*' || s.top() == '/')) {
                    output[oIdx++= s.top();
                    s.pop();
                }
                s.push(str[i]);
            }
            else {
                while (!s.empty() && s.top() != '(') {
                    output[oIdx++= s.top();
                    s.pop();
                }
                s.push(str[i]);
 
            }
        }
    }
 
    while (!s.empty()) {
        output[oIdx++= s.top();
        s.pop();
    }
    output[oIdx] = '\0';
}
 
//prefix로 바뀐 output, 인덱스를 포인터로 받음
//'$'를 만날 때 까지 10씩 곱해주며 숫자로 바꾼 후 리턴
int toInt(char *output, int* idx) {
    int ret = 0;
    for (; output[*idx] != '$'; (*idx)++) {
        ret *= 10;
        ret += output[*idx] - '0';
    }
    return ret;
}
 
int calcuration(char *output) {
    stack<int> s;
 
    for (int i = 0; i < strlen(output); i++) {
        if (output[i] >= '0' && output[i] <= '9') {
            int a = toInt(output, &i);//문자열을 숫자로 바꿈
            s.push(a);//스택에 삽입
        }
        else {
            int b = s.top();
            s.pop();
            int a = s.top();
            s.pop();
 
            switch (output[i]) {
            case '+':
                a += b;
                break;
            case '-':
                a -= b;
                break;
            case '/':
                a /= b;
                break;
            case '*':
                a *= b;
                break;
            }
            
            s.push(a);
        }
    }
 
    return s.top();
}
 
int main() {
    char str[10000];
    char output[10000];
 
    scanf("%s", str);
    prefix(str, output);
 
    printf("%d\n", calcuration(output));
 
    return 0;
}
cs


'CS기본지식 > 자료구조' 카테고리의 다른 글

[C언어] 우선순위 큐(Priority Queue)  (3) 2017.09.07
[2263] 트리의 순회  (1) 2017.08.27
[1918] 후위표기식  (2) 2017.06.13
이중 연결 리스트  (0) 2017.04.22
단순 연결 리스트  (0) 2017.04.22

https://www.acmicpc.net/problem/1918


어떤 회사의 인턴 사전 시험에서 스택 계산기 문제가 나왔습니다.


식을 문자열로 받고 계산하는 문제였는데..


총 7문제?? 정도였던것 같은데.. 손코딩으로 해야해서..

시간이 모잘라서 못풀었습니다ㅠ_ㅠ

기억도 되살릴겸 다시 풀어봤습니다!

----------------------------------------


어떤식을 후위연산으로 바꿀 때 중요한 것은

기호들의 우선순위 입니다.

*, / 곱하기와 나누기는 우선순위가 같습니다.

+, - 플러스와 마이너스는 우선순위가 같습니다.


위 두개의 우선순위는 ('+', '-') < ('*', '/') 이렇게 됩니다.

곱하기와 나누기가 플러스 마이너스 보다 우선순위가 높은 것이지요.


예를 들어 설명해드리자면!


3 + 4 * 8 이라는 식이 있으면 답은 3 + 32 = 35 겠지요!?

여기서 * 곱하기를 먼저 계산하셨을겁니다! 이 우선순위를 말하는 것입니다!


ABC+*라는 식은 A * (B + C)입니다.

A * (B + C)라는 식을 후위연산으로 바꾸는 과정을 보여드릴게요!


스택은 왼쪽이 bottom 가장 오른쪽이 탑입니다.

출력은 그냥 왼쪽부터 오른쪽 순입니다.

먼저 A를 만났습니다.


1.

스택 :

출력 : A


가 되겠죠?

과정을 쭉 보여드릴게요오오~~


2.

스택 : *

출력 : A


3.

스택 : *(

출력 : A


4.

스택 : *(

출력 : AB


5.

스택 : *(+

출력 : AB



6.

스택 : *(+

출력 : ABC


7.
이제 여기서 중요합니다!
')' 기호를 만나면 ! 스택에서 '(' 까지 전부 pop 해줍니다!!!! 여기서는 + 밖에없으므로!

스택 : *(+

출력 : ABC


스택 : *
출력 : ABC+

가 됩니다!

이제 문자열이 끝났으니
스택에 남아있는것을 스택이 empty가 될때까지 비워주면서 차례차례 출력 문자열에 넣어줍니다!
결과 : ABC+*
가 됩니다!

ABC*+라는식은 A + B * C입니다.

A + B * C 를 한번 위의 절차처럼 따라해보세요!!!

주의할 점은 *가 +보다 우선순위가 높다는 점!


아래는 1918 문제의 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <cstdio>
#include <iostream>
#include <utility>
#include <stack>
#include <string.h>
using namespace std;
 
int main() {
    char str[1000]; //input
    char output[1000]; // output
 
    scanf("%s", str);
 
    stack<char> s; // +-*/(를 저장할 스택
    int oIdx = 0// 출력 문자열의 인덱스
 
    // str의 문자열을 끝까지
    for (int i = 0; i < strlen(str); i++) {
        if (str[i] >= 'A' && str[i] <= 'Z') output[oIdx++= str[i]; // A~Z는 출력문자열에 추가
        else {
            //그게아니면 전부 기호이므로
            //아래처럼 처리
 
            if (str[i] == '(') s.push(str[i]); // '('문자는 무조건 스택에 추가
            else if (str[i] == ')') { // ')'문자는 '('문자를 만날 때까지 pop
                while (s.top() != '(') {
                    output[oIdx++= s.top();
                    s.pop();
                }
                s.pop();
            }
            else if (str[i] == '*' || str[i] == '/') {
                //우선순위가 나보다 높거나 같은것을 pop
                //( '/','*'보다 우선순위가 높은것은 없음)
                while (!s.empty() && (s.top() == '*' || s.top() == '/')) {
                    output[oIdx++= s.top();
                    s.pop();
                }
                s.push(str[i]);
            }
            else { // '+', '-' 인 경우
                while (!s.empty() && s.top() != '(') {
                    //우선순위가 나보다 높거나 같은것을 pop
                    //('+', '-'보다는 전부 우선순위가 높으므로 '('나 스택이 빌 때까지 pop)
                    output[oIdx++= s.top();
                    s.pop();
                }
                s.push(str[i]);
 
            }
        }
    }
 
    //스택에 남아있는 것을 전부 pop
    while (!s.empty()) {
        output[oIdx++= s.top();
        s.pop();
    }
    output[oIdx] = '\0';
 
    printf("%s\n", output);
 
    return 0;
}
cs


'CS기본지식 > 자료구조' 카테고리의 다른 글

[C언어] 우선순위 큐(Priority Queue)  (3) 2017.09.07
[2263] 트리의 순회  (1) 2017.08.27
스택 계산기  (0) 2017.06.13
이중 연결 리스트  (0) 2017.04.22
단순 연결 리스트  (0) 2017.04.22

https://ko.wikipedia.org/wiki/Join_(SQL)


위키 잠고했습니다!


아래 쿼리문으로 테이블 생성하고 데이터 삽입해주세요!

CREATE TABLE department
(
 DepartmentID INT,
 DepartmentName VARCHAR(20)
);

CREATE TABLE employee
(
 LastName VARCHAR(20),
 DepartmentID INT
);

INSERT INTO department(DepartmentID, DepartmentName) VALUES(31, '영업부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(33, '기술부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(34, '사무부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(35, '마케팅');

INSERT INTO employee(LastName, DepartmentID) VALUES('Rafferty', 31);
INSERT INTO employee(LastName, DepartmentID) VALUES('Jones', 33);
INSERT INTO employee(LastName, DepartmentID) VALUES('Steinberg', 33);
INSERT INTO employee(LastName, DepartmentID) VALUES('Robinson', 34);
INSERT INTO employee(LastName, DepartmentID) VALUES('Smith', 34);
INSERT INTO employee(LastName, DepartmentID) VALUES('John', NULL);


그리고 크로스 조인을 해보겠습니다!!


크로스 조인은 아래의 쿼리와 결과가 같네요!


크로스 조인은


이 두 테이블의 곱을 나타내는 것 같습니다!

왼쪽 임플로이 테이블은 데이터가 6개 오른쪽 디퍼트먼트 테이블은 4개네요!

위에서 쿼리를 썼을 때 24행이라는 결과가 보이시죠!?

6 * 4 = 24 입니다.


Employee테이블에서 (Rafferty, 31)행에 대해서 Department의 (31, 영업), (32, 기술), (33, 사무), (34, 마케팅) 4개의 행이 대응됩니다.

이걸 Rafferty~John까지 반복하면 24개의 행이 생성되겠죠!



이제 내부 조인 차례입니다!!!!!!!!!!!!! 내부 조인은 영어로 Inner Join이라고 하네욧!

내부 조인의 특징!

내부 조인은 가장 흔한!!! 결합 방식이랍니다!!

그리고! 조인 구문(조인 쿼리문에서 ON 뒤의 부분을 말하는 것 같습니다!)에 충족하는 A테이블의 행과 B테이블의 행을 결합하여서 출력합니당!


아그리고 !! 조인에는 명시적 조인 표현과 암묵적 조인 표현이라는게 있습니다!!

위에서 크로스 조인이라고 언급하고 출력한것이 명시적 조인, 그 밑에 select * from 임플로이, 디파트먼트 이 것이 암묵적 조인입니다.!

cross join이라고 명시했기 떄문에! 명시적 조인이구요!, 암묵적 조인에는 join을 언급하진 않았지만 조인한 것과 같은 결과를 보여주기 때문에 암묵적 조인 같습니다!


내부 조인에서도 한번 해보겠습니다!


쿼리문을 해석하자면! department 테이블이 employee테이블에 내부 조인을 하네요!

On뒤에 조건이 나오죠! 임플로이 테이블의 departmentid와 디파트먼트 테이블의 departmentid가 같으면

데이터를 보여줘라 이런 내용입니다.

가운데 두 컬럼을 보시면 31 31, 33 33, ...으로 같은것을 볼 수 있습니다.


아래는 암묵적으로 내부조인을 하는 쿼리문입니다!


오옷!!!

위 두개의 결과가 같네요 신기하네요!@!

위에서 했던 크로스 조인의 결과에서 where을 이용하여 조건을 거네요!

크로스 조인의 결과 중에서! department아이디가 같은거만 출력하는 것입니다!

재밌네요 ㅎ..ㅎ


아아 참고로 매번 employee, department 이런식으로 쓰기보다는 별명을 붙여주면 편리하게 사용할 수 있습니다!

SELECT * 
FROM employee e INNER JOIN department d 
  ON e.DepartmentID = d.DepartmentID;


이렇게! 테이블명 뒤에다가 별명을 붙여주시면 됩니다! 실행보세욧



내부 조인을 세부적으로 분류하면

동일 조인(equi-join), 자연 조인(natural join), 교차 조인(cross-join)으로 나눌 수 있답니다!


동일 조인은 위에서 보여준 내부조인과 같은 쿼리네요!


자연조인은!!!!


자연 조인(natural join)은 동일 조인의 한 유형으로 조인 구문이 조인된 테이블에서 동일한 컬럼명을 가진 2개의 테이블에서 모든 컬럼들을 비교함으로써, 암시적으로 일어나는 구문이다. 결과적으로 나온 조인된 테이블은 동일한 이름을 가진 컬럼의 각 쌍에 대한 단 하나의 컬럼만 포함하고 있다.


위키에서 이렇게 설명하고있네요!!!


하지만 위험한 조인인가 봅니다!! 아래 이러한 설명도 붙어있습니다.


대부분의 전문가들은 NATURAL JOIN이 위험한 것이며, 그러므로 이것의 사용을 강력하게 비권장하고 있다.[3] 그러한 위험은 다른 테이블에 다른 컬럼으로 동일한 이름을 가진 새로운 컬럼을 무심코 추가하는데서 오는 것이다.

현존하는 자연 조인은 자연스럽게 (다른 컬럼에서 온) 이전보다 다른 기준을 이용해서 비교를 위해 비교를 하거나 일치하는 것을 찾아서 새로운 컬럼을 이용할 것이다. 그리하여 테이블 내에 있는 데이터가 변경되지 않고, 증가만 해도 현존하는 질의어는 다른 결과물을 생성할 것이다.



이제 외부 조인을 해보겠습니다!!!!!!!


외부조인은 왜!?!? 왜쓸까욧!!!

equi join은 조인을 생성할 때 동일한 값이 없다면 데이터를 반환하지 못하는데요!!!!

이 때 동일한 값이 없는 행들도 포함하여 조회하기 위해서

외부 조인을 사용합니다!


left 외부 조인을 해보겠쑵니당!!!



위의 내부조인과 다르게 john이 표시되어있습니다!!!!


그리고 오른쪽 조인 왼쪽조인은 기능적으로 동일하다고 하네요!!!

아래의 설명을 보시죠!


오른쪽과 왼쪽 외부 조인은 기능적으로 동일하다. 양자 모두 다른 것들이 하지 않는 어떠한 기능도 제공하지 않는다. 그래서 오른쪽과 왼쪽 외부 조인은 테이블 순서가 변경되기만 하면, 서로 대체할 수 있다.


그렇다네요!!!!

right join도 어떻게쓰는지 보겠습니다!.


컬럼 순서만 바뀌었을 뿐이지 결과는 같네욧!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

이만 마치겠숩니당 뿅뿅


'CS기본지식 > 데이터베이스' 카테고리의 다른 글

정규화가 무엇일까?  (0) 2017.11.19
트랜잭션  (0) 2017.11.19
[SQL] select문  (0) 2017.06.08
테이블 수정 및 삭제  (0) 2017.06.08
varchar와 char의 차이  (0) 2017.06.07

SELECT 구문 형식


select select_list(컬럼, cnt, avg 등등) [ into new_table ]

[ from table_source ] [ where search_condition ]

[ group by group_by_expression ]

[ having search_condition ]

[ order by order_expression [ asc | desc ] ]


GROUP BY : 특정 열이나 특정 열을 연산할 결과를 집계 키로 정의하여 그 집계 키의 Unique 값에 따라 그룹을 짓는 연산자.

DISTINCT : 단순히 unique값만을 추출하기 위해 사용.


위 둘의 차이 : group by는 집계 키(count(*), sum(), max(), min(), avg() 등) 기준으로 집합 연산, distinct는 unique만 뽑아냄.


ex)

1. select distinct player_id, team_id from player

2. select distinct player_id, team_id, count(*) from player

3. select team_id, count(*) from player group by team_id


1번 예시는 player_id, team_id 컬럼에서 중복제거가 되어 출력됨.

2번 예시는 오류가 난다. 이유는 distinct에 집계 함수를 썼기 때문이다.(count)

3번 예시는 team_id로 그룹화 되어 각 team_id당 몇개의 데이터가 있는지 출력된다.


select문을 계속 연습해보겠다.


이러한 데이터들이 있다.

위의 3번처럼 completed에 대해서 그룹화하고 count를 출력해보겠다.


INTO : INTO는 조건에 맞는 기존 테이블의 열 내용을 새 테이블을 만들어 가져온다.

(테스트해보니 지원안하는 DB도 있는 것 같군요.. H2로 하고 있는데 안되네용..또르르)


ex) select * into [새로운 테이블 명] from [데이터를 가져올 테이블] where 조건



having절 : where과 비슷한데 group에 대해서 적용되는 조건이라고 생각하면 된다.


WHERE절 조건

 등호

설명 

같다 

<> 

같지 않다

작다 

크다 

<=

작거나 같다 

=> 

크거나 같다 


(실험 결과 not의 위치는 컬럼명 앞이나 뒤 아무데나 상관없는듯)

컬럼명 between a and b :  a와 b사이의 값을 가진 결과를 보여줌(a, b 포함)

not 컬럼명 between a and b : a와 b사이의 값을 제외하고 보여줌

컬럼명 is null : 컬럼의 value가null인 데이터를 찾음

컬럼명 is not null : 컬럼의 value가 null이 아닌 데이터를 찾음

컬럼명 like ''

--------------

%가나다 : 멍충이가나다, 바보가나다, 하가나다 등 뒤에 가나다가 붙는 데이터를 찾음

가나다% : 가나다멍충이, 가나다바보, 가나다라마바사아자차카타하 등 앞에 가나다가 붙는 데이터를 찾음

%가나다% : 가운데 가나다가 들어가는 데이터를 찾음.

_가나다 : 킼가나다, ㅎ가나다 등 앞에 한글자 불특정문자가 오는 가나다를 찾음.


컬럼명 in('', '') : in안의 데이터들이 포함되어있는 데이터를 보여줌.(or과 같음)




'CS기본지식 > 데이터베이스' 카테고리의 다른 글

트랜잭션  (0) 2017.11.19
조인  (0) 2017.06.10
테이블 수정 및 삭제  (0) 2017.06.08
varchar와 char의 차이  (0) 2017.06.07
테이블 생성문  (0) 2017.06.07

참고 블로그

http://hyeonstorage.tistory.com/292



테이블 수정

1. 컬럼 추가(맨 뒤에 추가됨)

alter table 테이블명

add 컬럼명 datatype;


ex)

alter table player

add (age int));


2. 컬럼 삭제

alter table 테이블명

dop column 컬럼명;


ex)

alter table player

drop column age;


3. 컬럼 수정

alter table 테이블명

modify (컬럼명1 데이터 유형 [default 식][not null],

컬럼명2 데이터 유형 [default 식][not null]);


ex)

alter table player   

modify (player_name varchar(30) default 'hahahaha' not null);


특징

- 컬럼의 크기를 늘릴 수는 있지만 줄이지는 못함. (기존의 데이터가 훼손될 수 있기 때문)

- 해당 컬럼이 null값만을 가지고 있으면 데이터 type을 바꿀 수 있음.

- 해당 컬럼의 default값을 바꾸면 변경 이후의 삽입에만 영향을 줌.(기존의 것이 바뀌지 않음을 의미)

- 해당 컬럼에 null 값이 없을 경우에만 not null 제약조건을 추가할 수 있음.


4. 컬럼명 수정

alter table 테이블명

rename column 변경할 컬럼명 to 새로운 컬럼명;


alter table player

rename column player_id to team_id;


5. 제약조건 추가

alter table 테이블명

add constraint 제약조건명 제약조건(컬럼명);


ex)

alter table player

add constraint player_fk

foreign key(team_id) references team(team_id);


해석

player 테이블을 바꾸겠다.

player_fk라는 이름의 제약조건을 추가하겠다.

team_id를 외래키로 하고 team테이블의 team_id를 참조하겠다.


6. 제약조건 삭제

alter table 테이블명

drop constraint 제약조건명;


ex)

alter table player

drop constraint player_fk;


테이블 삭제

drop table 테이블명


'CS기본지식 > 데이터베이스' 카테고리의 다른 글

트랜잭션  (0) 2017.11.19
조인  (0) 2017.06.10
[SQL] select문  (0) 2017.06.08
varchar와 char의 차이  (0) 2017.06.07
테이블 생성문  (0) 2017.06.07

char의 특징

1. 고정 길이 문자열

2. 고정된 길이 만큼 채워지지 않으면 나머지 부분은 공백으로 채워짐.


varchar 특징

1. 가변적인 길이 문자열


두 문자열의 차이점은 저장 영역, 문자열 비교 방법이다.

varchar는 가변적인 길이이므로 필요한 영역은 실제 데이터 크기(들어오는 크기?).

길이가 다양한 컬럼에 장점을 가짐. char보다 능동적이다.

char은 고정된 길이(주민등록번호, 생일 등)에 char을 사용하는 것이 좋음



문자열 비교방법에서 char은 나머지가 공백으로 채워진다고 했다.

ex) char(20) 이면 10글자를 쓰면 나머지 10은 공백으로 채워짐.

abcdef공백 * 14 == abcdef 공백 * 4 같은 값을 가짐.(공백고 관계없이 문자열만 같으면 같음?)


반면에 varchar은 공백또한 문자로 취급하므로 공백이 들어가면 다른 문자열로 판단함

위의 예시일 경우 다른 문자열로 판단함.

'CS기본지식 > 데이터베이스' 카테고리의 다른 글

트랜잭션  (0) 2017.11.19
조인  (0) 2017.06.10
[SQL] select문  (0) 2017.06.08
테이블 수정 및 삭제  (0) 2017.06.08
테이블 생성문  (0) 2017.06.07

테이블 생성

create table 테이블명(

컬럼명 DataType [Default 형식]

);


예시 1)


create table player(

player_id char(10) not null,

player_name varchar(20) not null,

team_id char(10) not null


//제약조건

constraint player_pk primary key(player_id),

//player_pk라는 제약조건을 만들겠다. 제약조건의 종류는 기본키(primary key)이며, 기본키로 할 컬럼은 player_id이다.

constraint player_fk foreign key(team_id) references team(team_id)

//player_fk라는 제약조건을 만들겠다. 제약조건의 종류는 외래키(foreign key)이며, 외래키로 할 컬럼은 team_id이고 team테이블의 team_id를 참조하겠다.

);



예시 2)


create table player(

player_id char(10) constraint player_pk primary key,

player_name varchar(20) not null,

team_id char(10) constraint player_fk foreign key(team_id) references team(team_id)

);


예시 3)


create table player(

player_id char(10) primary key,

player_name varchar(20) not null,

team_id char(10) foreign key references team(team_id)

);


제약 조건의 종류

1. not null : null 입력 불가

2. unique : 중복값 입력 불가

3. primary key : not null + unique(table당 하나만 가능)

4. foreign key : 다른 테이블을 참조

5. check : 뒤에 나오는 조건으로 설정된 값만 허용


'CS기본지식 > 데이터베이스' 카테고리의 다른 글

트랜잭션  (0) 2017.11.19
조인  (0) 2017.06.10
[SQL] select문  (0) 2017.06.08
테이블 수정 및 삭제  (0) 2017.06.08
varchar와 char의 차이  (0) 2017.06.07

+ Recent posts