Contents
(MariaDB)데이터베이스 명령어 실습 - 기본 Query문
   2022년07월14일     6분정도면 다 읽어요     - Comments

[카카오 클라우드 스쿨] 기본적인 DB Query언어를 알아 보자

MariaDB (2) - 데이터베이스 기본 쿼리문

SELECT 명령어

1 . 데이터 조회, 조건조회

  • SELECT
    • 대충 이런 순서
    • SELECT [컬럼명] FROM [테이블명] WHERE [조건] GROUP BY [그룹으로묶기] HAVING [조건부여] ORDER BY [DESC, ASC];
# SELECT * FROM userTbl WHERE addr='경남');

#SELECT * FROM userTbl WHERE height BETWEEN 180 AND 183;

# SELECT * FROM userTbl WHERE addr IN ('전남', '서울');

# SELECT * FROM userTbl WHERE NAME LIKE '김%';

SELECT * FROM userTbl WHERE NAME LIKE '_범%';


2 . 서브쿼리, 정렬

  • 서브쿼리는 쿼리 내에 또 다른 쿼리를 추가하여 사용하는 방법을 의미함


  • 김범수보다 키가 큰 사람들의 목록을 출력하라
    1. 김범수의 키를 구한다
    2. 조건에 김범수의 키를 두고 이를 비교하여 큰 사람을 출력한다
  • ANY, ALL 조건과 같이 사용 가능
SELECT name, height from userTbl
WHERE height > (SELECT height FROM userTbl WHERE NAME='김범수');


  • Quiz1. 성시경과 살고 있는 지역이 같은 사람들의 이름, 키, 지역을 출력하는데 키가 큰 사람부터 출력하세요
    • 정렬: 내림차순 DESC, 오름차순 ASC
SELECT name, height, addr FROM userTbl
WHERE addr = (SELECT addr FROM userTbl WHERE NAME='성시경')
ORDER BY height DESC, NAME ASC;


  • Quiz2. 지역이 경남인 사람의 키보다 크거나 같은 사람?
    • 서브쿼리가 둘 이상의 값을 반환하기 때문에 오류가 발생한다
    • any를 사용하면 170보다 커도 되고, 173보다 커도 된다 -> 170이상
    • all을 사용하면 170보다 커야 하고, 173보다도 커야 한다 -> 173이상
/*오류가 발생하는 쿼리문*/
SELECT name, height FROM userTbl
WHERE height >= (SELECT height FROM userTbl WHERE addr='경남');

/*any 사용*/
SELECT name, height FROM userTbl
WHERE height >= ANY (SELECT height FROM userTbl WHERE addr='경남');

/*all 사용*/
SELECT name, height FROM userTbl
WHERE height >= ALL (SELECT height FROM userTbl WHERE addr='경남');


3 . 중복 제거하기

  • DISTINCT를 사용한다
SELECT DISTINCT addr FROM userTbl;


4 . TOP 5 출력하기

  • LIMIT을 사용한다


  • Quiz. 회원들의 정보를 출력하되, 이름, 키를 키 순서대로 출력하세요
  • 단, 동일한 키가 나오면 오름차순으로 정렬하고 TOP3만 뽑이세요
SELECT name, height
FROM userTbl
ORDER BY height DESC
LIMIT 3 ;


5 . 그룹으로 묶기, 집계 함수 사용

  • group by를 사용한다
  • 여러 개 표기된 것을 하나의 그룹으로 묶어서 표현
    • (주로 sum, max, min, avg..와 같이 사용한다)
SELECT userid, amount FROM buyTbl ORDER BY userid;

SELECT userid, SUM(price*amount) AS '총구매액'
FROM buyTbl GROUP BY userID ORDER BY 총구매액 desc;
  • Quiz. 사용자들의 정보를 아래와 같이 출력되도록 하세요
지역인원
서울4
경남2
전남1
경북1
SELECT addr AS '지역', COUNT(addr) AS '인원'
FROM userTbl
GROUP BY addr
ORDER BY 인원 desc ;
  • 집계 함수를 count를 사용했다


6 . 조건 부여하기

  • HAVING 절
    • 조건을 부여하는 방법으로 집계함수와 함께 사용한다
    • Group by 뒤에 사용한다


7 . 총합 또는 합계가 필요한 경우

  • ROLLUP을 사용한다
SELECT groupName, SUM(price*amount)
FROM buyTbl
GROUP BY groupName
WITH ROLLUP;
  • img_24
  • Null의 경우 그룹 네임에 포함되지 않은 경우임




update 명령어

  • INSERT
    • INSERT INTO 테이블 values (값1, 값2)
    • INSERT INTO 테이블[(열1, 열2, 열3)] values (값1, 값2, 값3)



view 만들기

CREATE VIEW v_usertbl
AS
SELECT username AS '이름', email AS '이메일'
FROM usertbl



Join

  • 두개 이상의 테이블을 연결하여 두 테이블에서 동시에 필요한 열 정보를 한번에 출력할 수 있도록 해주는 방법
    • inner join (보편적인 방법)
    • outer join
    • cross join
    • self join


  • 형식은 다음과 같다
SELECT [ 이름]
FROM [조인할  번째 테이블 이름]
INNER JOIN [조인할  번쨰 테이블 이름]
ON [조인될 조건]
WHERE [검색조건]


  • 예제1
MariaDB [sqlDB]> SELECT buyTbl.userID, buyTbl.prodName, userTbl.name, userTbl.addr, CONCAT(mobile1,mobile2) AS '휴대폰번호'
    -> FROM buyTbl
    -> INNER JOIN userTbl
    -> ON buyTbl.userID = userTbl.userID
    -> WHERE buyTbl.userID = 'JYP';
+--------+-----------+-----------+--------+-----------------+
| userID | prodName  | name      | addr   | 휴대폰번호      |
+--------+-----------+-----------+--------+-----------------+
| JYP    | 모니터    | 조용필    | 경기   | 01144444444     |
+--------+-----------+-----------+--------+-----------------+
1 row in set (0.008 sec)


  • 예제2
MariaDB [sqlDB]> SELECT B.userID, B.prodName, U.name, U.addr, CONCAT(mobile1,mobile2) AS '휴대폰번호'
    -> FROM buyTbl B
    -> INNER JOIN userTbl U
    -> ON B.userID = U.userID
    -> WHERE B.userID = 'KBS';
+--------+-----------+-----------+--------+-----------------+
| userID | prodName  | name      | addr   | 휴대폰번호      |
+--------+-----------+-----------+--------+-----------------+
| KBS    | 운동화    | 김범수    | 경남   | 01122222222     |
| KBS    | 노트북    | 김범수    | 경남   | 01122222222     |
| KBS    | 청바지    | 김범수    | 경남   | 01122222222     |
+--------+-----------+-----------+--------+-----------------+
3 rows in set (0.001 sec)