비밀번호가 존재하는 mysql 을 실행하기 위해서는 아래와 같은 명령어를 입력한다.

mysql --user=username db_name -p

'주식필터프로그램 제작하기 > MYSQL' 카테고리의 다른 글

mysql 실행 명령어  (0) 2020.12.16

비밀번호가 존재하는 mysql 을 실행하기 위해서는 아래와 같은 명령어를 입력한다.

mysql --user=username db_name -p

'주식필터프로그램 제작하기 > MYSQL' 카테고리의 다른 글

mysql 실행 명령어  (0) 2020.12.16

지난 포스팅에서는 pymysql 로 mysql을 제어하는법을 알아 보았다.
그런데 포스팅한대로 쿼리를 보내다 보니,
갑자기 DELETE와 INSERT명령어로 요청한 쿼리가 실제 DB에 반영이 안되는 현상이 나타났다.

아래 세 가지가 동시에 나타난다면 이 글이 매우 도움이 될 것 이다.

[현상]

1. python에서 mySQL로 쿼리를 전송하는 명령어를 실행할 때 빌드 오류가 없다.
2. 쿼리 실행 시, python 터미널 창에서는 쿼리에 대한 RESPONSE가 정상적이다.
3. 그러나 mySQL에서 확인한 최종 DB는 변함이 없다.

 

[문제의 CODE]

conn = pymysql.connect(user='user', password='pasword', host = 'host', database = 'database')
cur = conn.cursor()
cur.execute("DELETE FROM `database`,`table`")
cur.close()
conn.close()

 

[수정된 CODE]

conn = pymysql.connect(user='user', password='pasword', host = 'host', database = 'database')
cur = conn.cursor()
cur.execute("DELETE FROM `database`,`table`")
cur.close()
conn.commit()

conn.close()

[해설]

conn.commit() 한줄만 추가하면 된다.
보통 수많은 예제들이 commit 없이,
cursor와 connection만 close를 하는데, 그렇게 되면 mySQL에 반영이 되지 않는다.

혹은 connection 을 만들 때, autocommit=TRUE 옵션을 추가하는것도 또하나의 방법이다.

둘중에는 보안상 더 안전한 commit()함수를 추천한다.

CTRL+ ENTER

명령어 예시 의미
SHOW DATABASES SHOW DATABASES 현재 서버에 어떤 DB가 있는지 보기
USE USE database_name database_name의 DB를 사용하겠다.
SHOW TABLES   DB에 있는 테이블 리스트를 보여줘
SHOW TABLE STATUS   DB에 있는 테이블 상세리스트를 보여줘를 상세히 보여줘
DESCRIBE(DESC) DESCRIBE table_name table_name 테이블의 정보를 보여줘
SELECT   데이터를 가져와
SELECT FROM SELECT * FROM table_name table_name 테이블에 있는 전체 정보를 보여줘
  SELECT colum_name FROM table_name table_name 테이블에 colum_name의 colum만 보여줘
  SELECT colum_name_1, colum_name_2 FROM table_name table_name 테이블에 colum_name_1과 colum_name_2의 colum만 보여줘
SELECT FROM WHERE SELECT * FROM table_name
WHERE 조건_1
※ 예) colum_name_1>10
※ OR, AND, NOT, =, <, >, <=, >=, <>, != 등 사용가능
table_name 테이블에 조건1에 맞는 행들만 보여줘
예) colum_name_1이 10보다 큰 행들만 보여줘
  SLEECT * FROM table_name
WHERE 조건_1 AND 조건2
table_name 테이블에 조건1과 조건2를 동시에 만족하는 행등만 보여줘
SELECT FROM WHERE
BETWEEN
SELECT * FROM table_name
WHERE colum_name BETWEEN 10 AND 100
colum_name이 10 이상 100이하인 데이터
SELECT FROM WHERE
IN
SELECT * FROM table_name
WHERE colum_name
IN('value_1', 'value_2', 'value_3')
colum_name이 value_1이거나 value_2이거나 value_3인 데이터
SELECT FROM WHERE
LIKE
SELECT * FROM table_name
WHERE colum_name
LIKE 'ABC_'
※_는 1글자 대체
ABC로 시작하는 네글자가 단어가있는 모든 데이터
  SELECT * FROM table_name
WHERE colum_name
LIKE 'ABC%'
※%는 2글자 이상 대체
ABC로 시작하는 단어가있는 모든 데이터
(SUB QUERY) SELECT * FROM table_name
WHERE colum_name = ( 
SELECT coum_name FROM table_name WHERE 조건)
쿼리문 안에 또다른 쿼리문이 있는 것
※ 서브 쿼리의 결과가 둘 이상이 되면 에러 발생
ANY (SUB QUERY) WHERE colum_name > ANY (SUB QUERY) 서브쿼리의 여러개의 결과 중 한가지만 만족해도 가능
※ =ANY 는 IN 과 동일한 의미
ANY는 SOME과 동일한 의미
ALL (SUB QUERY) WHERE colum_name > ALL (SUB QUERY) 서브쿼리의 모든 결과를 모두 만족해야 함
SELECT FROM ORDER BY SELECT * FROM table_name ORDER BY colum_name (ASC) colum_name을 기준으로 오름차순 정렬
  SELECT * FROM table_name ORDER BY colum_name DESC colum_name을 기준으로 내림차순 정렬
  SELECT * FROM table_name ORDER BY colum_name_1 ASC, colum_name_2 DESC Colum_name_1을 기준으로 오름차순 정렬
Colum_name_2을 기준으로 내림차순 정렬 
SELECT FROM WHERE ORDER BY    
 DISTINCT SELECT DISTINCT colum_name
FROM table_name
colum_name의 중복된 것은 1개씩만 보여주면서 출력 
 LIMIT SELECT * FROM table_name
ORDER BY colum_name
LIMIT 10
상위의 N개만 출력
※서버의 처리량을 줄이도록함
GROUP BY
(집계함수를 같이 사용
 ex. AVG, MIN, MAX, COUNT, COUNT(DISTINCT), STDEV, VARIANCE
SELECT colum_name_1
MAX(colum_name_2)
FROM table_name
GROUP BY colum_name_1
colum_name_1 기준으로 그룹화하는데 그중에서 colum_name_2가 가장 큰 데이터만 출력한다. 
GROUP BY AS SELECT colum_name_1
AVG(colum_name_2)
AS 'Average'
FROM table_name
GROUP BY colum_name_1
colum_name_1 기준으로 그룹화하는데 그중에서 colum_name_2의 평균값을 출력한다.
평균값 데이터의 colum_name은 Average로 표기한다.

  SELECT COUNT(*)
FROM table_name
 
  SELECT AVG(colum_name)
FROM table_name
 
Having   WHERE과 비슷한 개념으로 조건 제한
집계 함수에 대해서 조건 제한하는 편리한 개념
HAVING 절은 반드시 GROUP BY 절 다음에 나와야함
  SELECT colum_name_1,
MAX(colum_name_2)
FROM table_name
GROUP BY colum_name_1
HAVING MAX (colum_name_2) > 10
 
 ROLLUP   총합 또는 중간합계가 필요할 경우 사용
GROUP BY 절과 함께 WITH ROLUP 문으로 사용 
  SELECT colum_name_1,
Name,
SUM(colum_name_2)
FROM table_name
GROUP BY colum_name_1,
Name WITH ROLLUP
묶인 그룹의 총합을 각 그룹의 마지막 행에 출력한다.
JOIN SELECT *
FROM table_name_1
JOIN table_name_2
ON table_name1.colum = table_name2.colum
여러테이블에서 가져온 레크드롤 조합하여 하나의 테이블이나 결과 집합으로 표현
ON 뒤에는 합칠 조건
  SELECT *
FROM table_name_1
JOIN table_name_2
ON table_name1.colum = table_name2.colum
JOIN table_name_3
ON table_name_1.colum = table_name_3.colum
세개의 테이블 합칠경우
명령어 의미
LENGTH() SELECT LENGTH('ABC') 문자열 길이
CONCAT() SELECT CONCAT('A', 'B', 'C') 문자열 세개를 합쳐서 저장
※ 문자열 중 하나라도 NULL이 있으면 NULL 을 반환한다.
LOCATE() SELECT LOCATE('ABC', 'ABABBCABCABC') ->7 반환 문자열처음 나타나는 위치 찾기 (1부터)
찾는 문자열이 문자열 내에 존재하지 않으면 0을 반환
LEFT() SELECT LEFT('ABCD',3) -> ABC반환 문자열의 왼쪽부터 지정한 개수만큼 문자 반환
RIGHT() SELECT RIGHT('ABCD',3) ->BCD반환  
LOWER() SELECT LOWER('ABC') -> abc  
UPPER() SELECT UPPER('abc') ->ABC  
REPLACE() SELECT REPLACE('ABCDE', 'ABC', 'AAA') -> AAADE  
TRIM() SELECT TRIM(' 문자열 양쪽모두에 있는 특정문자를 제거
BOTH : 기본설정
제거할 문자를 명시하지 않으면 자동으로 "공백"을 제거 
TRIM(LEADING) SLECT TRIM(LEADING '@' FROM '@gmail.com@')
전달받은 문자열 앞에 존재하는 특정 문자를 제거
TRIM(TRAILING) SLECT TRIM(TRAILING '@' FROM '@gmail.com@') 전달받은 문자열 뒤에 존재하는 특정 문자를 제거
FORMAT SELECT FORMAT(숫자, 소숫점자리수) 숫자타입의 데이터를 세자리마다 쉼표 형식으로 변환
#,###,###.##
※ 반환되는 데이터 형식은 문자열 타입
※ 두번째 인수는 반올림할 소수 부분의 자릿수
FLOOR   내림
CEIL   올림
ROUND   반올림
SQRT   양의 제곱근
POW POW(밑수,지수) 거듭제곱
EXP EXP(지수) e의 거듭제곱
LOG   자연로그값
SIN, COS, TAN SIN(PI()/2)  
ABS   절대값
RAND ROUND(RAND()*100,0) 0.0보다 크거나 같고 1.0보다 작은 하나의 실수를 무작위로 생성
NOW   YYYY-MM-DD HH:MM:SS또는 
YYYYMMDDHHMMSS 형태로 반환
CURDATE   YYYY-MM-DD 또는 YYYYMMDD 반환
CURTIME   HH:MM:SS 또는 HHMMSS형태로 반환
DATE, MONTH, DAY, HOUR, MINUTE, SECOND    
MONTHNAME, DAYNAME    
DAYOFWEEK, DAYOFMONTH,
DAYOFYEAR
  WEEK : 일 = 1, 토 = 7
MONTH : 0~31
YEAR : 1~366
DATE_FORMAT DATE_FORMAT(NOW(), '%D %y %a %d %m %n %j') 형식에 맞춰 날짜와 시간을 반환
명령어 예제 의미
CREATE TABLE AS SELECT CREATE TABLE new_table_name
AS SELECT * FROM table_name
table_name 과 똑같은 new_table_name을 만든다
CREATE DATABASE CREATE DATABASE database_name database_name의 새로운 DB를 만든다.
CREATE TABLE CREATE TABLE table_name(
id INT NOT NULL PRIMARY KEY,
col1 INT NULL
col2 INT NULL
col3 INT NULL
)
colum 개수/속성을 정하면서 테이블 만듬
ALTER TABLE    
ALTER TABLE ADD ALTER TABLE table_name
ADD col4 INT NULL;
colum 추가
ALTER TABLE MODIFY ALTER TABLE table_name
MODIFY col4 VARCHAR(20) NULL;
colum 수정
ALTER TABLE DROP ALTER TABLE table_name
DROP col4;
colum 삭제
INDEX    
SHOW INDEX    
CREATE INDEX    
CREATE UNIQUE INDEX    
FULLTEXT INDEX    
ALTER TABLE INDEX    
DROP INDEX    
VIEW    
CREAT VIEW CREATE VEIW view_name AS
SELECT col1, col2
FROM table;
 
ALTER VIEW ALTER VEIW view_name AS
SELECT col1, col2, col3
FROM table;
 
DROP VIEW DROP VIEW view_name  
INSERT INSERT INTO table_name
VALUE(val_1, val_2, val_3);
table_name에 행을 추가함
INSERT INTO SELECT INSERT INTO table_name_1
SELECT * FROM table_name_2
table_name_2에 있는 행들을 table_name_1에 삽입
UPDATE UPDATE table_name
SET col1=1, col2=1, col3=1
기존에 있는 값 변경
※WHERE 안쓰면 설정한 값으로 모든 행 변경한다.
UPDATE WHERE UPDATE table_name
SET col1=1, col2=1, col3=1
WHERE colum_name = 1
colum_name이 1인 행의 값을 
1, 1, 1로 바꾼다.
DELETE DELETE FROM table_name 모든 행 다 없앰
※데이터는 지워지지만 테이블 용량은 줄어들지 않음
※삭제 후 잘못 삭제한 것은 되돌릴 수 있음
DELETE WHERE DELETE FROM table_name
WHERE colum_name = 1
colum_name이 1인 행을 없앰
TRUNCATE TRUNCATE TABLE table_name 모든 행 다 없앰
※ 용량 줄어들고, 인덱스 모두삭제
※ 테이블 삭제 않고 데이터만 삭제
※ 한꺼번에 다 지워야함
※ 삭제 후 되돌릴 수 없음
DROP TABLE DROP TABLE table_name table 완전삭제
DROP DATABASE DROP DATABASE database_name database 완전삭제

 

1. MYSQL 설치

    $ pip install PyMySQL

 

2. 파이썬에서 필수 명령어들

import pymysql #mysql 라이브러리 불러오기

conn = pymysql.connect(host ="localhost", user="root", passwd="****", db="mysql")
※ conn : 연결 객체,
   host : 연결주소( local 일 경우 localhost)
   user/paswd : 가입시 입력한 아이디 비밀번호
   db : ?????

cur = conn.cursor()  # 연결 객체로부터 커서를 만듬. (한 연결에 커서는 여러개일 수 있다.)

cur.execute("...") # cur.execute로 명령어 실행 (" ") 안에 명령어 입력
cur.execute("...")
cur.execute("...")
...
cur.execute("...")

print(cur.fetchone()) # 출력해보기 cur.fetchone() : 한 줄 씩 읽음
print(cur.fetchall()) # 출력해보기 cur.fetchall() : 전체 다 읽음

cur.close() # 커서객체 닫기
conn.close() # 연결객체 닫기

 

쓰는 방법은 매우간단하다.

1. 호스트에 연결
2. 커서불러오기
3. 명령어 실행(생성/삭제/편집 ...  등)
4. 커서 닫기
5. 연결 닫기


1,2,4,5번은 모두 고정적으로 해야하는 것이고 3번이 관건이다.
결국엔 어떤 명령어를 사용해서 db를 편집해야하는가가 문제이다.
다음 포스팅에서는 3번에서 사용가능한 명령어들을 알아보겠다.

+ Recent posts