연우, 장을 열다.


-- 쿼리를 직접 사용
SELECT (LENGTH(v) - LENGTH(REPLACE(v, ';'''))) / LENGTH(';')
FROM (SELECT 'A;B;C;D;E;F;G' v) A;
 
 
-- 함수를 만들어 사용해도 편리함
CREATE FUNCTION COUNT_STR(X VARCHAR(255), DELIM VARCHAR(12))
   RETURNS INT
RETURN (LENGTH(X) - LENGTH(REPLACE(X, DELIM, ''))) / LENGTH(DELIM);
 
 
SELECT COUNT_STR(TEXT, ';') CNT
FROM (SELECT 'A;B;C;D;E;F;G' TEXT) A;

출처 : http://www.seobangnim.com/zbxe/DB/603393



위 커뮤니티에서 가져왔습니다. 


위처럼 쿼리 적용을 해보니, 찾는 문자열이 몇개가 해당 컬럼에 포함돼있는지 알수 있었습니다. 


제 케이스는 컬럼이 모두 "ㅁㅁㅁ|ㅍㅍㅍ|ㅇㅇㅇ" 이런 형식으로 데이타들이 들어가 있었어요. 전 '|' 이것이 몇개나 되는지 알고 싶었구요. 

그래서 아래와 같이 정보를 얻었습니다. 

 







이런 생각해본적 있으실겁니다.

특정 table A에다가 table B의 내용을 모두 집어 넣어버리고 싶은 적


테이블들의 관계에 따라서 특정 테이블 B의 내용을 temp 형식으로 모두 복사해 넣고싶은 상황일 수 있어요. 


내용을 조회해서 와서 바로 인썰트 하는 방법이 있습니다. 


table A

id    |    addr    |    gender

--------------------------------

no rows




table B 

id    |    name    |    addr    |    gender

------------------------------------------------

a        김길수        서울시        남

b        김민경        부천시        여

c        나소민        인천시        여


위처럼 테이블이 존재한다면, 


insert into table A select id, addr, gender from table B


라고 하면 됩니다. table A의 컬럼 순서와 동일하게 값을 불러와야만 적용이 됩니당


mysql 데이터 insert

web/mysql2017. 11. 19. 16:16

mysql data insert


데이터를 넣어줄때에는 


insert into testTbl (컬럼명a, 컬럼명b, 컬럼명c, 컬럼명d) values (컬럼의 값a, 컬럼의 값b, 컬럼의 값c, 컬럼의 값d ); 


위처럼 입력하면  됩니다


컬럼명은 생략이 가능합니다. 



insert into testTbl  values (컬럼의 값a, 컬럼의 값b, 컬럼의 값c, 컬럼의 값d ); 


위처럼 쓸 수 있다는 의미입니다. 한가지 주의하자면, 위처럼 생략해서 사용할 경우에는 값들의 순서 및 개수가 테이블에 정의된 열순서 및 개수와 동일해야 합니다.



따라서 어떤 값을 넣고 싶지 않다면 



insert into testTbl (컬럼명a, 컬럼명b,컬럼명d) values (컬럼의 값a, 컬럼의 값b, 컬럼의 값d ); 


위 처럼 넣어주시면 됩니다. 첫번째 쿼리에 있었던 컬럼명c가 사라진 상태입니다. 두둥


자동으로 증가하는 AUTO_INCREMENT는 어째야하지??

테이블의 속성에 AUTO_INCREMENTㅓ가 지정되어 있다면, insert에서는 해당 열이 없다고 생각하고 입력하면 됩니다. 


AUTO_INCREMENT는 자동으로 1부터 증가는 값을 입력해줍니다. AUTO_INCREMENT는 프라이머리키이거나 유니크로 지정해줘야하고, 데이터 형식은 꼭 숫자형식이어야 합니다. 


AUTO_INCREMENT로 지정된 열은 insert문에서 null값으로 지정하면 자동으로 값이 입력됩니다. 


CREAT TABLE testTbl2

( id int AUTO_INCREMENT PRIMARY KEY,

 userName char(3),

 age int );


insert into testTbl2 values (NULL, 'kay', '25');

insert into testTbl2 values (NULL, 'thia', '24');






group by

group by는 말그대로 그룹별로 묶어주는 역할을 합니다. 당신이 조회하는 테이블이 만약 고객 아이디가 있고, 고객이 주문해간 주문내역이라면, 


아이디로 그룹을 묶어서 얼마나 구매해 갔는지 궁금할 수 있습니다. 


그럴때에는 


select userId, SUM(amount) from buytbl group by useId order by userId; 


라고 검색하면 됩니다.


select userId, amount from buytbl order by userId;  


위 쿼리는 아이디별로 얼마나 구매했는지 알아볼 수 있는 것이 아니라

중복된 아이디가 있어도 전체의 데이타를 가져오는 결과입니다. 


구하고자 했던 것은 각 아이디별 총 구매량이었으니까 당연히 


select userId, SUM(amount) from buytbl group by useId order by userId;  


라고 쿼리 조회를 해야합니다. 


group by의 조건문을 쓸때에는 where이 아니라 having


만약 아이디별로 구매한 내역 중에서 5000이 넘는 amount를 구매한 사람이 알고 싶다면 우리는 이렇게 생각합니다. 


select userId, SUM(amount) from buytbl where sum(amount) > 5000 group by useId order by userId;  


하지만 이것의 조회는 오류가 발생합니다. 


"Error code : 11111. invalid use of group function"

 

자 위 오류를 시정하기 위해서는 


select userId, SUM(amount) from buytbl having sum(amount) > 5000 group by useId order by userId;  


위 처럼  where 대신 having을 작성해야 합니다. 



자, group by의 조건을 걸때에는 having을 작성해주셔야 합니다.




'web > mysql' 카테고리의 다른 글

insert table a select table b 대량 인썰트할때  (0) 2017.11.29
mysql 데이터 insert  (0) 2017.11.19
mysql 별칭 잘 쓰면 참 좋은 alias  (0) 2017.11.19
mysql 주석 -- /**/  (0) 2017.11.18
mysql 서브쿼리(sub query) -any all some  (0) 2017.11.17

mysql에서 select를 해올때, 잘 쓰면 보약이 되는 녀석이 있습니다. 바로 별칭(alias)이란 녀석인데, 사용 방법은 간단합니다. 


select 컬럼명 as 별칭

select 함수 as 별칭

select (서브쿼리) as 별칭


위 방식대로 사용하는 것입니다. 


select  last_name as 이름, gender as 성별,  hire_date as '회사 입사일


이라고 별칭을 지으면.. 


이름    | 성별     | 회사 입사일

---------------------------------------

김경호 | 남        |2017-11-19


위와 같이 불러옵니다. 


물론 당연히 as 다음에 영문이 와도 되고, 위처럼 한글이 와도 됩니다. 하지만, 별칭에 공백이 있다면 꼭 반드시 '' 이렇게 표기해주셔야 합니다. 



mysql 주석 -- /**/

web/mysql2017. 11. 18. 21:53

주석 처리하는데 방법은 2가지입니다. 


회색 표시가 된 부분이 주석입니다. 


한줄 주석을 할거면 


--


EX)

select first_name, last_name, gender -- 이름과 성별 열을 가져옴

from employees;


위처럼 하면 -- 그 다음 나오는 줄을 주석처리하는 것입니다. 


여러줄을 주석처리할 것이라면 


/*

 이 쿼리는 

회원정보중에서 이름과 성별을 불러오는 쿼리입니다. 

잘 유념해서 활용하시면 됩니다.

*/

select first_name, last_name, gender from employees;


위처럼 사용하시면 됩니다. 



서브쿼리란 쿼리문 안에 또 쿼리문이 들어있는 것을 말한다. 


TABLE userTable

name        addr        mobile        height        birthDay    

-------------------------------------------------------------------------

은지원      경남        010000111    177            2007-12-12

성시경      강원        010000111    179            2007-12-12

김범수      경남        010000111    172            2007-12-12

김경호      경남        010000111    173            2007-12-12



위 테이블에서 김경호 키보다는 큰 키를 구하고자 한다.


1.select * from userTable where height >177 


위처럼 조회하면 되는데, 이것을 서브쿼리로 조회를 해보자.


2. 서브쿼리로 ㄱㄱ


select * from userTable where height > (select height from userTable where name='김경호')


위처럼 조회하면 (여기 괄호에 있는 쿼리문이 김경호의 키인 177을 조회해온다. ) (쿼리문~~~~) 이것이 '177'에 해당하는 것이다. 


자 간단한 서브쿼리였는데, 이번에는 이렇게 해보자. 


주소지가 경남인 사람들보다 큰 사람을 구하자.


3.select * from userTable where height > (select height from userTable where addr='경남')


자 이렇게 하면 에러가 난다. 이유는 경남 이란 것이 여러개 데이타가 좋재하기 때문이다. 


"Error Code : 1242. Subquery returns more than 1 row


라는 에러메시지를 받게 된다. 


ANY( =SOME) , ALL를 사용해 위 결과에 대처하자.


select * from userTable where height > ANY(select height from userTable where addr='경남')


라고 조회하면 경남권인 사람의 키인 177이나 173보다는 큰 경우의 로우들을 모두 불러오게 된다. 


select * from userTable where height > ALL(select height from userTable where addr='경남')


경남권 사람의 키가 177과 173 이므로, 이 두개 모두 만족해야한다. 즉 177 키 이상인 경우만 해당된다. 




SOME은 ANY와 같은 의미로 사용된다. 



즉 정리하자면 ANY는 OR의 개념이다. 다수의 로우가 나오면 그중 1개만 만족해도 된다. 

하지만 ALL 은 검색된 로우들의 AND라고 보면 된다. 검색된 로우들을 모두 만족해야하기 때문이다. 









'web > mysql' 카테고리의 다른 글

mysql 데이터 insert  (0) 2017.11.19
mysql group by 그에 대한 조건문을 쓸땐 where 이 아닌 having  (0) 2017.11.19
mysql 별칭 잘 쓰면 참 좋은 alias  (0) 2017.11.19
mysql 주석 -- /**/  (0) 2017.11.18
MySQL IFNULL()의 사용방법  (0) 2017.11.16


IFNULL 함수는 은 해당 필드의 값이 널값이 반환될때 대체될 텍스트를 설정하고 그 값을 NULL 대신에 값을 반환해줍니다. 




select IFNULL(필드명, "대체할 값") FROM 테이블명;


String sql ="select a, IFNULL(b, "") as test_b from table";


이런 식이라면, 


-------a--------|-----test_b-------

__________________________________

 aaa             | 


이런 식의 조회 결과가 나올것이고, 


String sql ="select a, IFNULL(b, "테스트여~") as test_b from table";



-------a--------|-----test_b-------

__________________________________

 aaa             |테스트여~


라는 결과가 나올것이다. 


IFNULL은 중첩에서 사용가능하다. 




String sql ="select a, IFNULL(b, IFNULL(c, "오예~")) as test_b from table";



-------a--------|-----test_b-------

__________________________________

 aaa             |오예~



가 나오게 될것이다.

즉, IFNULL(b, IFNULL(c, "오예~")) 는 

IFNULL(c, "오예~") = > 여기서 c 컬럼이 널값이면 "오예~"를 반환하고, b도 널값이라면 역시 "오예~"를 반환하게 되는 셈인것이다!