본문 바로가기

DB

MySQL 기본: SQL 기본

SELECT 문

원하는 데이터를 가져와 주는 기본적인 <SELECT... FROM>

use 테이블 이름

USE employess;
SELECT * FROM employees.titles;
SELECT * FROM titles;
SELECT first_name FROM employees;

작성 방법은 위와 같으며 특정 테이블에서 모든 속성, 특정 속성을 가져올 수 있고 특정 테이블의 속성에서 값을 가져올 수 있다.

특정한 조건의 데이터만 조회하는 <SELECT... FROM ...WEHRE>

SELECT * FROM USERS WHERE name = '김경호'; //기본적인 where절

SELECT userId, Name FROM users WHERE birthYear >= 1970 AND height >= 182; // 관계 연산자 이용

SELECT name, height FROM users WHERER height >= 180 AND height <= 183; // 관계연산자 이용
SELECT name, height FROM users WHERER height BETWEEN 180 AND 183 ; // 사잇값을 BETWEEN 연산을 통해 수행 가능

SELECT name, addr FROM users WHEREE addr = '경남' OR addr = '전남' OR addr = '경북'; // 관계연산자 이용
SELECT name, addr FROM users WHERE addr IN ('경남', '전남', '경북'); // 동일 컬럼에 대한 OR 연산자 대신 IN 절을 사용 가능

SELECT name, height FROM users WHERE name LIKE '김%'; // like문을 이용해 name 컬럼의 앞글자가 김인 row 조회
SELECT name, height FROM users WHERE name LIKE '_종신'; // like 문을 이용해 제일 앞글자가 1글자이고 뒤에 글자가 종신인 row 조회
SELECT name, height FROM users WHERE name LIKE '_종%'; // like 문을 이용해 제일 앞글자가 1글자이고 그 다음 글자가 종, 뒤에 아무 글자가 오는 값을 조회할 수 있다.

SELECT name, height FROM users WHERE height > 177;
SELECT name, height FROM users WHERE height > (SELECT hegiht FROM users where name = '김경호'); // 김경호의 키가 177이라고 했을 때 위의 쿼리가 아닌 서브쿼리를 통해 수행 가능
SELECT name, height FROM users WHERE height >= (SELECT height FROM users WHERE addr = '경남'); // 서브쿼리의 결과가 2개 이상 반환될 경우 에러 발생
SELECT name, height FROM users WHERE height >= ANY (SELECT height FROM users WHERE addr = '경남'); // ANY를 사용해 서브쿼리의 각 결과별로 또는이 적용되도록 설정 가능 예를 들어 서브커리의 결과로 173, 170이 반환됐을 때 173 이상 또는 170 이상인 회원이 조회됨. ANY 대신 SOME 사용 가능

SELECT name, height FROM users WHERE height = ANY (SELECT height FROM users WHERE addr = '경남');
SELECT name, height FROM users WHERE height IN (SELECT height FROM users WHERE addr = '경남');// 이런식으로 =ANY는 IN으로 대체 가능

SELECT name, mDate FROM users ORDER BY mDate; 
SELECT name, mDate FROM users ORDER BY mDate DESC; // 내림차순 정렬, 명시 안해준다면 default 값으로 오름차순(ASC)

SELECT addr FROM users;
SELECT DISTINCT addr FROM users; // 위 쿼리는 모든 주소를 출력하는데 중복되는 값을 DISTICNT를 통해 줄일 수 있다.

SELECT * FROM users;
SELECT * FROM users LIMIT 5; // 5개만 조회, 데이터가 많을 때 limit을 이용해서 쿼리 성능을 향상 가능하다. (페이징 처리할 때 사용하는 쿼리다.)
SELECT * FROM users LIMIT 5, 5 // 5번째 데이터부터 5개 조회

CREATE TALBE users2 (SELECT * FROM users); // 이런식으로 특정 테이블을 복사할 수 있다.

GROUP BY 및 HAVING 그리고 집계 함수

SELECT 문의 결과를 GROUP별로 묶어준 것.

SELECT userId, SUM(amount) FROM buy GROUP BY userId; //이런식으로 총 결과를 userId 별로 나눠서 그룹화 가능
SELECT userId AS '사용자 아이디', SUM(price * amount) AS '총 구매액' FROM buys GROUP BY userId; // 이런식으로 응용이랑 별칭 사용가능

SELECT userId AS '사용자', SUM(price * amount) AS '총구매액' FROM buys GROUP BY userId HAVING SUM(price * amount) > 1000; // 이런식으로 GROUPBY 절 이후 WEHRE 문 대신 HAVING문을 사용해야함.

SELECT userId, AVG(amoun) AS '평균 구매 개수' FROM buys GROUP BY userId // avg 집계함수
SELECT name, MAX(height), MIN(height) FROM userId // MAX, MIN 집계함수
SELECT COUNT(mobile1) AS '휴대폰이 있는 사용자' FROM users; // count 집계함수

SQL의 분류

SQL은 크게 DML, DDL, DCL로 분류한다.


DML: 데이터를 조작, 삭제하는데 사용되는 언어 SELECT, INSERT, UPDATE, DELETE가 해당한다. 또한 트랜잭션이 발생하는 SQL도 여기에 해당
DDL: 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 개체를 생성/삭제/변경하는 역할 롤백이 안된다. CREATE, DROP, ALTER이 해당
DCL: 사용자에게 권한을 부여하거나 빼앗을 때 사용하는 구문, GRANT/REVOKE/DENY가 해당.

데이터의 변경을 위한 SQL 문

데이터의 삽입: INSERT

INSERT INTO users(id, userName) VALUES (2, '설현');
INSERT INTO users(userName, age, id) VALUES ('하니', 26, 3);

AUTO_INCREMENT에 대한 값도 변경 가능
ALTER TABLE users AUTO_INCREMENT=100;
INSERT INTO users VALUES (NULL, '찬미', 23); // AUTO_INCREMENT 값이 100부터 시작 id가 auto_increment 로 지정되어 있ㅇ므

SET @@auto_increment_increment=3; //이런식으로 auto_increment 값을 3씩 증가 가능

USE sqldb;
CREATE TABLE test (id int, Fname varchar(50), Lname varchar(50));
INSERT INTO test SELECT emp_no, first_name, last_name FROM employees.employees;//이런식으로 대량의 데이터를 넣을 수 있는데, SELECT 문의 결과 열의 개수가 insert 할 테이블의 열 개수와 일치해야 한다.

데이터의 수정: UPDATE

UPDATE test set Lname = '없음' WHERE Fname = 'kyoichi'; // 기본 문법

UPDATE buys SET price = price * 1.5; // 이런식으로 모든 로우에 적용 가능

데이터의 삭제: DELETE FROM

DELETE FROM test WHERE Fname = 'Aamer'; // delete 문으로 트랜잭션 로그를 기록한다.
TRUNCATE table test // 트랜잭션 로그를 기록하지 않고 테이블 내의 모든 데이터를 삭제해야할 때 사용한다. 따라서 delete보다 빠름

조건부 데이터 입력, 변경

INSERT INTO members VALUES('BBK', '바비코', '미국')
ON DUPLICATE KEY UPDATE name = '바비코', addr='미국'; // id에 해당하는 값이 bbk일 때 이런식으로 삽입 하려는 값중 pk가 중복될 경우 update 쿼리를 날리게 할 수 있다.