DELETE FROM TABLENAME vs TRUNCATE TABLENAME
속도 측면에서 truncate가 훨씬 빠르다.
truncate를 하게 되면 table을 drop 했다가 다시 생성하는 것이다.
큰 dataset의 경우 delete from tableName보다 truncate가 훨씬 빠르다.
또한, truncate의 경우 기존 저장되어 있던 page를 삭제한 후 재할당하며, delete는 데이터만 삭제하기 때문에 데이터를 저장하기 위해 늘린 저장 공간은 그대로 유지한다.
(innodb_file_per_table=OFF 옵션을 사용해도 사용하던 공간을 즉시 회수할 수는 없다..!)
column 당 둘 이상의 결과가 있는 표현식의 연결된 값을 가져오는 데 사용한다.
# Grade 테이블
Name Score
Adam A+
Adam A-
Adam B
Adam C+
Bill D-
John A-
select name, GROUP_CONCAT(Score ORDER BY Score DESC SEPARATOR ' ') AS GRADES
FROM Grade
GROUP BY Name
# result
Name Grades
Adam C+ B A- A+
Bill D-
John A-
트랜잭션은 연속적인 select, insert, update, delete와 같은 SQL 문장들인데, 하나의 작업 단위이다.
다르게 말하자면 트랜잭션은 그룹 안에 있는 각각의 연산이 성공적으로 이루어지지 않으면 절대 성공할 수가 없다.
트랜잭션에 있는 어떤 연산이 실패하든, 전체 트랜잭션이 실패하는 것이다.
ACID는 트랜잭션의 특성인데,
Atomicity 원자성
Consistency 일관성
isolation 격리성
Durability 지속성
4가지로 이루어져 있다.
트랜잭션은 "START TRANSACTION 혹은 BEGIN WORK"로 시작해서 "COMMIT이나 ROLLBACK" 문장으로 끝나게 된다.
시작과 끝 문장 사이에 위치하는 SQL 문장들은 대부분 트랜잭션으로 이루어져 있다.
START TRANSACTION;
SET @transAmt = '500';
SELECT @availableAmt:=ledgerAmt FROM accTable WHERE customerId=1 FOR UPDATE;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=1;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=2;
COMMIT;
START TRANSACTION
위의 문장 실행 시, autocommit이 꺼져서 COMMIT이나 ROLLBACK이 있을 때까지 유지되고
autocommit 모드가 이전 상태로 되돌아간다.