2 장 MySQL 활용 기초편
2.1 데이터베이스 정의 및 조작
- 목록 검색
- 새로운 DB 생성, 삭제, 수정
- 한글처리
2.1.1 데이터베이스 리스트 출력
SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| news |
| performance_schema |
| test_db |
| wikidb |
+--------------------+
16 rows in set (0.00 sec)2.1.2 데이터베이스 생성
SQL 구문
CREATE DATABASE [db_name]
[DEFAULT CHARACTER SET utf8]
[DEFAULT COLLATE utf8_general_ci];
이 문장을 실행하면 MySQL data 디렉토리에 db_name이란 서브디렉토리가 생성
만일 같은 이름의 data base디렉토리가 있으면 에러
스키마 옵션
- 문자셋(Character Set): 문자의 인코딩 규칙이 정의된 집합 (ASCII, EUC-KR, UTF-8 등), 한글인코딩 처리시 유용
- 콜레이션(Collation): 정렬방식, 문자셋으로 인코딩된 문자들간 비교시 사용하는 규칙집합
(예) 새로운 database world를 만들고, 이를 handling하기 위한 명령문은 다음과 같다.
CREATE DATABASE world; USE world; # 데이터베이스 이동
2.2 테이블 정의 및 조작
- 테이블 생성: CREATE
- 테이블 삭제: DROP, DELETE
- 테이블 변경: ALTER
- 테이블에 자료 입력: INSERT
- 테이블에 자료 삭제: DELETE
- 테이블에 자료 갱신(변경): UPDATE
2.2.1 테이블 생성
SQL 구문
CREATE TABLE [IF NOT EXISTS] 테이블이름(
컬럼이름 자료속성 기타속성 정의1,
...
컬럼속성 정의n
)
- 컬럼속성:
INTEGER[n],INT[n]: n자리의 정수REAL: 실수값 지정CHAR(n): 고정크기(n) 문자열VARCHAR(n): 가변크기 문자열DATETIME
- 컬럼 기타 속성:
PRIMARY KEY: 기본키로 설정NOT NULL: 반드시 값을 가져야 함을 의미AUTO_INCREMENT: 레코드가 삽입될 때 마다 자동으로 값을 증가DEFAULT default_value: 디폴트값을 지정
2.2.1.1 컬럼속성
| 유형 | 데이터 유형 | 정의 |
|---|---|---|
| 문자형 | CHAR(n) | 고정 길이(최대 255byte): n보다 짦은 데이터 입력시 나머지는 공백으로 채움 |
| VARCHAR(n) | 가변 길이(최대 65535byte) | |
| TINYTEXT(n) | 문자열(최대 255byte) | |
| TEXT(n) | 문자열(최대 65535byte) | |
| MEDIUMTEXT(n) | 문자열(최대 16777215byte) | |
| LONGTEXT(n) | 문자열(최대 4294967295byte) | |
| 숫자형 | TINYINT(n) | 정수형(1byte) -128 ~ +127 또는 0 ~ 255 |
| SMALLINT(n) | 정수형(2byte) -32768 ~ 32767 또는 0 ~ 65536 | |
| MEDIUMINT(n) | 정수형(3byte) -8388608 ~ +8388607 또는 0 ~ 16777215 | |
| INT(n) | 정수형(4byte) -2147483648 ~ +2147483647 또는 0 ~ 4294967295 | |
| BIGINT(n) | 정수형(8byte) | |
| FLOAT(길이,소수) | 부동소수형(4byte) | |
| DECIMAL(길이,소수) | 고정소수형(길이+1byte) | |
| DOUBLE(길이,소수) | 부동소수형(8byte) | |
| 날짜형 | DATE | 날짜(년도, 월, 일)(3byte) |
| TIME | 시간(시, 분, 초)(3byte) | |
| DATETIME | 날짜와 시간(8byte) | |
| TIMESTAMP | 날짜와 시간(4byte) -시스템 변경 시 자동으로 그 날짜와 시간이 저장 | |
| YEAR | 년도 표현(1byte) | |
| 이진 | BINARY(n) & BYTE(n) | 최대 255byte |
| VARBINARY(n) | 최대 65535byte) | |
| TINYBLOB(n) | 최대 255byte | |
| BLOB(n) | 최대 65535byte | |
| MEDIUMBLOB(n) | 최대 16777215byte | |
| LONGBLOB(n) | 최대 4294967295byte |
2.2.1.2 테이블 생성시 한글 처리
테이블 생성시 character set과 collation을 지정하는 방법:
CREATE TABLE mytbl( 테이블 정의문, ... ... ) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
2.2.1.3 테이블 생성 예제
아래와 같은 컬럼정보를 갖는 고객테이블을 생성해 보자.
테이블 명 : customer 컬럼 명 : no: 자동으로 부여되는 일련 번호 name: 이름 age: 나이 phone: 전화번호 email: 전자우편주소 address: 주소테이블 명세서
테이블명 컬럼명 데이터형식 NULL유무 기본키 외래키 FK테이블명 FK컬럼명 고객테이블 no INTEGER NOT NULL PK (customer) name CHAR(20) NOT NULL age TINYINT phone VARCHAR(20) email VARCHAR(30) NOT NULL address VARCHAR(50) SQL 코드
CREATE TABLE customer( no INT PRIMARY KEY NOT NULL AUTO_INCREMENT, name CHAR(20) NOT NULL, age TINYINT, phone VARCHAR(20), email VARCHAR(30) NOT NULL, address VARCHAR(50) );
2.2.2 테이블의 삭제 (DELETE/DROP)
테이블 삭제에는 테이블을 완전 삭제하는 경우와 데이블에 있는 레코드를 삭제하는 경우 두 가지 경우가 있음
데이터만 삭제, 테이블 정보는 그대로 둠
DELETE FROM [table_name]; # 테이블의 모든 레코드 삭제 (테이블은 삭제 안됨) DELETE TABLE [table_name] WHERE [colunm_name] = [value]; # 조건에 해당되는 레코드만 삭제테이블과 모든 레코드 삭제
DROP TABLE table_name;
2.2.3 테이블에 자료입력
레코드 단위의 입력:
INSERT문 사용외부 파일에서 입력:
LOAD DATA구문의 이용예제 데이터(외부 데이터 파일) - 아래 내용을 텍스트 파일(
pet.txt)로 저장Fluffy Harold cat f 1993-02-04 \N Claws Gwen cat m 1994-03-17 \N Buffy Harold dog f 1989-05-13 \N Fang Benny dog m 1990-08-27 \N Bowser Dianne dog m 1998-08-31 1995-07-29 Chirpy Gwen bird f 1998-09-11 \N Whistler Gwen bird \N 1997-12-09 \N Slim Benny snake m 1996-04-29 \N먼저 테이블 생성:
pet테이블에 6개의 컬럼을 정의CREATE TABLE pet( name VARCHAR(20) NOT NULL PRIMARY KEY, owner VARCHAR(20), species VARCHAR(20), sex VARCHAR(1), birth DATE, death DATE );생성된 테이블 스키마를 확인
DESC pet; # 테이블스키마(구조) 확인+---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | NO | PRI | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | varchar(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
2.2.3.1 레코드 단위 입력
SQL 구문
# 테이블에 정의된 컬럼 순으로 값을 입력
INSERT INTO [table_name] VALUES (value_1, ..., value_n)
# 컬럼명, 컬럼값 대응하여 입력
INSERT INTO [table_name] (col_name_1, ..., col_name_n) VALUES
(value_1, ..., value_n)
레코드 단위 입력 예
INSERT INTO pet VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL); INSERT INTO pet (name, owner, species, sex, birth) VALUES ('Fluffy','Harold','cat','f','1993-02-04'); INSERT INTO pet VALUES ('Claws','Gwen','cat','m','1994-03-17',NULL);입력된 데이터 확인
SELECT * FROM pet; # 입력 확인+----------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+--------+---------+------+------------+-------+ 3 rows in set (0.00 sec)
2.2.3.2 외부파일에서 입력
SQL 구문
LOAD DATA LOCAL INFILE file_name INTO TABLE tbl_name
FIELDS TERMINATED BY "," # 컬럼간 구분자
LINES TERMINATED BY "\n" # 라인간 구분(줄나눔)
IGNORE 1 LINES # 두번째 라인부터 읽기
...
(컬럼명1, ...);
외부파일을 이용한 입력
LOAD DATA LOCAL INFILE "/home/jskim/tmp/pet.txt" INTO TABLE jskim.pet FIELDS TERMINATED BY "\t";
2.2.3.3 실습
2.2.3.3.1 실습 1
data download news-2.txt
뉴스 테이블 생성
CREATE TABLE test_db.news( journal VARCHAR(20) NOT NULL, title VARCHAR(200), pub_date DATE, reporter VARCHAR(20), contents text );외부파일을 이용한 입력
- 엑셀 데이터 변환
- 기사내용의 줄나눔(개행) 문자를 공백으로 치환
- 탭구분 텍스트 파일로 저장
- Linux에서는 한글 인코딩 UFT-8로 변환
- 아래의 SQL구문 사용
LOAD DATA LOCAL INFILE "/DB/news-tab-utf8.txt" INTO TABLE test_db.news; /* FIELDS TERMINATED BY "\t" LINES TERMINATED BY "EOL\n";*/ SELECT journal FROM test_db.news LIMIT 10;- 엑셀 데이터 변환
테이블 입력 자료의 조회
SELECT journal FROM test_db.news LIMIT 10; SELECT title FROM test_db.news LIMIT 50; SELECT journal, title, pub_date, reporter FROM test_db.news LIMIT 5; SELECT contents FROM test_db.news LIMIT 2;
2.2.3.3.2 실습 2
테이블 생성
CREATE TABLE customer( no INT PRIMARY KEY NOT NULL AUTO_INCREMENT, name CHAR(20) NOT NULL, age TINYINT, phone VARCHAR(20), email VARCHAR(30) NOT NULL, address VARCHAR(50) ) DEFAULT CHARACTER SET utf8 /* 한글입력 */ DEFAULT COLLATE utf8_general_ci;테이블 삭제
DROP TABLE customer; SHOW TABLES; /*테이블 리스트 */자료 입력(INSERT INTO)
INSERT INTO customer (name, age, email) VALUES ("jskim", 40, "jskim@gmail.com"); INSERT INTO customer (name, age, email) VALUES ("김진석", 40, "jskim@gmail.com"); SELECT * FROM customer;자료 삭제(DELETE FROM)
DELETE FROM customer WHERE name = "jskim"; SELECT * FROM customer;
2.2.3.3.3 실습 3
R iris data
head(iris, 2)write.table(iris, file="/DB/iris.csv", sep=",", col.names = FALSE, row.names = FALSE, quote=FALSE)iris 테이블 생성
CREATE TABLE test_db.iris( Sepal_Length DOUBLE, Sepal_Width DOUBLE, Petal_Length DOUBLE, Petal_Width DOUBLE, Species VARCHAR(20), );R iris data
LOAD DATA LOCAL INFILE "C:/tmp/iris.csv" INTO TABLE test_db.iris FIELDS TERMINATED BY ",";
2.2.3.3.4 실습 4
테이블 생성
학과, 교수
CREATE TABLE DEPART( no INTEGER NOT NULL PRIMARY KEY, /*학과번호 */ name VARCHAR(50) /*학과이름*/ ); CREATE TABLE PROFESSOR( no INTEGER NOT NULL PRIMARY KEY, /*교수번호*/ name VARCHAR(30), /*교수명*/ did INTEGER /* 학과번호*/ );학생
CREATE TABLE STUDENT( no INTEGER NOT NULL PRIMARY KEY, /* 학생번호 */ name VARCHAR(30), /* 학생이름 */ addr VARCHAR(50), grade INTEGER, /* 학년 */ did INTEGER /* 학과 */ );과목
CREATE TABLE CURRICULUM( no INTEGER NOT NULL PRIMARY KEY, /* 과목번호 */ name VARCHAR(30), /* 과목명 */ points INTEGER, /* 학점 */ profid INTEGER /* 교수 번호 */ );수강
CREATE TABLE LECTURE( sid INTEGER NOT NULL, /* 수강생 번호 */ cid INTEGER NOT NULL, /* 과목번호 */ midexam REAL, finalexam REAL, PRIMARY KEY (sid, cid) /* 여러컬럼 이용 기본키 생성 */ );
외부파일을 이용한 입력
홈페이지 참조: example-tables.xlsx
엑셀파일을 텍스트 포맷(UTF-8)으로 변환 후
아래 이용 테이블로 저장
LOAD DATA LOCAL INFILE "1.csv" INTO TABLE test.DEPART FIELDS TERMINATED BY "," IGNORE 1 LINES; LOAD DATA LOCAL INFILE "2.csv" INTO TABLE test.PROFESSOR FIELDS TERMINATED BY "," IGNORE 1 LINES; LOAD DATA LOCAL INFILE "3.csv" INTO TABLE test.STUDENT FIELDS TERMINATED BY "," IGNORE 1 LINES; LOAD DATA LOCAL INFILE "3.csv" INTO TABLE test.CURRICULUM FIELDS TERMINATED BY "," IGNORE 1 LINES; LOAD DATA LOCAL INFILE "4.csv" INTO TABLE test.LECTURE FIELDS TERMINATED BY "," IGNORE 1 LINES;
입력 확인
SELECT * FROM test.DEPART;SELECT * FROM test.STUDENT name like "%김%";
2.2.3.3.5 실습 5
데이터 파일(csv format)
Create Table
DROP TABLE jskim.baseball; CREATE TABLE jskim.baseball( no INT NOT NULL AUTO_INCREMENT PRIMARY KEY, /*선수일련번호 */ player VARCHAR(20), /*선수이름*/ birth DATE, position VARCHAR(10), type VARCHAR(20), height DOUBLE, weight DOUBLE, career VARCHAR(100), deposit VARCHAR(20), ann_sal VARCHAR(20), nom VARCHAR(100), draft VARCHAR(20) )DEFAULT CHARACTER SET utf8 /* 한글입력 */ DEFAULT COLLATE utf8_general_ci;INSERT DATA TO TABLE
LOAD DATA LOCAL INFILE "/var/www/html/www/lectures/DB/data/프로야구선수연봉.csv" INTO TABLE jskim.baseball CHARACTER SET utf8 # 한글입력 FIELDS TERMINATED BY "," LINES TERMINATED BY "\n" IGNORE 1 LINES (player,birth,position,type,height,weight,career,deposit,ann_sal,nom,draft);입력 자료 확인
SELECT player,birth,position,type,height,weight from jskim.baseball LIMIT 10;+-----------+------------+-----------+--------------+--------+--------+ | player | birth | position | type | height | weight | +-----------+------------+-----------+--------------+--------+--------+ | 김주현 | 1988-04-16 | 내야수 | 우투우타 | 182 | 85 | | 김재현 | 1991-08-30 | 내야수 | 우투우타 | 176 | 73 | | 김하성 | 1995-10-17 | 내야수 | 우투우타 | 175 | 76 | | 조쉬벨 | 1986-11-13 | 내야수 | 우투양타 | 190 | 104 | | 이호신 | 1984-05-19 | 외야수 | 좌투좌타 | 176 | 72 | | 김강민 | 1982-09-13 | 외야수 | 우투우타 | 182 | 85 | | 조동화 | 1981-03-22 | 외야수 | 좌투좌타 | 175 | 74 | | 이재우 | 1980-02-09 | 투수 | 우투우타 | 183 | 82 | | 장성호 | 1977-10-18 | 내야수 | 좌투좌타 | 183 | 92 | | 우규민 | 1985-01-21 | 투수 | 우언우타 | 184 | 75 | +-----------+------------+-----------+--------------+--------+--------+ 10 rows in set (0.00 sec)
2.2.4 SQL의 커멘드라인 실행
먼저 sql스크립트를 파일로 저장(예:
\Users\Desktop\test.sql)mysql 명령 프롬프트에서 실행
mysql> source \Users\Desktop\test.sql;명령프롬프트 consol에서 실행
C:\Users\Desktop> mysql -u user_id -p user_passwd db_name < test.sql
2.2.5 테이블의 속성변경(ALTER)
컬럼추가
ALTER TABLE [table_name] ADD [col_name] [column_type];컬럼 제거
ALTER TABLE [table_name] DROP [col_name];칼럼속성 변경
# 속성변경 ALTER TABLE [table_name] MODIFY COLUMN [column_name column_type...]; # 컬럼명 + 속성변경 ALTER TABLE [table_name] CHANGE [old_name] [new_name] [column_type];테이블의 속성 변경
ALTER TABLE [table_name] default character set utf8 collate utf8_general_ci;테이블이름 변경
ALTER TABLE [table_name] RENAME [changed_table_name];
컬럼추가 (ADD): student 테이블에 age컬럼 추가, 속성을 int
ALTER TABLE student ADD age int;- 결과 age컬럼값들은 모두 null값
컬럼 제거 (DROP): student 테이블에서 idnum컬럼 제거
ALTER TABLE student DROP idnum;- (주의) 이 명령은 모든 데이터베이스에서 지원하지 않음
칼럼 이름변경
ALTER TABLE address CHANGE old_name new_firstname varchar(15) NOT NULL;
2.2.6 테이블 데이터의 수정
UPDATE 문: 테이블 [table_name]의 condition statement 조건에 맞는 행들을 찾아 컬럼 column_name의 값을 value로 치환
UPDATE [table_name] SET [column_name = value] WHERE [condition statement];
예시
UPDATE pet SET birth="1989-08-31"; # birth 컬럼의 모든 값들을 변경 UPDATE pet SET birth="1989-08-31" WHERE name="Bowser"; # 조건에 해당되는 행의 컬럼값들만 변경
2.3 테이블로부터 자료 검색
2.3.1 기본 검색
SQL 구문
SELECT [target] FROM [tbl_name] WHERE [condition];
- 검색하려는 컬럼들을 쉼표(
,)로 분리 - 모든 열을 검색
* WHERE검색조건 (condition)
2.3.2 모든 데이터 검색
mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name | owner |species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+--------+---------+------+------------+------------+2.3.3 특정 열의 선택
- 관심있는 열(column)들만 검색: 열이름을 쉼표로 구분
name, birth열 검색
SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+2.3.4 중복된 행을 없애기 (distinct 이용)
SELECT distinct owner FROM pet;
+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+2.3.5 조건 검색 (WHERE)
pet 테이블에서 name이 ’Bower’인 레코드만 검색
SELECT * FROM pet WHERE name = "Bower"; +--------+-------+---------+-----+------------+------------+ | name | owner | species | sex | birth | death | +--------+-------+---------+-----+------------+------------+ | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+-------+---------+-----+------------+------------+1998년 이후에 태어난 동물 검색
SELECT * FROM pet WHERE birth >= "1998-1-1" +----------+-------+---------+-----+------------+------+ | name | owner | species | sex | birth |death | +----------+-------+---------+-----+------------+------+ | Chirp y | Gwen | bird | f | 1998-09-11 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+-------+---------+-----+------------+------+AND: (species=‘dog’)이면서 (sex=‘f’)인 동물 검색SELECT * FROM pet WHERE species = "dog" AND sex = "f"; +----------+--------+---------+-----+------------+-------+ | name | owner | species | sex | birth | death | +----------+--------+---------+-----+------------+-------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | +----------+--------+---------+-----+------------+-------+OR: species=‘snake’)이거나 (species=‘bird’)인 동물 검색SELECT * FROM pet WHERE species = "snake" OR species = "bird"; +----------+-------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+-------+ | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | +----------+-------+---------+------+------------+-------+AND/OR조합SELECT * FROM pet WHERE (species = "cat" AND sex = "m") OR (species = "dog" AND sex = "f"); +-------+--------+--------+-----+------------+-------+ | name | owner |species | sex | birth | death | +-------+--------+--------+-----+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+--------+-----+------------+-------+
2.3.6 특정 행과 열의 조합
- (WHERE 절을 이용) + (열이름을 지정)
- dog와 cat에 대해서만 name, species, birth을 검색
SELECT name, species, birth FROM pet WHERE species = "dog" OR species = "cat"; +--------+---------+------------+ | name | species | birth | +--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | |Bowser | dog | 1989-08-31 | +--------+---------+------------+
2.3.7 행 정렬(ORDER BY)
birth을 기준 정렬SELECT name, birth FROM pet ORDER BY birth; +----------+------------+ | name | birth | +----------+------------+ | Buffy | 1989-05-13 | | Bowser | 1989-08-31 | | Fang | 1990-08-27 | | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Slim | 1996-04-29 | | Whistler | 1997-12-09 | | Chirpy | 1998-09-11 | | Puffball | 1999-03-30 | +----------+------------+역순으로 정렬: desc 키워드를 열 이름 뒤에
SELECT name, birth FROM pet ORDER BY birth desc; +----------+------------+ | name | birth | +----------+------------+ | Puffball | 1999-03-30 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Claws | 1994-03-17 | | Fluffy | 1993-02-04 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Buffy | 1989-05-13 | +----------+------------+여러 열에 대해 정렬: name으로 정렬하고, 생일(birth) 역순 정렬
SELECT name, species, birth FROM pet ORDER BY species, birth DESC; +----------+---------+------------+ | name | species | birth | +----------+---------+------------+ | Chirpy | bird | 1998-09-11 | | Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | | Buffy | dog | 1989-05-13 | | Puffball | hamster | 1999-03-30 | | Slim | snake | 1996-04-29 | +----------+---------+------------+
2.4 패턴 검색
2.4.1 패턴일치 기능(LIKE/REGEXP)을 이용한 검색
- SQL에서 패턴일치기능은 보다 빠르고 정교하게 원하는 조건에 대한 매우 유용한 검색방법임
- LIKE 혹은 REGEXP(정규 표현식)를 이용
2.4.2 LIKE를 이용한 패턴 일치 검색
LIKE구문에서 패턴표현 기호
_: 임의의 한 문자%는 임의의 수의 문자(0개의 문자를 포함) (예)b%: `b’로 시작하는 패턴- LIKE를 이용한 패턴에서 대소문자는 구분하지 않음
LIKE를 이용한 패턴일치 검색의 예
정확하게 5개의 글자로 이루어진 이름(name)에 대한 검색: 밑줄(
_) 5개를 사용하여 검색조건을 나타낸다.mysql> SELECT * FROM pet WHERE name LIKE "_____"; +-------+--------+---------+-----+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+-----+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+-----+------------+-------+이름(name)이
b로 시작하는 패턴 검색mysql> SELECT * FROM pet WHERE name LIKE "b%"; +--------+--------+---------+-----+------------+-----------+ | name | owner | species | sex | birth | death | +--------+--------+---------+-----+------------+-----------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+-----+------------+-----------+이름(name)이
fy로 끝나는 패턴 검색mysql> SELECT * FROM pet WHERE name LIKE "%fy"; +--------+--------+---------+-----+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+-----+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+-----+------------+-------+이름(name)에
w가 포함된 패턴에 대한 검색mysql> SELECT * FROM pet WHERE name LIKE "%w%"; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+
2.4.3 정규표현에 의한 패턴 일치(REGEXP)
- 정규표현(regular expression)에 기반한 패턴일치 검색 -
REGEXP을 사용 - 정규표현식에 사용되는 문자 및 용도
.: 문자 하나
*: 앞에 나온 문자의 0개 이상의 반복^: 문자열 처음
[^ ]: 부정$: 문자열 끝
[ ]: 괄호안의 문자들 중 하나이상과 일치
( ): 하위식,abc|adc = a(b|d)c{m,n}: 반복연산자(m회이상, n회이하), 예를들어 5번 반복할 때{5}
LIKE vs REGEXP
//ffy가 포함된 것 SELECT * FROM pet WHERE name REGEXP "ffy"; //반드시 ffy 인 것 SELECT * FROM pet WHERE name LIKE "ffy";정규표현 예제
[abc]: 문자a나b나c중 하나를 가르키는 표현[a-zA-Z]: 알파벳 문자를 하나라도 포함하는 표현 (정규표현은 대소문자를 구별)x*:x, xx, xxx ...를 나타낸다.[0-9]*: 7, 12, 345, 678등 임의의 길이를 갖는 수^abc: 처음에 abc로 시작하는 패턴[^abc]: abc가 아닌 패턴abc$:abc로 끝나는 문자열 패턴이름(name)이
b혹은B로 시작하는 조건검색mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; +--------+--------+---------+-----+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+-----+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+-----+------------+------------+fy로 끝나는 이름검색 ($를 사용)mysql> SELECT * FROM pet WHERE name REGEXP "fy$"; +--------+--------+---------+-----+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+-----+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+-----+------------+-------+정확하게 5개의 문자로 이름어진 값 검색
//정규 표현 SELECT * FROM pet WHERE name REGEXP "^.....$"; //정규표현(반복 연산자) SELECT * FROM pet WHERE name REGEXP "^.{5}$"; //LIKE 표현 SELECT * FROM pet WHERE name LIKE "_____";
2.4.4 연습문제
- 아래와 같이 baseball 테이블에서 ‘동국대’ 출신 투수를 검색하여라.
Result
+-----------+----------+-------------------------------------------------------------------------------------+ | player | position | career | +-----------+----------+-------------------------------------------------------------------------------------+ | 류택현 | 투수 | 도곡초-신일중-휘문고-동국대-OB | | 노성호 | 투수 | 서흥초-상인천중-화순고-동국대 | | 이대환 | 투수 | 춘천초-춘천중-춘천고-동국대-현대-상무-우리-히어로즈-넥센-LG | | 이동걸 | 투수 | 언북초-휘문중-휘문고-동국대-삼성 | | 박희수 | 투수 | 유천초-한밭중-대전고-동국대-SK-상무 | | 하해웅 | 투수 | 금동초(김해리틀)-내동중-김해고-동국대 | | 최병욱 | 투수 | 동천초-경주중-경주고-동국대 | | 여정호 | 투수 | 동일초-부산중-부산상고-동국대 | +-----------+----------+-------------------------------------------------------------------------------------+ 8 rows in set (0.00 sec)
참고 SQL 보기
select player, position, career from baseball
where career like "%동국대%" AND position = "투수";
2.5 집계함수 이용
2.5.1 집계함수를 이용한 요약정보의 검색
| 집단함수 | 의미 |
|---|---|
| COUNT | 행의 개수 |
| SUM | NULL을 제외한 모든 행의 합계 |
| AVG | NULL을 제외한 모든 행의 평균값 |
| MAX | NULL을 제외한 모든 행의 최대값 |
| MIN | NULL을 제외한 모든 행의 최소값 |
| STDEV, STD | 표본 표준편차 |
| STDEV_POP | 모표준편차 |
| VARIANCE, VAR_SAMP | 표본 분산 |
| VAR_POP | 모분산 |
2.5.2 행수 세기: COUNT
레코드의 수 : count()함수 사용
mysql> SELECT COUNT(*) FROM pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+각 소유주가 소유한 애완동물의 수
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+
2.5.3 COUNT()와 GROUP BY
각 종에 해당하는 동물의 수
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+성에 따른 동물의 수
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+
2.5.4 COUNT 이용한 요약정보의 검색
종과 성에 따른 동물의 수
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex |COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+개와 고양이의 경우에만 각 성별 마리 수
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE species = "dog" OR species = "cat" -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
2.5.6 GROUP BY + HAVING
HAVING절은GROUP BY절과 같이 사용되며, GROUP BY절에 명시된 열에 대한 제약조건SELECT ID_LEC COUNT(*) AS N_REG, AVG(FINAL) AS MEAN_FINAL FROM LECTURES GROUP BY ID_LEC HAVING COUNT(*) >= 5;
2.5.7 연습문제
baseball 테이블에서 포지션(position)별 야구선수의 수를 구하라.
baseball 테이블에서 포지션(position)별 야구선수의 키와 몸무게의 평균을 구하라.
customers 테이블에서 성별 2012구매건수와 2012구매금액의 평균, 표준편차를 구하라.
아래 SQL문을 해석하라.
select 성별, count(*) as 구매건수, AVG(2012구매금액) as 구매금액평균, STD(2012구매금액) as 구매금액표준편차 from customers group by 성별 having 성별 != 0;아래 SQL문을 실행하고 결과를 쓰시오.
select 성별, count(*) as '구매건수(건)', round(AVG(2012구매금액)/1000, 2) as '구매금액평균(천원)', ROUND(STD(2012구매금액)/1000, 2) as '구매금액표준편차(천원)' from customers group by 성별;
2.5.8 기타 MySQL 함수들
| 함수 | 설명 |
|---|---|
| ABS(n) | 절대값 출력. |
| ROUND(n, 자릿수) | 반올림 |
| TRUNCATE(n,자릿수) | 버림 |
| POW(X,Y) | POWER(X,Y) |
| MOD(분자, 분모) | 나머지(%) |
| GREATEST(n1,n2,…) | 최대값 |
| LEAST(n1,n2,…) | 최소값 |
| CONCAT(s1,s2,…) | 문자열 연결 |
| REPLACE(s1,a,r) | 문자열 중 a를 r로 치환 |
| SUBSTRING(s,start,n) | 문자열부분추출 |
| SUBSTRING_INDEX(s, d, n) | 구분자로 문자열 자르기 |
| IF(논리식,tr,fa) | 참:tr,거짓:fa출력 |
| CAST(변수 AS TYPE) | 형변환 |
| REPLACE(문자, f, t) | 문자열에서 f를 t로 바꿈 |
출처: https://yeahvely.tistory.com/89 [나홀로 쿠킹]
난수발생 RAND()
SELECT id,name FROM STUDENT ORDER BY RAND() LIMIT 5; +----+--------+ | id | name | +----+--------+ | 3 | 이수만 | | 2 | 임성훈 | | 6 | 박수홍 | | 12 | 정윤호 | | 13 | 권보아 | +----+--------+문자열 분리(substring)
SELECT player, position, substring(birth, 1, 4) as YEAR FROM jskim.baseball WHERE substring(birth, 1, 4) = '1993'; +-----------+-----------+------+ | player | position | YEAR | +-----------+-----------+------+ | 박민우 | 내야수 | 1993 | | 이민호 | 투수 | 1993 | | 이현동 | 투수 | 1993 | | 김재현 | 포수 | 1993 | | 김성욱 | 외야수 | 1993 | | 권택형 | 투수 | 1993 | | 이태양 | 투수 | 1993 | | 임기영 | 투수 | 1993 | | 심창민 | 투수 | 1993 | | 장시윤 | 내야수 | 1993 | | 한현희 | 투수 | 1993 | | 변진수 | 투수 | 1993 | | 한승혁 | 투수 | 1993 | | 김태형 | 투수 | 1993 | | 허건엽 | 투수 | 1993 | | 유영하 | 투수 | 1993 | +-----------+-----------+------+ 16 rows in set (0.01 sec)문자열 결합 CONCAT()
SELECT id, CONCAT(name,"(",alias,")") AS "이름(별명)" FROM STUDENT; +----+---------------------+ | id | 이름(별명) | +----+---------------------+ | 1 | 조용필(작은거인) | | 2 | 임성훈() | | 3 | 이수만() | | 4 | 임예진() | .... | 9 | 한채영(바비인형) | | 10 | 박수애(리틀 정윤희) | | 11 | 허영란(까치) | | 12 | 정윤호(꼬비) | | 13 | 권보아() | | 14 | 문근영(국민 여동생) | +----+---------------------+문자열을 정수로 변환 CAST(컬럼 AS 새로운타입)
SELECT player, CAST(ann_sal AS UNSIGNED) '연봉' FROM jskim.baseball ORDER BY CAST(ann_sal AS UNSIGNED) DESC limit 10; SELECT player, ann_sal AS '연봉' FROM jskim.baseball ORDER BY ann_sal + 1 DESC limit 10; +--------------+--------+ | player | 연봉 | +--------------+--------+ | 앨버스 | 700000 | | 나이트 | 410000 | | 티포드 | 400000 | | 니퍼트 | 387000 | | 유먼 | 360000 | | 밴헤켄 | 350000 | | 에릭 | 300000 | | 레이예스 | 300000 | | 찰리 | 300000 | | 로티노 | 270000 | +--------------+--------+ 10 rows in set, 44 warnings (0.01 sec)
2.5.9 실습
아래코드의 의미와 실행 결과는?
SELECT player, ann_sal FROM jskim.baseball where ann_sal regexp '[^0-9]' limit 10;baseball 테이블에서 연봉(ann_sal)에 있는 문자를 없애라.
+-----------+--------------+
| player | ann_sal |
+-----------+--------------+
| 조쉬벨 | 250000달러 |
| 로티노 | 270000달러 |
| 칸투 | 250000달러 |
| 찰리 | 300000달러 |
| 나바로 | 250000달러 |
| 테임즈 | 250000달러 |
| 마야 | 175000달러 |
| 밴헤켄 | 350000달러 |
| 울프 | 250000달러 |
| 나이트 | 410000달러 |
+-----------+--------------+
SQL
SELECT player, REPLACE(ann_sal, '달러', '') AS '연봉' FROM jskim.baseball
ORDER BY ann_sal + 1 DESC limit 10;
baseball 테이블에서 학력(career)에서 출신 초등학교를 추출해라.
SELECT player, SUBSTRING_INDEX(career, '-', 1) AS '초등학교' FROM jskim.baseball where career REGEXP '초$' GROUP BY SUBSTRING_INDEX(career, '-', 1);아래의 SQL코드를 해석하고 어떤 결과가 나오는지를 예상하시오.
SELECT SUBSTRING_INDEX(career, '-', 1) AS '초등학교', COUNT(*) FROM jskim.baseball GROUP BY SUBSTRING_INDEX(career, '-', 1) ORDER BY COUNT(*) DESC limit 10;
2.6 SQL 변수 선언 및 활용
- 사용자 정의 변수의 선언
SET @변수명 = 변수값; # 또는 SET @변수명 := 변수값;
예제
SET @first_name = "김%"; SELECT player, birth FROM jskim.baseball WHERE player LIKE @first_name LIMIT 10; +-----------+------------+ | player | birth | +-----------+------------+ | 김주현 | 1988-04-16 | | 김재현 | 1991-08-30 | | 김하성 | 1995-10-17 | | 김강민 | 1982-09-13 | | 김동조 | 1990-01-28 | | 김연훈 | 1984-12-23 | | 김연훈 | 1984-12-23 | | 김선빈 | 1989-12-18 | | 김민성 | 1988-12-17 | | 김태완 | 1981-09-19 | +-----------+------------+ 10 rows in set (0.00 sec)
2.7 실습데이터
- 아래의 실습데이터를 각각 테이블로 만드시오.
- 영화데이터
ID,title,장르,국가,상영시간,개봉일,관람등급,감독
1,테스와보낸여름,드라마,네덜란드|독일,84분,2020.09.10,전체관람가,스티븐바우터루드
2,뮬란,모험|드라마|가족,미국,115분,2020.09.17,12세관람가,니키카로
3,오!문희,코미디|드라마,한국,109분,2020.09.02,12세관람가,정세교
4,테넷,액션|SF,영국|미국,150분,2020.08.26,12세관람가,크리스토퍼놀란
5,인터스텔라,SF,미국|영국,169분,2016.01.14,12세관람가,크리스토퍼놀란
6,인셉션,액션|모험|SF|스릴러,미국|영국,147분,2020.08.12,12세관람가,크리스토퍼놀란```
DROP TABLE IF EXISTS jskim.ratings;
DROP TABLE IF EXISTS jskim.actors;
DROP TABLE IF EXISTS jskim.movie;
CREATE TABLE jskim.movie(
MID INT PRIMARY KEY NOT NULL,
title VARCHAR(100) NOT NULL,
genre VARCHAR(100) NOT NULL,
country VARCHAR(50) NOT NULL,
runtime VARCHAR(10) NOT NULL,
open_date DATE NOT NULL,
grade VARCHAR(20) NOT NULL,
director VARCHAR(50) NOT NULL
)DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
CREATE TABLE jskim.actors(
NO INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
MID INT NOT NULL,
actors VARCHAR(30) NOT NULL,
FOREIGN KEY(MID) REFERENCES jskim.movie(MID)
)DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
CREATE TABLE jskim.ratings(
NO INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
MID INT NOT NULL,
rating INT NOT NULL,
comment TEXT,
date DATE,
FOREIGN KEY(MID) REFERENCES jskim.movie(MID)
)DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;INSERT INTO jskim.movie (MID, title, genre, country, runtime, open_date, grade, director) VALUES (1,'테스와보낸여름','드라마','네덜란드|독일','84분','2020.09.10','전체관람가','스티븐바우터루드');
INSERT INTO jskim.movie (MID, title, genre, country, runtime, open_date, grade, director) VALUES (2,'뮬란','모험|드라마|가족','미국','115분','2020.09.17','12세관람가','니키카로');
INSERT INTO jskim.movie (MID, title, genre, country, runtime, open_date, grade, director) VALUES (3,'오!문희','코미디|드라마','한국','109분','2020.09.02','12세관람가','정세교');
INSERT INTO jskim.movie (MID, title, genre, country, runtime, open_date, grade, director) VALUES (4,'테넷','액션|SF','영국|미국','150분','2020.08.26','12세관람가','크리스토퍼놀란');
INSERT INTO jskim.movie (MID, title, genre, country, runtime, open_date, grade, director) VALUES (5,'인터스텔라','SF','미국|영국','169분','2016.01.14','12세관람가','크리스토퍼놀란');
INSERT INTO jskim.movie (MID, title, genre, country, runtime, open_date, grade, director) VALUES (6,'인셉션','액션|모험|SF|스릴러','미국|영국','147분','2020.08.12','12세관람가','크리스토퍼놀란');- 배우데이터
INSERT INTO jskim.actors (MID,actors) VALUES (6,'레오나르도디카프리오');
INSERT INTO jskim.actors (MID,actors) VALUES (6,'와타나베켄');
INSERT INTO jskim.actors (MID,actors) VALUES (6,'조셉고든레빗');
INSERT INTO jskim.actors (MID,actors) VALUES (5,'매튜맥커너히');
INSERT INTO jskim.actors (MID,actors) VALUES (5,'앤해서웨이');
INSERT INTO jskim.actors (MID,actors) VALUES (5,'마이클케인');
INSERT INTO jskim.actors (MID,actors) VALUES (4,'데이비드워싱턴');
INSERT INTO jskim.actors (MID,actors) VALUES (4,'로버트패틴슨');
INSERT INTO jskim.actors (MID,actors) VALUES (4,'엘리자베스데비키');
INSERT INTO jskim.actors (MID,actors) VALUES (3,'나문희');
INSERT INTO jskim.actors (MID,actors) VALUES (3,'이희준');
INSERT INTO jskim.actors (MID,actors) VALUES (3,'최원영');
INSERT INTO jskim.actors (MID,actors) VALUES (3,'박지영');
INSERT INTO jskim.actors (MID,actors) VALUES (3,'이진주');
INSERT INTO jskim.actors (MID,actors) VALUES (2,'유역비');
INSERT INTO jskim.actors (MID,actors) VALUES (2,'이연걸');
INSERT INTO jskim.actors (MID,actors) VALUES (2,'공리');
INSERT INTO jskim.actors (MID,actors) VALUES (2,'견자단');
INSERT INTO jskim.actors (MID,actors) VALUES (2,'제이슨스콧리');
INSERT INTO jskim.actors (MID,actors) VALUES (1,'소니코프스판우테렌');
INSERT INTO jskim.actors (MID,actors) VALUES (1,'조세핀아렌센');
INSERT INTO jskim.actors (MID,actors) VALUES (1,'트에보게리츠마');
- 평점데이터
MID|rating|comment|date
6|10|놀란좋아하다 사랑하게된작품|2020.08.23
6|10| |2020.08.23
6|10|진짜 감독 천재...|2020.08.22
6|9| |2020.09.20
6|10|와.. 이걸 이제야 보다니 같이 보는데 서로 누가맞네 다퉜네요 ㅋㅋㅋ|2020.09.19
6|10|지려버렸자나 10번은 본듯|2020.09.19
6|8|결말을 바꿧어도 더 찡할뻔했다. 영화를 다 보고나서야 꿈에서 빠져나온듯한 기분이었다. 쉽지많은 않은영화였지만 2번째본것으로 어느정도는 이해할수있었다. 감독이 천재|2020.09.19
6|10|'의식' '무의식' '잠재의식' 조차 구분못하는 번역가 박지훈 그는 도대체...|2020.09.17
6|10|마지막 15분부터 bgm 528491 이 나오는 순간 내 온몸의 구멍이란 구멍에서 모든 물이 쏟아져 나올뻔 했다|2020.09.17
3|4|걍그저그랫음 cg티도넘 나고 ㅂㄹ|2020.09.23
3|1|나는 드디어 네이버 평점에 알바 혹은 관계자가 많이 섞여잇다는 확신을 할 수 있게 되었다. 개노잼 찐노잼 쌉쌉노잼인데 평점 도랏다|2020.09.23
3|10|보길잘해쓰 이희준연기좋아요|2020.09.23
3|10|최원영 배우 그냥 딱 강형사 같아요ㅋㅋㅋ 연기 대박|2020.09.23
3|2|한국영화의 허약한 체질.어르신의 안 좋은 건강가지고 히트를 노렸냐?|2020.09.23
3|10|남자인 나도 보는내내 펑펑울었다 ! 보는내내 가슴이 미여짐 ! 너무 잘만들어진 영화 !|2020.09.22
3|9|이희준님 연기가 너무 좋았습니다. 나문희님을 보며 어머니 생각이 많이 났네요. 고생 많으셨습니다. 행복했습니다.|2020.09.22
3|1|돈주고 보기에는 아깝습니다..|2020.09.22
3|1|역대급 쓰레기 영화 cg도 개연성도 재미도 없음|2020.09.22
3|10| |2020.09.22
2|1|이걸 뭐라표현해야할지.. 스토리는 원작이랑 달라도 한참 다르고 계속 산으로가고 마녀는 왜넣은건지? 재미도 감동도 없고 후반부에 갑자기 착해지는것도 이상함. 그리고 정말 후진 중국 무협영화냄새남.|2020.09.17
2|6|관람객 원작을 뛰어넘는 작품은 없다지만 굳이 끼워넣은 인위적인 설정과 무미건조한 주인공의 표정, 고증없이 나열된 영화 속 동양의 세계에 실망스러웠습니다. 심지어 영화를 관통하는 큰 가치가 악역 보리 칸에게도 존재해 이 사...|2020.09.17
2|2|관람객 디즈니 애니를 재밌게 본지라 기대가 많았지만 스토리나 연기. 스토리. 음악등이 매우 빈약하고 아쉬웠다.|2020.09.18
2|4|관람객 킬링타임용 영상미는 좋으나 스토리등 유치하고 별로 원작보다노잼임|2020.09.18
2|1|이걸 한번 볼바엔 반도를 10번 보겠습니다2020.09.17
2|1|10점 뭐냐? 댓글 알바임? 디즈니한테 실망함. (출연진은 제대로 뽑자.)|2020.09.17
2|1|유역비가 홍콩 진압하는 경창들 응원하는 포스트햇던데 그 사람이 나오는영화 보는놈들은 중국지지하냐? 그리고, 디즈니는 스타워즈에 되도않는 PC를 쳐넣드만 중국에 휘말려서 뭔 홍콩, 대만 무시하는 배우를 넣지 않나, 인...|2020.09.17
2|1|관람객 일단... 디지스타일의 애니메이션은 노래와 시대적 센스를 반영해서 재구성한 작품으로 호불호가 갈림에도 역시 디즈니!! 답다라는 평을 주는데... 이건.. 그냥 진지한 중국 무협영화를 영어로 보는 느낌? 스토리야 디즈...|2020.09.19
2|6|관람객 별 로 재 미 없 습 니 다 ; ; ;|2020.09.18
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 10 , "놀란좋아하다 사랑하게된작품" , "2020.08.23");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 10 , " ", "2020.08.23");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 10 , "진짜 감독 천재..." , "2020.08.22");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 9 ," ", "2020.09.20");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 10 , "와.. 이걸 이제야 보다니 같이 보는데 서로 누가맞네 다퉜네요 ㅋㅋㅋ ", "2020.09.19");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 10 , "지려버렸자나 10번은 본듯 ", "2020.09.19");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 8 , "결말을 바꿧어도 더 찡할뻔했다. 영화를 다 보고나서야 꿈에서 빠져나온듯한 기분이었다. 쉽지많은 않은영화였지만 2번째본것으로 어느정도는 이해할수있었다. 감독이 천재 ", "2020.09.19");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 10 , "'의식' '무의식' '잠재의식' 조차 구분못하는 번역가 박지훈 그는 도대체... ", "2020.09.17");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(6 , 10 , "마지막 15분부터 bgm 528491 이 나오는 순간 내 온몸의 구멍이란 구멍에서 모든 물이 쏟아져 나올뻔 했다 ", "2020.09.17");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 4 , "걍그저그랫음 cg티도넘 나고 ㅂㄹ ", "2020.09.23");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 1 , "나는 드디어 네이버 평점에 알바 혹은 관계자가 많이 섞여잇다는 확신을 할 수 있게 되었다. 개노잼 찐노잼 쌉쌉노잼인데 평점 도랏다 ", "2020.09.23");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 10 , "보길잘해쓰 이희준연기좋아요 ", "2020.09.23");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 10 , "최원영 배우 그냥 딱 강형사 같아요ㅋㅋㅋ 연기 대박 ", "2020.09.23");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 2 , "한국영화의 허약한 체질.어르신의 안 좋은 건강가지고 히트를 노렸냐? ", "2020.09.23");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 10 , "남자인 나도 보는내내 펑펑울었다 ! 보는내내 가슴이 미여짐 ! 너무 잘만들어진 영화 ! ", "2020.09.22");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 9 , "이희준님 연기가 너무 좋았습니다. 나문희님을 보며 어머니 생각이 많이 났네요. 고생 많으셨습니다. 행복했습니다. ", "2020.09.22");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 1 , "돈주고 보기에는 아깝습니다.. ", "2020.09.22");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 1 , "역대급 쓰레기 영화 cg도 개연성도 재미도 없음 ", "2020.09.22");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(3 , 10 , " ", "2020.09.22");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 1 , "이걸 뭐라표현해야할지.. 스토리는 원작이랑 달라도 한참 다르고 계속 산으로가고 마녀는 왜넣은건지? 재미도 감동도 없고 후반부에 갑자기 착해지는것도 이상함. 그리고 정말 후진 중국 무협영화냄새남. ", "2020.09.17");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 6 , "관람객 원작을 뛰어넘는 작품은 없다지만 굳이 끼워넣은 인위적인 설정과 무미건조한 주인공의 표정, 고증없이 나열된 영화 속 동양의 세계에 실망스러웠습니다. 심지어 영화를 관통하는 큰 가치가 악역 보리 칸에게도 존재해 이 사... ", "2020.09.17");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 2 , "관람객 디즈니 애니를 재밌게 본지라 기대가 많았지만 스토리나 연기. 스토리. 음악등이 매우 빈약하고 아쉬웠다. ", "2020.09.18");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 4 , "관람객 킬링타임용 영상미는 좋으나 스토리등 유치하고 별로 원작보다노잼임 ", "2020.09.18");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 1 , "이걸 한번 볼바엔 반도를 10번 보겠습니다2020.09.17");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 1 , "10점 뭐냐? 댓글 알바임? 디즈니한테 실망함. (출연진은 제대로 뽑자.) ", "2020.09.17");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 1 , "유역비가 홍콩 진압하는 경창들 응원하는 포스트햇던데 그 사람이 나오는영화 보는놈들은 중국지지하냐? 그리고, 디즈니는 스타워즈에 되도않는 PC를 쳐넣드만 중국에 휘말려서 뭔 홍콩, 대만 무시하는 배우를 넣지 않나, 인... ", "2020.09.17");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 1 , "관람객 일단... 디지스타일의 애니메이션은 노래와 시대적 센스를 반영해서 재구성한 작품으로 호불호가 갈림에도 역시 디즈니!! 답다라는 평을 주는데... 이건.. 그냥 진지한 중국 무협영화를 영어로 보는 느낌? 스토리야 디즈... ", "2020.09.19");
INSERT INTO jskim.ratings (MID,rating,comment,date) VALUES(2 , 6 , "관람객 별 로 재 미 없 습 니 다 ; ; ; ", "2020.09.18");mysql> SELECT MID, rating,substring(comment,1,10) AS comments FROM jskim.ratings;
+-----+--------+------------------------------+
| MID | rating | comments |
+-----+--------+------------------------------+
| 6 | 10 | 놀란좋아하다 사랑하 |
| 6 | 10 | |
| 6 | 10 | 진짜 감독 천재.. |
| 6 | 9 | |
| 6 | 10 | 와.. 이걸 이제야 |
| 6 | 10 | 지려버렸자나 10번 |
| 6 | 8 | 결말을 바꿧어도 더 |
| 6 | 10 | '의식' '무의식' |
| 6 | 10 | 마지막 15분부터 |
| 3 | 4 | 걍그저그랫음 cg티 |
| 3 | 1 | 나는 드디어 네이버 |
| 3 | 10 | 보길잘해쓰 이희준연 |
| 3 | 10 | 최원영 배우 그냥 |
| 3 | 2 | 한국영화의 허약한 |
| 3 | 10 | 남자인 나도 보는내 |
| 3 | 9 | 이희준님 연기가 너 |
| 3 | 1 | 돈주고 보기에는 아 |
| 3 | 1 | 역대급 쓰레기 영화 |
| 3 | 10 | |
| 2 | 1 | 이걸 뭐라표현해야할 |
| 2 | 6 | 관람객 원작을 뛰어 |
| 2 | 2 | 관람객 디즈니 애니 |
| 2 | 4 | 관람객 킬링타임용 |
| 2 | 1 | 10점 뭐냐? 댓글 |
| 2 | 1 | 유역비가 홍콩 진압 |
| 2 | 1 | 관람객 일단... |
| 2 | 6 | 관람객 별 로 재 |
+-----+--------+------------------------------+