1. MySQL 사용자·데이터베이스 준비

더보기
-- [테이블 생성: 회원 정보 저장]
CREATE TABLE Members (
  code     INT PRIMARY KEY AUTO_INCREMENT,        -- 고유 번호
  id       VARCHAR(12) NOT NULL,                  -- 사용자 ID
  pw       VARCHAR(18) NOT NULL,                  -- 비밀번호
  fname    VARCHAR(50) NOT NULL,                  -- 이름
  lname    VARCHAR(50) NOT NULL,                  -- 성
  ph       VARCHAR(20),                           -- 전화번호
  email    VARCHAR(100),                          -- 이메일
  disabled TINYINT(1) NOT NULL DEFAULT 0          -- 비활성(0=활성, 1=비활성)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- [샘플 데이터 6명 등록]
INSERT INTO Members (id, pw, fname, lname, ph, email, disabled) VALUES
  ('aaa', '1111', 'Richard', 'Choi',  '010-1234', 'abcd@a.com', 0),
  ('bbb', '222',  'Olivia',  'Kim',   '017-9999', 'zz@b.com',   0),
  ('ccc', '33',   'Rose',    'Park',  '019-6788', 'vvv@c.com',  1),
  ('d',   '4',    'C++',     'Lee',   '054-123',  'a@a.com',    0),
  ('e',   '55',   'Python',  'Ryu',   '02-88',    'b@b.com',    0),
  ('f',   '666',  'Java',    'Jo',    '070-876',  'c@c.com',    1);

 

2. CRUD 쿼리 요약

더보기
-- [CREATE: 회원 추가]
INSERT INTO Members (id, pw, fname, lname, ph, email, disabled)
VALUES ('hacker', '1234', 'Eve', 'Hacker', '010-0000', 'eve@hacker.com', 0);

-- [READ: 전체 회원 목록 조회]
SELECT code, id, pw, fname, lname, ph, email, disabled FROM Members;

-- [UPDATE: 회원 비밀번호 변경]
UPDATE Members SET pw = 'newpass' WHERE id = 'e';

-- [DELETE: 회원 삭제]
DELETE FROM Members WHERE id = 'hacker';

 

3. Read (SELECT) : 회원 조회 (1)

더보기

1. SELECT 쿼리

-- 전체 회원 조회
SELECT code, id, pw, fname, lname, ph, email, disabled
FROM Members;

-- 활성 회원만 조회 (disabled = 0)
SELECT code, id, fname, lname
FROM Members
WHERE disabled = 0;

 

2. SELECT C언어 사용 예제(1) - select_all_members 함수(회원 조회)

// [1] 전체 회원 조회 함수
void select_all_members(MYSQL *conn) {
    // [1-1] SELECT 쿼리문 준비
    const char *query =
        "SELECT code, id, pw, fname, lname, ph, email, disabled FROM Members;";

    // [1-2] 쿼리 실행 (실패 시 에러 출력)
    if (mysql_query(conn, query)) {
        fprintf(stderr, "[1-2] SELECT failed: %s\n", mysql_error(conn));
        return;
    }

    // [1-3] 결과 집합 받기
    MYSQL_RES *res = mysql_store_result(conn);
    if (!res) {
        fprintf(stderr, "[1-3] mysql_store_result() failed: %s\n", mysql_error(conn));
        return;
    }

    // [1-4] 컬럼 헤더 출력
    printf("[1-4] 전체 회원 조회 결과\n");
    printf("code | id    | pw    | fname | lname | ph        | email        | disabled\n");
    printf("-----|-------|-------|-------|-------|-----------|--------------|---------\n");

    // [1-5] 결과 레코드 한 줄씩 반복 처리
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(res)) != NULL) {
        // [1-5-1] 값 복사(또는 출력만 해도 무방)
        int code        = atoi(row[0]);
        const char *id  = row[1];
        const char *pw  = row[2];
        const char *fname = row[3];
        const char *lname = row[4];
        const char *ph    = row[5];
        const char *email = row[6];
        int disabled   = atoi(row[7]);

        // [1-5-2] 출력
        printf("%4d | %-5s | %-5s | %-5s | %-5s | %-9s | %-12s | %d\n",
            code, id, pw, fname, lname, ph, email, disabled);
    }

    // [1-6] 결과 해제
    mysql_free_result(res);
}

 

 

 

 

3. 전체 동작 순서 흐름도

// 1. 쿼리 실행
mysql_query(conn, "SELECT code, id FROM Members");

// 2. 결과 집합 받기
MYSQL_RES *res = mysql_store_result(conn);

// 3. 한 행씩 출력
MYSQL_ROW row;
while ((row = mysql_fetch_row(res)) != NULL) {
    printf("code: %s, id: %s\n", row[0], row[1]);
}

// 4. 결과 메모리 해제
mysql_free_result(res);
  1. 쿼리 실행
    → mysql_query(conn, 쿼리문);
  2. 결과 집합 받기 (테이블 형태의 2차원 데이터를)
    → MYSQL_RES *res = mysql_store_result(conn);
  3. 반복문으로 한 행씩 읽기
    → while ((row = mysql_fetch_row(res)) != NULL) { ... }
  4. 결과 집합 해제
    → mysql_free_result(res);

 

4. 소스코드

더보기
/*
 * mysql_select_test.c
 *
 * Ubuntu에서 C 언어로 MySQL에 접속하여
 * Members 테이블의 전체 회원을 조회하는 예제
 *
 * 컴파일 명령어:
 *   gcc mysql_select_test.c -o mysql_select_test \
 *       $(mysql_config --cflags) $(mysql_config --libs)
 *
 * 실행:
 *   ./mysql_select_test
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

// [1] DB 연결 정보 매크로
#define DB_HOST     "localhost"
#define DB_USER     "root"
#define DB_PASS     "1234"
#define DB_NAME     "sqldb"
#define DB_PORT     3306
#define DB_SOCKET   NULL
#define DB_CLIENT_FLAGS 0

// [2] 회원정보 구조체 선언 (code 추가)
typedef struct {
    int  code;         // [2-0] 고유 번호 (AUTO_INCREMENT)
    char id[13];       // [2-1] 사용자 ID (VARCHAR(12) + '\0')
    char pw[19];       // [2-2] 비밀번호 (VARCHAR(18) + '\0')
    char fname[51];    // [2-3] 이름
    char lname[51];    // [2-4] 성
    char ph[21];       // [2-5] 전화번호
    char email[101];   // [2-6] 이메일
    int  disabled;     // [2-7] 비활성 여부 (0:활성, 1:비활성)
} Member;

// [3] 전체 회원 조회 함수
void select_all_members(MYSQL *conn) {
    // [3-1] SELECT 쿼리문 준비
    const char *query =
        "SELECT code, id, pw, fname, lname, ph, email, disabled FROM Members;";

    // [3-2] 쿼리 실행 (실패 시 에러 출력)
    if (mysql_query(conn, query)) {
        fprintf(stderr, "[3-2] SELECT failed: %s\n", mysql_error(conn));
        return;
    }

    // [3-3] 결과 집합 받기
    MYSQL_RES *res = mysql_store_result(conn);
    if (!res) {
        fprintf(stderr, "[3-3] mysql_store_result() failed: %s\n", mysql_error(conn));
        return;
    }

    // [3-4] 컬럼 헤더 출력
    printf("[3-4] 전체 회원 조회 결과\n");
    printf("code  | id           | pw               | fname      | lname      | ph           | email                | disabled\n");
    printf("----- | ------------ | ---------------- | ---------- | ---------- | ------------ | -------------------- | --------\n");

    // [3-5] 결과 레코드 한 줄씩 반복 처리
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(res)) != NULL) {
        // [3-5-1] 구조체에 값 복사(실무에서는 배열 저장 등 활용 가능)
        Member m;
        m.code      = atoi(row[0]);
        strncpy(m.id,     row[1], sizeof(m.id));      m.id[sizeof(m.id)-1] = '\0';
        strncpy(m.pw,     row[2], sizeof(m.pw));      m.pw[sizeof(m.pw)-1] = '\0';
        strncpy(m.fname,  row[3], sizeof(m.fname));   m.fname[sizeof(m.fname)-1] = '\0';
        strncpy(m.lname,  row[4], sizeof(m.lname));   m.lname[sizeof(m.lname)-1] = '\0';
        strncpy(m.ph,     row[5], sizeof(m.ph));      m.ph[sizeof(m.ph)-1] = '\0';
        strncpy(m.email,  row[6], sizeof(m.email));   m.email[sizeof(m.email)-1] = '\0';
        m.disabled  = atoi(row[7]);

        // [3-5-2] 출력
        printf("%-5d | %-12s | %-16s | %-10s | %-10s | %-12s | %-20s | %-8d\n",
              m.code, m.id, m.pw, m.fname, m.lname, m.ph, m.email, m.disabled);
    }

    // [3-6] 결과 해제
    mysql_free_result(res);
}

int main(void) {
    MYSQL *conn;
    // [4] MySQL 연결 관련 변수

    // [5] MySQL 객체 초기화
    conn = mysql_init(NULL);
    if (!conn) {
        fprintf(stderr, "[5] mysql_init() failed\n");
        return EXIT_FAILURE;
    }

    // [6] 데이터베이스 연결
    if (!mysql_real_connect(conn,
                            DB_HOST,
                            DB_USER,
                            DB_PASS,
                            DB_NAME,
                            DB_PORT,
                            DB_SOCKET,
                            DB_CLIENT_FLAGS)) {
        fprintf(stderr, "[6] mysql_real_connect() failed:\n  %s\n", mysql_error(conn));
        mysql_close(conn);
        return EXIT_FAILURE;
    }

    // [7] 전체 회원 조회 함수 호출
    select_all_members(conn);

    // [8] DB 연결 종료
    mysql_close(conn);

    return 0;
}