mysql 설치오류 시 & access denied 에러시 이것 한방이면 다 해결된다. 대신 주의할점은 모든 DB가 삭제된다.
apt-get purge mysql-server
apt-get purge mysql-common
rm -rf /var/log/mysql
rm -rf /var/log/mysql.*
rm -rf /var/lib/mysql
rm -rf /etc/mysql
# and then:
apt-get install mysql-server --fix-missing --fix-broken
mysql
mysql -u root -p 이렇게 접속한다.
status 상태보기
create database [db명] 데이터베이스 생성,default character set utf8을 붙여주면 한글 안깨짐
use [데이터베이스명] 데이터베이스 변경
show talbes; 테이블 보기
select <칼럼명> from <테이블명>
select * from orders;
select * from orders \G - 리포트 형태
select name, job from customers;
select name "Customer Name" from customers; - name을 Customer Name이라는 별칭으로 출력
순서대로 출력하기
select <칼럼명> from <테이블명> order by <칼럼명> [asc | desc]
select name, job from customers order by name;
select job, name from customers order by job desc, name - 이름순으로 정렬 후 job의 공통부분은 내림차순으로 출력
계산하여 데이터 가죠오기
select 1+1;
select name, price * 10 from products;
조건에 맞게 데이터 가져오기
select <칼럼명> from <테이블명> where <조건>
->select * from orders
->where customers_id = 4;
>select name, gender, job
->from customers
->where gender = 'f' AND job = '시인';
select '0' = 0, '0.0' = 0, '0.01' = 0, '.01' = 0.01;
select '.01' <> '0.01'; - 문자열이 서로 다르므로 1이 출력 된다.
BETWEEN min AND max
>select name, price
->from products
->where price BETWEEN 20000 AND 70000;
>select name, price
->from products
->where price BETWEEN 70000 AND 20000;
분명 empty를 출력할 것이다.
>select name
->from customers
->where name BETWEEN '김정호' AND '우장춘'
->order by name;
IN 연산자
>select name, job
->from customers
->where job IN('시인', '의사', '과학자');
그룹을 만들어 데이터 가져오기
>select job from customers;
>select distinct job from customers; - 중복없앰
>select distinct job, name from customers;
>select job from customers
->group by job;
같은 직업끼리 그룹을 짓기 때문에 만약 직업이 '시인'인 3개의 로우가 있다면 하나로 그룹지어진다.
갯수 세기
select COUNT(*) from customers;
>select job, COUNT(customers_id)
->from customers
->group by job;
그룹관련 키워드 HAVING
SELECT <칼럼명>,<그룹함수> FROM <테이블명> GROUP BY <칼럼명> HAVING <그룹 조건>
>select name,price from products
->HAVING price > AVG(price);
>select name from products
->HAVING price > AVG(price);
만약 이렇게 그룹조건에 where절을 쓰면 에러가 발생한다.
검색하여 데이터 가져오기
>select name, email
->from customers
->where email LIKE 'b%';
>select name, email
->from customers
->where email LIKE 'b____@%'; - 이메일 아이디가 b로 시작하여 6글자인 명단을 가져오라
원하는 범위만큼 데이터 가져오기
select * from orders LIMIT 3;
select * from orders LIMIT 3,2; - orders 테이블에서 3번째 이후로부터 2개의 raw를 출력하는 예
날짜와 시간 관련 함수
DATE - 날짜 타입
DATETIME - 날짜와 시간이 합쳐진 타입
TIMESTAMP - 날짜 및 시간 타입
DAYOWEEK(date) - 몇요일인지 출력 (1=일요일, 2=월요일 ....)
WEEKDAY(date) - 위와 같으나 0=월요일, 1=화요일...
DAYOFYEAR(date) - 날짜가 해당 연도에서 1~365에서 몇번째 날인지 계산
MONTH(date)
DAYNAME(date) - 해당 날짜의 요일명 가져옴
MONTHNAME(date) - 해당 달의 이름을 가져옴
QUARTER(date) - 분기를 계산함
WEEK(date,first) - WEEK(date)와 똑같으나 한주의 시작 기준을 정할 수 있음 예로 first인자에 0을 쓰면 일요일을 시작되는 주를 기준으로 순서를 가져옴
YEAR(date) 년도 추출
YEARWEEK(date) 년도와 주를 동시에 추출
YEARWEEK(date,first) YEARWEEK(date)와 동일하지만 한 주의 기준을 정할 수 있다.
HOUR(time) 해당 시간을 추출
MINUTE(time) 해당 분을 추출
SECOND(time) 해당 초를 추출
이 외에도 문자열 비교, 숫자 관련 함수등 여러가지 함수 가 있다.
시간계산 조건절
>select name,modifydate from customers
->where TO_DAYS(NOW()) - TO_DAYS(modifydate) <= 30;
>select DAYOWEEK('2002-09-11');
>select MONTH('2002-02-03'), DAYNAME('2002-04-05'), MONTHNAME('2002-02-13');
>select QUARTER('2002-04-10');
데이터 저장하기
insert into <테이블명> [<컴말 구분된 칼럼 리스트>] VALUES (<컴마로 구분된 데이터들>);
>desc customers; - 고객 테이블은 칼럼들 리스트와 순서를 보기
>select MAX(customers-id) from customers; - customers_id의 최대값을 구함
>insert into customers VALUES (17, 'm', '이순신', '군인', 'sussin@domain.co.kr', '서울시 종로구 수송동 146-2', '02-777-7890', '20020920', now(), 'lee1234');
>selct * from customers where customers_id = 17 \G - 데이터가 정상적으로 저장되있는지 확인
>insert into customers (customers_id,gender,name,job,email,address,telephone,registdate,modifydate,password) VALUES (17, 'm', '이순신', '군인', 'suin@domain.co.kr', '서울시 종로구 수송동 146-2', '02-777-7890', '20020920', now(), 'lee1234'); - 컴마로 구분된 칼럼리스트를 써서 데이터 저장하는 법
AUTO_INCREAMENT
중복되지 않는 키를 생성하는데 도움을 줌
현재 저장되어 있는 데이터의 최대값을 기준으로 부여되는 것이 아니라 한번이라도 저장된 적이 있는 데이터의 최대값을 기준으로 키 부여
>create table animals (
->id INT NOT NULL AUTO_INCREAMENT,
->name CHAR(30) NOT NULL,
->PRIMARY KEY (id)
-> );
데이터 변경하기
update <테이블명> SET <칼럽1> = <데이터>, <칼럽2> = <데이터> .... WHERE <조건>
>update customers SET telephone = '02-888-1234'
->WHERE customers_id = 1 AND name = '방정환';
데이터 삭제하기
delete from <테이블명> where <조건>
>delete from customers
->where customers_id = 17 AND name = '이순신';
JOIN문
select <칼럼 리스트> from <테이블 리스트> where <join할 조건> AND <select할 로우의 조건>
>SELECT customers.name orders.orders_date
->FROM customers, orders
->WHERE customers.customers_id = 2
->AND customers.customers_id = orders.customers_id;
Alias를 사용하여 간략하게 사용하기
SLECT c.name, o.orders_date
FROM customers c, orders o
WHERE c.customers_id = 2
AND c.custoemrs_id = o.custoemrs_id;
UNION JOIN문(그냥 합치기라고 생각하믄됌)
SELECT job FROM customers UNION SELECT name FROM products;
이 외에 self join, outer join, sub-query(조건절 안에 select문이 또 있는 거)가 있다.
데이터베이스 생성 삭제
CREATE DATABASE [DB명]
DROP DATABASE [DB명]
테이블 생성하기
>CREATE TABLE member(name vachar(50), passwd varchar(50), age int(10));
>CREATE TABLE settest (
->test1 SET('abc','bcd','cde')
->);
select문을 이용하여 테이블 생성
>CREATE TABLE test
->SELECT customers_id,name FROM customers;
테이블 칼럼타입 보기
desc [테이블명]
테이블 변경하기
ALTER TABLE <테이블명> ADD COLUMN <칼럼명> <칼럼 타입> [FIRST | AFTER <칼럼명>]
>ALTER TABLE orders ADD COLUMN orders_status CHAR(1) AFTER orders_id;
ALTER TABLE <테이블명> DROP COLUMN <칼럼명>
>ALTER TABLE orders DROP COLUMN orders_status;
ALTER TABLE <테이블명> CHANGE COLUMN <이전 칼럼명> <새 칼럼명> <새 칼럼 타입>
ALTER TABLE orders CHANGE COLUMN orders_date orders_time DATETIEM;
테이블 삭제하기
DROP TABLE [테이블명]
트랜잭션이란?
데이터베이스를 여러 사용자가 사용하게끔 만들어야하는데 그러기 위한 작업에 대한 논리적인 단위를 말함
BEGIN WORK -> 변경 -> COMMIT or ROLL BACK
사용자 추가 권한 변경
>insert into user (host,user,password) values('localhost','사용자','password(''));
>insert into db values ('localhost','db명','사용자','Y',Y','Y',....권한수만큼);
>FLUSH PRIVILEGES - 권한 테이블을 변경한 후에 이걸해야 적용된다.
>GRANT ALL ON [db명].* TO [사용자명]@'%' IDENTIFIED BY '비밀번호'; - 한 db에 모든 권한을 부여한 사용자
>GRANT SELECT(name,job) ON [db명].customers TO [사용자명]@'localhost' IDENTIFIED BY '비밀번호'; - custers테이블에 name칼럼과 job 칼럼에 대해서만 select 가능하도록 사용자에게 권한 부여
>select user,host,password from user - 어떠한 사용자들이 있는지 확인
>DELETE FROM user WHERE User='사용자' AND HOST='localhost'; - 사용자 삭제하기, 하고나서 FLUSH PRIVILEGES; 꼭 할 것
update user SET password=PASSWORD('비밀번호') WHERE user='root'; - root 비번 변경
mysql --no-deffaults --user=사용자 -p 환경 설정 무시하고 접속하기
mysql -u 사용자 -p비밀번호 [db명] > 'sample.txt' - sql실행결과 파일로 저장하기
txt만아니라 html로도 저장할 수 있다.
백업 및 복구, 최적화는 모든 걸 구축한 후 배우자
Java Client Program(JDBC API) - MYSQL(JDBC Driver) 이렇게 해서 db를 연결하는 것
JDBC연결하기
- mysql 홈페이지에서 jdbc 드라이버를 받는다.
- 압축을 해제하고
mysql-connector-java-5.1.26-bin.jar 파일을
아래와 같이 두 곳에 복사합니다.
$> sudo cp mysql-connector-java-5.1.26-bin.jar /usr/lib/jvm/java-7-oracle/jre/lib/ext/
$> sudo cp mysql-connector-java-5.1.26-bin.jar /usr/share/tomcat6
JDBC 드라이버가 정상적으로 로딩 되는지를 확인합니다.
$> javap org.gjt.mm.mysql.Driver |
아래와 같이 출력되면 정상입니다.
Compiled from "Driver.java" public class org.gjt.mm.mysql.Driver extends com.mysql.jdbc.Driver { public org.gjt.mm.mysql.Driver() throws java.sql.SQLException; } |
Java 애플리케이션과 MySQL의 연동을 확인 했으므로
이번에는 JSP와 MySQL의 연동을 확인 해봅니다.
우선 Tomcat의 루트 디렉토리로 이동한 후
$> cd /var/lib/tomcat6/webapps/ROOT/ |
mysql_test.jsp 파일을 생성합니다.
$> sudo vi mysql_test.jsp |
아래 내용을 입력한 후 저장합니다.
이번에도 마찬가지로 적색으로 표기된 password 부분에는
실제 MySQL의 password를 입력합니다.
<%@ page import="java.sql.*" contentType="text/html;charset=utf-8"%> <% String DB_URL = "jdbc:mysql://localhost/mysql"; String DB_USER = "root"; String DB_PASSWORD= "password"; Connection conn; Statement stmt;
try { Class.forName("org.gjt.mm.mysql.Driver"); conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); stmt = conn.createStatement(); conn.close(); out.println("MySQL Connection Success!"); } catch(Exception e){ out.println(e); } %> |