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