mysql -uroot -p
password : <password>
password :가 나오면 사용자 비밀번호 입력show databases;
use sample
sample이라는 데이터베이스 선택show는 SQL 명령이 아닌 mysql 클라이언트 프로그램의 고유 명령exit
SELECT * FROM sample

행(래코드)과 열(컬럼/필드)로 구성DESC 테이블명;
// no 열 값이 2인 행 검색
SELECT * FROM sample21 WHERE no = 2;
// no 열 값이 2가 아닌 행 검색
SELECT * FROM sample21 WHERE no <> 2;
// birthday가 NULL인 행만 검색
SELECT * FROM sample21 WHERE birthday IS NULL;
SELECT * FROM sample24 WHERE (a=1 OR a=2) AND (b=1 OR b=2);
% : 임의의 문자열을 의미하는 메타문자
_ : 임의의 문자 하나를 의미하는 메타문자
// SQL로 시작하는 문자열을 포함한 행 검색
SELECT * FROM sample25 WHERE text LIKE 'SQL%';
// SQL을 포함한 문자열을 포함한 행 검색
SELECT * FROM sample25 WHERE text LIKE '%SQL%';
// %을 포함한 문자열을 포함한 행 검색
SELECT * FROM sample25 WHERE text LIKE '%\%%';
// _을 포함한 문자열을 포함한 행 검색
SELECT * FROM sample25 WHERE text LIKE '%\_%';
'는 ''로 2개 연속해서 기술하는 것으로 이스케이프 처리It's -> It''s' 하나만 문자열 데이터인 경우는 ''''// age열의 값을 오름차순으로 정렬
SELECT * FROM sample31 ORDER BY age;
// age열의 값을 내림차순으로 정렬
SELECT * FROM sample31 ORDER BY age DESC;
ORDER BY는 테이블에 영향을 주지 않는다.SELECT * FROM sample31 order by a ASC, b DESC;
MySQL의 경우는 NULL값을 가장 작은 값으로 취급해 ASC에서는 가장 먼저, DESC에서는 가장 나중에 표시한다.// sample33에 LIMIT 3으로 상위 3건만 검색
SELECT * FROM sample33 LIMIT 3;
//sample33을 내림차순으로 정렬 후 LIMIT 3으로 상위 3건만 검색
SELECT * FROM sample33 ORDER BY no DESC LIMIT 3;
SELECT TOP 3 * FROM sample33;
TOP 뒤에 최대 행수를 지정하면 된다.SELECT * FROM sample33 WHERE ROWNUM <= 3;
ROWNUM이라는 열을 사용해 WHERE 구로 조건을 지정하여 행을 제한할 수 있다. ROWNUM으로 행을 제한할 때는 WHERE 구로 지정하므로 정렬하기 전에 처리되어 LIMIT로 행을 제한한 경우와 결과값이 다르다.// 4번째 행부터 획득
SELECT * FROM sample33 LIMIT 3 OFFSET 3;
// price * quantity를 계산한 열에 amount라는 별명 붙이기
SELECT *, price * quantity AS amout FROM sample34;
더블쿼트(MySQL에서는 백쿼트)로 둘러싸서 지정한다.// WHERE 구에서 금액을 계산하고 2,000원 이상인 행 검색하기
SELECT *, price * quantity AS amount FROM sample34
WHERE price * quantity >= 2000;
amount >= 2000;으로 수정하면 에러가 발생한다.WHERE 구 -> SELECT 구의 순서로 처리된다. WHERE 구로 행이 조건에 일치하는지 아닌지를 먼저 조사한 후에 SELECT 구에 지정된 열을 선택해 결과로 반환한다. 별명은 SELECT 구문을 내부 처리할 때 비로소 붙여지기 때문에 WHERE 구에서 사용한 별칭은 아직 내부적으로 지정되지 않은 상태가 되어 에러가 발생한다. // ORDER BY구에서 별명을 사용해 정렬하기
SELECT *, price * quantity AS amount FROM sample34 ORDER BY amount DESC;
// amount를 반올림
SELECT amount, ROUND(amount) FROM sample341;
// amount를 소수점 둘째 자리에서 반올림
SELECT amount, ROUND(amount, 1) FROM sample341;
SELECT CONCAT(quantity, unit) FROM smaple35;
SUBSTRING, TRIMCHARACTER_LENGTH : 문자열의 길이를 계산해 돌려주는 함수, CHAR_LENGTH로 줄여서 사용
OCTET_LENGTH : 문자열의 길이를 바이트 단위로 계산해 돌려주는 함수
문자 하나의 데이터가 몇 바이트의 저장공간을 필요로 하는지 인코드 방식에 따라 결정된다. VARCHAR 형의 길이는 문자세트에 따라 길이가 문자 수로 간주되기도 하니 주의할 필요가 있다.
알파벳의 경우는 반각문자, 한글은 전각문자라고 할 수 있다. 반각 문자는 전각문자 폭의 절반밖에 안 되며 저장용량 또한 저너각문자 쪽이 더 크다. 반각의 알파벳이나 숫자, 기호는 ASCII 문자라고 부른다.
한글의 경우 EUC-KR, UTF-8 등의 인코드 방식을 주로 사용한다. 인코드 방식은 데이터베이스나 테이블을 정의할 때 변경할 수 있는데 RDBMS에서는 이를 문자세트라고 부른다.
CHAR_LENGTH 함수를 사용하는 경우, 한글이든 ASCII 문자든 문자 수로 계산되기 때문에 문제가 없다.
OCTET_LENGTH 함수의 경우 문자 수가 아닌 바이트 단위로 길이를 계산하므로 주의할 필요가 있다.
문자열 조작 함수로 문자 단위가 아닌 바이트 단위로 지정할 경우에는 문자세트에 주의할 필요가 있다.
// 날짜를 연산해 시스템 날짜의 1일 후를 검색
SELECT CURRENT_DATE + INTERVAL 1 DAY;
// 날짜시간형 데이터 간에 뺄셈
SELECT DATEDIFF('2014-02-28', '2014-01-01');
// CASE로 NULL 값을 0으로 변환하기
SELECT a, CASE WHEN a IS NULL THEN 0 ELSE a END "a(null=0)" FROM sample37;
// 위와 동일한 명령
// NULL이 아닌 값에 대해서는 첫번째 인수, NULL이면 두번째 인수로 출력
SELECT a, COALESCE(a, 0) FROM sample37;
// 검색 CASE로 성별 코드를 남자, 여자로 변환하기
SELECT a AS "코드",
CASE
WHEN a=1 THEN '남자'
WHEN a=2 THEN '여자'
ELSE '미지정'
END AS "성별" FROM sample37;
// 단순 CASE로 성별 코드를 남자, 여자로 변환하기
// CASE 뒤에는 대상을 적는다
// WHEN 뒤에는 값만 적는다
SELECT a AS "코드",
CASE a
WHEN 1 THEN '남자'
WHEN 2 THEN '여자'
ELSE '미지정'
END AS "성별" FROM sample37;
ELSE NULL이 되는 것에 주의해야 한다. ELSE는 생략하지 않는 편이 낫다.// 단순 CASE 문으로는 NULL 값을 비교할 수 없다.
CASE
WHEN a=1 THEN '남자'
WHEN a=2 THEN '여자'
WHEN a IS NULL THEN '데이터 없음'
ELSE '미지정'
END
COALESCE 함수를 사용한다.INSERT INTO sample41 VALUES(1, 'ABC', '2014-01-25');
INSERT INTO sample41(a, no) VALUES('XYZ', 2);
INSERT INTO sample411(no, d) VALUES(2, DEFAULT);
DELETE FROM sample41 WHERE no=3;
UPDATE sample41 SET b='2014-09-09' WHERE no=2;
UPDATE sample41 SET no=no+1, a=no; - 1
UPDATE sample41 SET a=no, no=no+1; - 2
MySQL에서는 1, 2번이 서로 다른 결과값이 나오지만 Oracle에서는 어느 명령을 실행해도 결과는 같다.MySQL에서는 SET 구에 기술된 순서로 갱신 처리가 일어난다.Oracle에서는 항상 갱신 이전의 값을 기준으로 갱신하기 때문에 SET 구에 기술한 식의 순서가 처리에 영향을 주지 않는다.SELECT COUNT(*) FROM sample51;
SELECT COUNT(no), COUNT(name) FROM sample51;
SELECT DISTINCT name FROM sample51;
SELECT COUNT(ALL name), COUNT(DISTINCT name) FROM sample51;
// NULL을 0으로 계싼해서 평균값 계산
SELECT AVG(CASE WHEN quantity IS NULL THEN 0 ELSE quantity END) AS avgnull0 FROM sample51;
DISTINCT는 예약어로 열명이 아니다. 중복된 데이터를 제외한 결과를 클라이언트로 반환한다.SELECT name, COUNT(name), SUM(quantity) FROM sample51 GROUP BY name;
SELECT name, COUNT(name) FROM sample51 GROUP BY name HAVING COUNT(name) = 1;
// no, quantity는 GROUP BY에서 지정되지 않았으므로
// SELECT구에서 지정할 수 없어서 에러가 발생한다.
SELECT no, name, quantity FROM sample51 GROUP BY name;
SELECT MIN(no), name, SUM(quantity) FROM sample51 GROUP BY name;
// 괄호로 서브쿼리를 지정
DELETE FROM sample54 WHERE a = (SELECT MIN(a) FROM sample54);
// 하나의 행, 하나의 열을 반환하는 패턴
SELECT MIN(a) FROM sample54;
// SELECT 구에서 서브쿼리
SELECT
(SELECT COUNT(*) FROM sample51) AS sq1,
(SELECT COUNT(*) FROM sample54) AS sq2;
// SET 구에서 서브쿼리
UPDATE sample54 SET a = (SELECT MAX(a) FROM sample54);
// FROM 구에서 서브쿼리
SELECT * FROM (SELECT * FROM sample54) sq;
// Oracle에서 LIMIT 구의 대체 명령
SELECT * FROM (
SELECT * FROM sample54 ORDER BY a DESC
) sq
WHERE ROWNUM <= 2;
// INSERT, VALUES 구에서 서브쿼리
INSERT INTO sample541 VALUES (
(SELECT COUNT(*) FROM sample51),
(SELECT COUNT(*) FROM sample54)
);
// INSERT, SELECT 결과를 INSERT
INSERT INTO sample541 SELECT 1,2;
// 테이블의 행 복사
INSERT INTO sample542 SELECT * FROM sample543;
상관 서브쿼리라고 부른다.// EXITS를 사용해 '있음'으로 갱신
UPDATE sample551 SET a = '있음' WHERE
EXISTS (SELECT * FROM sample552 WHERE no2 = no);
// NOT EXITS를 사용해 '없음'으로 갱신
UPDATE sample551 SET a = '없음' WHERE
NOT EXISTS (SELECT * FROM sample552 WHERE no2 = no);
// 열에 테이블명 붙이기
UPDATE sample551 SET a = '있음' WHERE
EXISTS (SELECT * FROM sample552 WHERE sample552.no2 = sample551.no);
// IN의 오른쪽을 서브쿼리로 지정
SELECT * FROM sample551 WHERE no IN
(SELECT no2 FROM sample552);
WITH CTE AS (
SELECT 0 AS NUM
UNION ALL
SELECT 0 FROM SOME_TABLE # SOME_TABLE의 행 수만큼 반복된다.
)
// 0에서 10의 값을 갖는 테이블
WITH RECURSIVE CTE AS(
SELECT 0 AS NUM # 초기값 설정
UNION ALL
SELECT NUM+1 FROM CTE
WEHRE NUM < 10 # 반복을 멈추는 조건
)
// 테이블 생성
CREATE TABLE [Table Name]
// 테이블 삭제
DROP TABLE [Table Name]
// 테이블 모든 행 빠르게 삭제
TRUNCATE TABLE [Table Name]
TRUNCATE TABLE 명령을 사용하면 모든 행을 빠르게 삭제할 수 있다.// 열 추가
ALTER TABLE sample62 ADD newcol INTEGER;
// 열 속성 변경
ALTER TABLE sample62 MODIFY newcol VARCHAR(20);
// 열 이름 변경
ALTER TABLE sample62 CHANGE newcol c VARCHAR(20);
// 열 삭제
ALTER TABLE sample62 DROP c;
CREATE TABLE sample632 (
no INTEGER NOT NULL,
sub_no INTEGER NOT NULL,
name VARCHAR(30),
CONSTRAINT pkey_sample PRIMARY KEY (no, sub_no)
);
열 제약이라고 한다.테이블 제약이라고 한다.CONSTRAINT 키워드로 제약에 이름을 지정할 수 있다.// 열 제약 추가
ALTER TABLE sample631 MODIFY c VARCHAR (30) NOT NULL;
// 테이블 제약 추가
ALTER TABLE sample631 ADD CONSTRAINT pkey_sample631 PRIMARY KEY(a);
// c열의 NOT NULL 제약 없애기
ALTER TABLE sample631 MODIFY c VARCHAR (30);
// pkey_sample631 제약 삭제하기
ALTER TABLE sample631 DROP CONSTRAINT pkey_sample631;
// 기본키는 제약명을 지정하지 않고도 삭제할 수 있다.
ALTER TABLE sample631 DROP PRIMARY KEY;
// sample62 테이블의 no 열에 isample65라는 인덱스를 지정
CREATE INDEX ismample65 ON sample62(no);
// 인덱스 삭제
DROP INDEX ismample65 ON sample62;
// 실제로 인덱스를 사용해 검색하는지를 확인
EXPLAIN SELECT * FROM sample62 WHERE a = 'a';
EXPLAIN은 표준 SQL에는 존재하지 않는 데이터베이스 제품 의존형 명령이다.possible_keys는 사용될 수 있는 인덱스를 의미하고 key는 사용된 인덱스를 의미한다.// 열을 지정해 뷰 작성
CREATE VIEW sample_view_672(n, v, v2) AS SELECT no, a, a*2 FROM sample54;
// 뷰 삭제
DROP VIEW sample_view_67;
머티리얼라이즈드 뷰이다.MySQL에서는 머티리얼라이즈드 뷰를 사용할 수 없고 Oracle과 DB2에서만 사용 가능한 데이터베이스 객체이다.상관 서브쿼리를 사용할 수 없다.함수 테이블을 사용하여 회피할 수 있다.SELECT * FROM sample71_a UNION SELECT * FROM sample71_b;
SELECT a AS c FROM sample71_a UNION SELECT b AS c FROM sample71_b ORDER BY c;
// 종북제거 x
SELECT * FROM sample71_a UNION ALL SELECT * FROM sample71_b;
SELECT * FROM sample72_x, sample72_y;
SELECT 상품.상품명, 재고수.재고수
FROM 상품 INNER JOIN 재고수
ON 상품.상품코드 = 재고수.상품코드
WHERE 상품.상품분류 = '식료품';
SELECT S.상품명, M.메이커명
FROM 상품2 S INNER JOIN 메이커 M
ON S.메이커코드 = M.메이커코드;
SELECT S1.상품명, S2.상품명
FROM 상품 S1 INNER JOIN 상품 S2
ON S1.상품코드 = S2.상품코드;
SELECT 상품3.상품명, 재고수.재고수
FROM 상품3 LEFT JOIN 재고수
ON 상품3.상품코드 = 재고수.상품코드
WHERE 상품3.상품분류 = '식료품';
RIGHT JOIN을 사용하면 된다.속성 : SQL의 열. 속성 이름과 형 이름으로 구성된다.튜플 : SQL의 행관계대수 : 릴레이션에 대한 연산이 집합의 대한 연산에 대응된다는 이론물리명과 설계상에서 사용하는 논리명을 분리하기도 한다.하나의 데이터가 한 곳에 저장되도록 하기 위함이다.롤백해서 종료할 수 있다. 롤백하면 트랜잭션 내에서 행해진 모든 변경사항을 없었던 것으로 할 수 있다.커밋을 사용하너다.자동커밋을 꺼야 한다.