SELECT 열 이름
FROM 테이블이름
WHERE 조건
을 사용해서 사용할 데이터베이스 지정
-- 한 줄 주석 (-- 뒤의 공백 유의)
/* */ 여러줄 주석
SHOW
DATABASES;
USE
databaseName;
SHOW TABLE STATUS;
현재의 데이터베이스에 있는 테이블의 정보 조회
DESCRIBE
tableName; or DESC
tableName;
SELECT
columnName, columnName FROM
tableName;
-> Workbench에서는 [Navigator] 사용
열 이름 뒤에 AS
별칭
별칭의 중간에 공백이 있다면 반드시 작은 따옴표''
로 별칭을 감싸줘야 함.
AS
는 생략 가능
별칭을 붙일 경우에는 가능하면 ''
안에 별칭 사용
DB와 TABLE 생성 예제
DROP DATABASES IF EXISTS
dbName; -- 만약 db라는 이름의 데이터베이스가 존재하면 우선 삭제한다.
CREATE DATABASE
dbName;
USE
dbName;
CREATE TABLE
usertbl; -- 회원 테이블 생성
( userID CHAR(8) NOT NULL PRIMARY KEY,
-- 사용자 아이디(PK)
name VARCHAR(10) NOT NULL,
-- 이름
birthYear INT NOT NULL,
-- 출생 년도
addr CHAR(2) NOT NULL,
-- 지역경기, 서울, 경남 식으로 2글자만 입력
mobile1 CHAR(3),
-- 휴대폰의 국번 011, 010 등
mobile2 CHAR(8),
-- 휴대폰의 나머지 전화번호(하이픈 제외)
mDate DATE
-- 회원가입일
);
CREATE TABLE
buytbl -- 회원 구매 테이블
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-- 순번(PK)
userId CHAR(8) NOT NULL,
-- 아이디(FK)
prodName CHAR(6) NOT NULL,
-- 물품명
groupName CHAR(4),
-- 분류
FOREIGN KEY (userId) REFERENCES usertbl(userID)
);
CHAR
와 VARCHAR
는 영문자를 기준으로 1Byte를 할당하고, NCHAR
와 NVARCHAR
는 유니코드를 기준으로 2Byte를 할당함CHAR
또는 VARCHAR
사용, NCHAR
또는 NVARCHAR
사용CHAR
, VARCHAR
모두 UTF-8 코드를 사용한다.NCAHR
와 NVARCHAR
를 사용할 필요가 없다.CHAR(10)
으로 설정하면 영문이든 한글이든 10글자까지 입력할 수 있으며 내부적으로는 MySQL이 이 공간을 할당한다.CHAR
와 VARCHAR
에 데이터를 입력하려면 작은 따옴표('') 로 묶어줘야 한다.데이터베이스(스키마) 개체의 이름을 식별자(Identifier)라고 한다.
데이터베이스 개체란 데이터베이스, 테이블, 인덱스, 열, 인덱스, 뷰, 트리거, 스토어드 프로시저 등과 같은 개체들을 의미한다.
MySQL 내의 개체 정의 규칙은 아래와 같다.
A-Z, a-z, 0-9, $, _ 사용가능 / 그러나 영문 대문자나 소문자 어떤것을 사용해도 소문자로 생성된다.
개체 이름은 최대 64자로 제한된다.
예약어를 사용하면 안 된다.
개체 이름은 원칙적으로 중간에 공백이 있으면 안되지만, 중간에 공백을 꼭 사용하려면 백틱으로 꼭 묶어줘야 한다.
ex) CREATE TABLE
My Table
가능
개체에 이름은 짧으면서도 알기 쉽게 주어야한다.
Linux 에서는 데이터베이스 이름과 테이블 이름은 모두 소문자를 사용해야 한다.
조건 연산자 ( =
, <
, >
, <=
, >=
, <>
, !=
등)
관계 연산자 (NOT
, OR
, AND
등)
SELECT
name, height FROM
usertbl WHERE
heigt >=
180 AND
height <=
183;
위의 문장은 아래처럼 작성할수도 있다.
SELECT
name, height FROM
usertbl WHERE
height BETWEEN
180 AND
183;
키의 경우에는 숫자로 구성되어 있어서 연속적인 값을 가지므로 BETWEEN ... AND
를 사용했지만 지역명으로 검색할때는 연속값이 아니므로 다른 방법을 사용해야 한다.
SELECT
name, addr FROM
usertbl WHERE
addr='경남' OR
addr='전남' OR
addr='경북';
이와 동일하게 연속값이 아닌 이산적인 값을 위해 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
'_종신';
이 외에도 %
와 _
를 조합해서 사용이 가능하다.
조건에 '_용%' 라고 사용하면 앞에 아무거나 한 글자가 오고 두 번째 글자가 용이고 세 번째 이후에는 몇 글자든 아무거나 오는 값을 추출해준다.
예를들어 '조용필', '이용해 줘서 감사합니다.' 등의 문자열이 해당될 수 있다.
서브쿼리란 쿼리문 안에 또 쿼리문이 들어있는것이다.
김경호보다 키가 크거나 같은 사람의 이름과 키를 출력하려면 WHERE
조건에 김경호의 키를 직접 작성해야 한다.
SELECT
name, height FROM
usertbl WHERE
height > 177;
서브쿼리를 사용하면 아래와 같다.
SELECT
name, height FROM
usertbl
WHERE
height > (SELECT
height FROM
usertbl WHERE
Name = '김경호');
만약 지역이 '경남'인 사람의 키보다 크거나 같은 사람을 추출 할 때는 서브쿼리의 반환값이 둘 이상이라서 위의 방법을 사용하면 안된다.
아래와 같이 ANY
를 사용하면 해결된다.
SELECT
name, height FROM
usertbl
WHERE
height >= ANY
(SELECT
height FROM
usertbl WHERE
addr='경남');
`ANY` , `SOME` -> 서브 쿼리의 여러개의 결과 중 한가지만 만족해도 됨
`ALL` -> 서브 쿼리의 여러개의 결과를 모두 만족시켜야 한다.
SELECT
name, height FROM
usertbl ORDER BY
height DESC, name ASC;
키 순서로 내림차순 정렬하되(큰 순서대로) 만약 키가 같을 경우에는 이름 순서로 오름차순 정렬
ORDER BY
절은 모든 구문 중 가장 마지막에 와야한다.
SELECT
DISTINCT
addr FROM
usertbl;
-> 중복된 것은 1개씩만 보여주면서 출력된다.
SELECT
emp_no, hire_date FROM
employees
ORDER BY
hire_date ASC
LIMIT
5;
-> 입사일이 오래된 직원의 상위 5개 결과만 출력해준다.
' LIMIT
시작, 개수' 또는 'LIMIT
개수 OFFSET
시작' 형식으로 사용 가능하다.
CREATE
TABLE
새로운테이블 (SELECT
복사할열 FROM
기존테이블)
CREATE
TABLE
buytbl2 (SELECT
FROM
buytbl1);
SELECT
FROM
buytbl2;
buytbl1 을 buytbl2 로 복사하는 구문
CREATE
TABLE
buytbl3 (SELECT
userID, prodName FROM
buytbl1);
SELECT
* FROM
buytbl3;
userID와 prodName 만 복사하는 구문
PK 나 FK 등의 제약조건은 복사되지 않는다.
SELECT
select_expr