취코, 취하다 코딩에~

DB 명령어 본문

프로그래밍/쓸모 있는 잡 지식

DB 명령어

drinkcode 2018. 2. 11. 20:15


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연결하기
  1. mysql 홈페이지에서 jdbc 드라이버를 받는다.
  2. 압축을 해제하고 
    mysql-connector-java-5.1.26-bin.jar 파일을 

    아래와 같이 두 곳에 복사합니다.  
  3. $> 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
  4. 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;

    }
  5. 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);

             }

     %>



Comments