MySQL select 연습하기

YeJi Kim·2023년 4월 9일
0

데이터베이스

목록 보기
2/5

MySQL 코테를 보기 위해 MySQL select 구문을 연습했다.



주의사항

  • SQL은 일반적으로 대소문자를 구분하지 않는다. 하지만 여러가지 면에서 전체 대문자 또는 소문자 등으로 통일하는 것이 구문을 읽기 쉽게 하며, MySQL 성능에도 약간의 도움이 된다.
  • MySQL의 주석은 다음과 같다.
    • 한 줄 주석: --
    • 여러 줄 주석: /* */
  • 열 이름의 별칭(Alias)
    • 열 이름을 별도의 별칭으로 지정할 수 있다. 열 이름 뒤에 AS 별칭 형식으로 붙이면 된다. 하지만 별칭의 중간에 공백이 있다면 꼭 작은 따옴표 ‘ ‘로 별칭을 감싸줘야 한다. 또한 AS는 붙여도 되고 생략해도 된다.
    • 예시
      SELECT first_name AS 이름, gender AS 성별, hire_date AS '회사 입사일'
      FROM employees;

SELECT의 구문 형식

  • 대괄호[]의 내용은 생략할 수 있다.
    SELECT select_expr
    	[FROM table_references]
    	[WHERE where_condition]
    	[GROUP BY {col_name | expr | position}]
    	[HAVING where_condition]
    	[ORDER BY {col_name | expr | position}]
    	[LIMIT {[offset,] row_count | row_count OFFSET offset}]
    
  • 기본 형식
    SELECT 열 이름
    FROM 테이블 이름
    WHERE 조건
  • 조회하기 이전에 먼저 사용할 데이터베이스를 지정해야 한다.
    USE 데이터베이스_이름;
  • 특정한 조건의 데이터를 조회하기 위해 WHERE 절을 사용한다.
    SELECT 필드 이름 FROM 테이블 이름 WHERE 조건식;
  • 조건 연산자(=, <, >, <=, >=, <>, != 등 )와 관계 연산자(NOT, AND, OR )를 잘 조합하여 다양한 조건의 쿼리를 생성할 수 있다.
  • BETWEEN…AND와 IN() 그리고 LIKE
    • 특정 범위의 연속적인 값을 찾기 위해 BETWEEN…AND를 사용할 수 있다.
      SELECT name, height FROM usertbl WHERE height BETWEEN 180 AND 183;
      // 키가 180이상 183이하인 사람을 조회
    • 이산적인(Discrete) 값을 위해 IN()을 사용할 수 있다.
      SELECT name, addr FROM usertbl WHERE addr IN ('경남', '전남', '경북');
      // 주소가 경남 또는 전남 또는 경북인 사람을 조회
    • 문자열 내용을 검색하기 위해 LIKE 연산자를 사용할 수 있다.
      • 아무 글자와 매치: %

      • 한 글자와 매치: _

        SELECT name, height FROM usertbl WHERE name LIKE '김%';
        // '김'으로 시작하는 이름을 가진 사람을 조회
        
        SELECT name, height FROM usertbl WHERE name LIKE '_종신';
        // 맨 앞 글자가 한 글자이고 그 다음 이름이 '종신'인 사람을 조회
  • ANY/ALL/SOME 그리고 서브쿼리(SubQuery, 하위쿼리)
    • 서브 쿼리란 간단히 얘기하면 쿼리문 안에 또 쿼리문이 들어 있는 것을 얘기한다.
      SELECT name, height FROM usertbl
      	WHERE height > (SELECT height FROM usertbl WHERE Name = '김경호');
      • 서브쿼리의 결과가 하나일 때는 문제가 되지 않지만, 서브쿼리의 결과가 둘 이상의 값을 반환할 경우, 오류가 발생한다.
      • 그래서 필요한 구문이 ANY/SOME/ALL이다.
        • ANY는 서브쿼리의 여러 개의 결과 중 한 가지만 만족해도 된다.

        • ALL은 서브쿼리의 여러 개의 결과를 모두 만족시켜야 한다.

        • SOME은 ANY와 동일한 의미로 사용된다.

          SELECT name, height FROM usertbl
          	WHERE height >= ANY (SELECT height FROM usertbl WHERE addr = '경남');
          // ANY 다음의 서브쿼리 결과인 173, 170보다 크거나 같은 사람이 모두 출력된다.
          // 결국 키가 170보다 크거나 같은 사람이 해당된다.
          
          SELECT name, height FROM usertbl
          	WHERE height >= ALL (SELECT height FROM usertbl WHERE addr = '경남');
          // ALL 다음의 서브쿼리 결과인 173보다 크거나 같아야할 뿐만 아니라, 170보다 크거나 같은 사람이 모두 출력된다.
          // 결국 키가 173보다 크거나 같은 사람이 해당된다.
          
          SELECT name, height FROM usertbl
          	WHERE height = ANY (SELECT height FROM usertbl WHERE addr = '경남');
          // ANY 다음의 서브쿼리 결과와 동일한 값인 173, 170에 해당되는 사람만 출력된다.
          
          SELECT name, height FROM usertbl
          	WHERE height IN (SELECT height FROM usertbl WHERE addr = '경남');
          // 이는 위의 구문과 동일한 구문이다.
          // 즉 '=ANY(서브쿼리)'는 'IN(서브쿼리)'와 동일한 의미이다.
  • 원하는 순서대로 정렬하여 출력: ORDER BY
    • ORDER BY는 결과물에 영향을 미치지는 않지만, 결과가 출력되는 순서를 조절하는 구문이다.
    • 기본적으로 오름차순으로 정렬된다. 내림차순으로 정렬하기 위해서는 열 이름 뒤에 DESC라고 적어주면 된다.
    • 여러 개의 열을 사용하여 정렬할 수 있다.
      • 키가 큰 순서로 정렬하되 만약 키가 같을 겨우에 이름 순으로 정렬하려면 다음과 같이 사용하면 된다. ASC(오름차순)는 디폴트 값이므로 생략해도 된다.
        SELECT name, height FROM usertbl ORDER BY height DESC, name ASC;
    • ORDER BY 다음에 사용되는 정렬의 기준이 되는 열이 SELECT 다음에 꼭 있을 필요는 없다.(정렬의 기준이 되는 열이 꼭 조회의 결과에 포함될 필요는 없다.)
      • 따라서 다음과 같이 사용할 수 있다.
        SELECT userID FROM usertbl ORDER BY height;
    • ORDER BY 절은 SELECT, FROM, WEHRE, GROUP BY, HAVING, ORDER BY 중에서 제일 뒤에 와야 한다!
  • 중복된 것은 하나만 남기는 DISTINCT
    • 중복된 것은 1개씩만 보여준다.
      SELECT DISTINCT addr FROM usertbl;
  • 출력의 개수를 제한하는 LIMIT
    • 상위 N개만 출력할 수 있다.
      SELECT emp_no, hire_date FROM employees
      	ORDER BY hire_date ASC
      	LIMIT 5;
    • LIMIT은 MySQL의 부담을 줄여준다.
    • LIMIT 절은 LIMIT 시작, 개수 또는 LIMIT 개수 OFFSET 시작 형식으로도 사용할 수 있다. 시작을 생략하면 0부터 시작한다.
      SELECT emp_no, hire_date FROM employees
      	ORDER BY hire_date ASC
      	LIMIT 5;   -- `LIMIT 0,5` , `LIMIT 5 OFFSET 0`와 동일
  • 테이블을 복사하는 CREATE TABLE…SELECT

    • CREATE TABLE … SELECT 구문은 테이블을 복사해서 사용할 경우에 주로 사용된다.
      USE sqldb;
      CREATE TABLE buytbl2 (SELECT * FROM buytbl);
      // buytbl을 buytbl2로 복사하는 구문이다.
      
      USE sqldb;
      CREATE TABLE buytbl3 (SELECT userID, prodName FROM buytbl);
      // 필요하다면 일부 열만 복사할 수 있다.
    • 단, PK나 FK 등의 제약 조건은 복사되지 않는다.
  • GROUP BY 및 HAVING 그리고 집계 함수

    • GROUP BY 절
      • GROUP BY절은 말 그대로 그룹을 묶어주는 역할을 한다.

[참고자료]
이것이 MySQL이다 MySQL 설치부터 PHP, 파이썬 연동까지 한번에(저자: 우재남, 출판사: 한빛미디어)

    
profile
이전의 기록들 👉 https://blog.naver.com/reviewerkyj

3개의 댓글

comment-user-thumbnail
2023년 4월 10일

sql 코테를 보다보면 서브쿼리를 사용해야하는 일이 종종 있는데, 헷갈리지 않게 잘 작성해주신거같아요! 서브쿼리는 주로 where이나 from에서 쓰이는 경우가 있는데, from과 where 편도 만들어주시나용?

답글 달기
comment-user-thumbnail
2023년 4월 11일

sql 공부를 하면 확실히 JPQL을 사용할 때 이점이 생기는 것 같습니다! 서브쿼리의 ANY ALL 개념에 대해서 다시 한 번 복기할 수 있었네요. 포스팅 잘 봤습니다!

답글 달기
comment-user-thumbnail
2023년 4월 11일

잘보았습니다. 혹시 sql 자격증이 있으신가요 ?

답글 달기