원하는 데이터를 가져와 주는 기본적인 SELECT ..FROM
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문을 학습하려면 먼저 사용할 데이터베이스를 지정해야 한다.
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절은 조회하는 결과에 특정한 조건을 줘서 원하는 데이터만 보고 싶을 때 사용하는데,다음과 같은 형식을 갖는다.
👉SELECT 필드이름 FROM 테이블 이름 WHERE 조건식;
SELECT * FROM 테이블이름 WHERE name='김경호';
SELECT userID, Name FROM 테이블이름 WHERE birthYear >= 1970 AND height >= 182;
SELECT userID, Name FROM 테이블이름 WHERE birthYear >=1970 OR height >= 182;
SELECT userID, Name FROM 테이블 이름 WHERE height BETWEEN 180 AND 183;
SELECT name,addr FROM 테이블이름 WHERE addr='경남' OR addr='경북' OR addr='전남';
SELECT name, height FROM 테이블이름 WHERE name LIKE '김%';
👉위 조건은 성이 '김'씨이고 그뒤로 무엇이든(%)허용 한다는 의미이다. 즉 '김'이 제일 앞 글자인 것들을 추출한다.그리고 한 글자와 매치하기 위해서는'_'를 사용한다. 아래는 맨 앞 글자가 한글자이고,그 다음이 '종신'인 사람을 조회해준다.
SELECT name, height FROM 테이블이름 WHERE name LIKE'_종신';
서브쿼리란 간단히 얘기하면 쿼리문 안에 또 쿼리문이 들어 있는 것을 이야기한다.
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를 ALL로 바꿔서 실행해보자.
SELECT name, height FROM usertbl
WHERE height >= ALL (SELECT height FROM usertbl WHERE addr ='경남');
결론적으로 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절은 결과물에 대해 영향을 미치지는 않지만, 결과가 출력되는 순서를 조절하는 구문이다.
먼저 가입한 순서로 회원들을 출력해보자.
SELECT name, mDate FROM usertbl ORDER BY mdate;
SELECT name, mdate FROM usertbl ORDER BY mdate desc;
SELECT name, height FROM usertbl ORDER BY height desc, name ;
SELECT addr FROM usertbl;
SELECT addr FROM usertbl;
입사일이 오래된 직원 5명의 emp_no(사원번호)를 알고 싶다면 어떻게 해야할까?
select emp_no, hire_date from employees order by hire_date limit 5;
USE sqldb;
CREATE TABLE buytbl2 (SELECT * FROM buytbl);
SELECT * FROM buytbl2;
CREATE TABLE buytbl3 (SELECT userID,prodName FROM buytbl);
SELECT * FROM buytbl3;
- 하지만 buytbl은 Primary Key 및 Foreign Key가 지정되 어있지만 PK나 FK등의 제약 조건은 복사되지 않습니다.