SELECT문

윤재열·2022년 1월 29일
0

Mysql

목록 보기
1/8

원하는 데이터를 가져와 주는 기본적인 SELECT ..FROM

SELECT 구문

SELECT select_expi
		[FROM table_references]
        [WHERE where_condition]
        [GROUP BY {col_name | expr | position]
        [HAVING where_condition]
        [ORDER BY {col_name | expr | position]
  • SELECT 열 이름
  • FROM 테이블이름
  • WHERE 조건

USE 구문

SELECT문을 학습하려면 먼저 사용할 데이터베이스를 지정해야 한다.

  • 현재 사용하는 데이터베이스를 지정 도는 변경하는 구문 형식은 다음과 같다
    👉 USE 데이터베이스_이름;
  • 만약 employees를 사용하기 위해서는 쿼리 창에 다음과 같이 입력한다.
    👉 USE employess;
  • 이렇게 지정해 놓은 후에는 특별히 다시 USE문을 사용하거나 다른 DB를 사용하겠다고 명시하지 않는 이상 모든 SQL문은 employees에서 수행된다. 한마디로 "지금부터 employees를 사용하겠으니, 모든 쿼리는 employees에서 수행하라" 라는 의미이다.

SELECT와 FROM

SELECT * FROM titles;

  • 일반적으로 '*'은 '모든 것'을 의미한다.

  • 그런데 가 사용된 곳이 열이름이 나올 곳의 위치이므로 이곳의 은 모든 열을 의미한다.

  • FROM 다음의 테이블/뷰 등의 항목이다.

  • 풀어서 쓰면 'titles 테이블에서 모든 열의 내용을 가져와라'는 의미이다.

  • 원래 테이블의 전체 이름은 '데이터베이스이름.테이블이름'형식으로 표현된다.

  • 이테이블의 전체 이름은 employees.titles이므로 원칙적으로는 다음과 같이 사용해야한다.
    👉 SELECT * FROM emplyees.titles;

  • 여러 개의 열을 가져오고 싶다면 콤마(,)로 구분하면 된다. 또한 열 이름의 순서는 사용자 마음대로 바꿔도 된다.
    👉 SELECT first_name, last_name, gender FROM employees;

  • SHOW DATABASES; : 현재 서버에 어떤 데이터베이스가 있는지 조회한다.(데이터베이스의 이름 조회)

  • USE 데이터베이스이름 : 데이터베이스를 지정한다.

  • SHOW TABLE STATUS; : 현재의 데이터베이스에 있는 테이블의 정보를 조회한다.

  • 테이블 이름만 간단히 보려면 SHOW TABLES; 쿼리문을 사용하면 된다.

  • DESCRIBE 데이터베이스 이름; 또는 DESC 데이터베이스이름; : 테이블의 열이 무엇이 있는지 확인

열 이름의 별칭

  • 열이름의 별도의 별칭으로 지정할 수도 있다. 열 이름 뒤에 AS별칭 형식으로 붙이면 된다.

  • 하지만, 별칭의 중간에 공백이 있다면 꼭 작은따옴표(')로 별칭을 감싸줘야한다.

  • 또 AS는 붙여도 되고 생략해도 된다.권장하기로는 별칭을 붙일 경우에는 (')안에 별칭을 사용하기를 권장한다.

  • SELECT first_name '이름', gender '성별', hire_date'회사 입사일' FROM employees;

특정한 조건의 데이터만 조회하는 SELECT..FROM....WHERE

기본적인 WHERE절

WHERE절은 조회하는 결과에 특정한 조건을 줘서 원하는 데이터만 보고 싶을 때 사용하는데,다음과 같은 형식을 갖는다.
👉SELECT 필드이름 FROM 테이블 이름 WHERE 조건식;

  • 만약 실제로 대형 인터넷 쇼핑몰의 가입 회원으로 생각하면 수백만 명이 될수도 있다. 그렇다면 전체 데이터가 스크롤 되어 넘가는 데에도 많은 시간이 걸릴것입니다.
  • 예를 들어 지금 찾는 이름이 "김경호"라면 수백만 건을 조회한 후에 스크롤해서 찾을 필요는 없다.
SELECT * FROM 테이블이름 WHERE name='김경호';

관계 연산자의 사용

  • 1970년 이후에 출생하고 신장이 182인 사람의 아이디와 이름을 조회해 보자.
SELECT userID, Name FROM 테이블이름 WHERE birthYear >= 1970 AND height >= 182;
  • 이번에는 1970년 이후에 출생했거나, 신장이 182이상인 사람의 아이디와 이름을 조회해보자
SELECT userID, Name FROM 테이블이름 WHERE birthYear >=1970 OR height >= 182;
  • '...했거나', '...또는' 등은 OR 연산자를 사용하면 된다.
  • '...하고', '...면서', '..그리고' 등의 조건은 AND 연산자를 이용하면 된다.

BETWEEN...AND와 IN() 그리고 LIKE

  • 이번에는 키가 180~183인 사람을 조회해 보자
SELECT userID, Name FROM 테이블 이름 WHERE height BETWEEN 180 AND 183;
  • 지역이 '경남, '경북', '전남'인 사람의 정보를 확인해 보자
    👉키의 경우에는 숫자로 구성되어 있어서 연속적인 값을 가지므로 BETWEEN...AND를 사용했지만 지역이'경남'이거나'경북'이거나'전남'인 사람을 찾을 경우에 연속된 값이 아니기 때문에 BEETWEEN...AND를 사용할 수 없다.
SELECT name,addr FROM 테이블이름 WHERE addr='경남' OR addr='경북' OR addr='전남';
  • 이와 동일하게 연속적인(Continuous) 값이 아닌 이산적인(Discrete) 값을 위해 IN()을 사용할 수 있다.
  • 문자열의 내용을 검색하기 위해서는 LIKE 연산자를 사용할 수 있다.
SELECT name, height FROM 테이블이름 WHERE name LIKE '김%';

👉위 조건은 성이 '김'씨이고 그뒤로 무엇이든(%)허용 한다는 의미이다. 즉 '김'이 제일 앞 글자인 것들을 추출한다.그리고 한 글자와 매치하기 위해서는'_'를 사용한다. 아래는 맨 앞 글자가 한글자이고,그 다음이 '종신'인 사람을 조회해준다.

SELECT name, height FROM 테이블이름 WHERE name LIKE'_종신';
  • 이 외에도 %,를 조합해서 사용할 수 있다.
    -조건에 '
    용%'라고 사용하면 앞에 아무거나 한글자가 오고 두번쨰는 '용',그리고 세번째 이후에는 몇글자든 아무거나 오는 값을 추출해준다.
    (예를 들어 '조용필','사용한 사람','이용해 주셔서 감사합니다.' 등의 문자열이 해당될 수 있다.

ANY/ALL/SOME 그리고 서브쿼리

서브쿼리란 간단히 얘기하면 쿼리문 안에 또 쿼리문이 들어 있는 것을 이야기한다.

  • 예로 김경호보다 키가 크거나 같은 사람의 이름과 키를 출력하려면 WHERE조건에 김경호의 키를 직접 써줘야한다.
  • 이럴 때 WHERE 조건에 김경호의 키를 직접 쓰는것이 아니라 쿼리를 통해서 사용할 수도 있습니다.
SELECT name, height FROM 테이블이름
		WHERE height > (SELECT height FROM 테이블이름 WHERE Name='김경호');

SELECT name, height FROM usertbl 
	WHERE height >= ANY (SELECT height FROM usertbl WHERE addr ='경남');

  • 여기서 ANY를 사용하면 addr='경남'의 값 173보다 크거나 같은 사람 또는 키가 170보다 크거나 같은 사람이 모두 출력될것입니다. 결국 키가 170보다 크거나 같은 사람이 해당된다.

이번에는 ANY를 ALL로 바꿔서 실행해보자.

SELECT name, height FROM usertbl 
	WHERE height >= ALL (SELECT height FROM usertbl WHERE addr ='경남');

  • 실행결과는 7명만 나왔다. 그 이유는 키가 170보다 크거나 같아야 할 뿐만아니라 173보다 크거나 같아야 하기 때문이다. 결국 키가 173보다 크거나 같은 사람만 해당된다.

결론적으로 ANY는 서브쿼리의 여러 개의 결과 중 한가지만 만족해도 되며, ALL은 서브쿼리의 여러 개의 결과를 모두 만족시켜야한다. 참고로,SOME은 ANY와 동일한 의미로 사용된다.
이번에는 '>=ANY''대신에 '=ANY'를 사용해보자

SELECT name, height FROM usertbl 
	WHERE height = ANY (SELECT height FROM usertbl WHERE addr ='경남');

  • 정확히 ANY다음의 서브쿼리 결과와 동일한 값인 170,173에 해당되는 사람만 출력되었다.

  • 즉 '=ANY(서브쿼리)'는 'IN(서브쿼리)'와 동일한 의미이다.

SELECT name, height FROM usertbl 
	WHERE height = ANY (SELECT height FROM usertbl WHERE addr ='경남');

원하는 순서대로 정렬하여 출력 : ORDER BY

ORDER BY절은 결과물에 대해 영향을 미치지는 않지만, 결과가 출력되는 순서를 조절하는 구문이다.
먼저 가입한 순서로 회원들을 출력해보자.

SELECT name, mDate FROM usertbl ORDER BY mdate;    

  • 기본적으로 오름차순(ASCENDING)으로 정렬된다.내림차순(DESCENDING)으로 정렬하기 위해서는 열이름 뒤에 DESC라고 적어주면 된다.
SELECT name, mdate FROM usertbl ORDER BY mdate desc;

  • 이번에는 여러 개로 정렬해 보자. 키가 큰 순서로 정렬하되 만약 키가 같을 경우에 이름 순으로 정렬하려면 다음과 같이 사용하면 됩니다.ASC(오름차순)은 디폴트값이므로 생략이 가능합니다.
SELECT name, height FROM usertbl ORDER BY height desc, name ;

  • 주의해야 할점은 ORDER BY절을 SELECT, FROM, WHERE, GROUP BY, HAVING 중에서 제일 뒤에 와야한다!!

중복된 것은 하나만 남기는 DISTINCT

SELECT addr FROM usertbl;

  • 이렇게 10개 행밖에 안되는 것에도 중복된 것을 세기에는 어렵다
  • 여기서 DISTINCT문을 사용한다면?
SELECT addr FROM usertbl;

  • 이렇게 중복된것은 1개씩만 보여주면서 출력되었다.

출력하는 개수를 제한하는 LIMIT

입사일이 오래된 직원 5명의 emp_no(사원번호)를 알고 싶다면 어떻게 해야할까?

  • 조금 전에 배운 ORDER BY절을 사용하면 된다.
  • 그 후에 상위의 N개만 출력하는 'LIMIT N'구문을 사용하면 된다.
select emp_no, hire_date from employees order by hire_date limit 5;

  • LIMIT절은 'LIMIT 시작,개수'또는 'LIMIT 개수 OFFSET시작'형식으로도 사용할 수 있습니다.

테이블을 복사하는 CREATE TABLE...SELECT

  • CREATE TABLE...SELECT구문은 테이블을 복사해서 사용할 경우에 주로 사용합니다.
  • 형식:
    CREATE TABLE 새로운테이블명 (SELECT 복사할 열 FROM 기존테이블)
 USE sqldb;
 CREATE TABLE buytbl2 (SELECT * FROM buytbl);
 SELECT * FROM buytbl2;
 
  • 필요하다면 지정한 일부 열만 복사 할 수 있따.
CREATE TABLE buytbl3 (SELECT userID,prodName FROM buytbl);
SELECT * FROM buytbl3;

- 하지만 buytbl은 Primary KeyForeign Key가 지정되 어있지만 PK나 FK등의 제약 조건은 복사되지 않습니다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글