2019백업

5장 SQL의 기본

728x90

SQL 기본

 

Select 열이름

FROM 테이블이름

WHERE 조건

 

USE 구문

use 데이터베이스_이름

 

SELECT Name, height

FROM userTBl

WHERE height >= 180 AND height <= 183;

 

SELECT Name, height

FROM userTBl

WHERE height BETWEEN 180 AND 183;

연속적인 데이터는 between

 

SELECT Name, addr

FROM userTBl;

WHERE add IN (‘경남’,‘전남’,‘경북’,‘전북’);

이산적인 데이터는 IN을 사용한다.

 

 

SELECT Name, addr

FROM userTBl

WHERE addr = ‘경남 OR addr= ’전남‘ OR addr = ’경북‘ OR addr = ’전북‘;

 

경남 혹은 전남 혹은 경북 혹은 전북인 애들 이름 주소 나오게해라

 

like

select name, height

from userTbl

where name LIKE ‘%’; -- where name LIKE ‘_종신’;

 

 

select Name, height

from userTBL

where height > (select height from userTBL where name = ‘김경호’);

 

 

select Name, height

from userTBL

where height > any (select height from userTBL where addr = ‘강남’);

경남이라는 지역에 사는 사람보다 키가 큰사람. any 안쓰면 > ,=,<을 썻을 때 뒤에 질의문에 대한 결과가 1개만 나와야하는데 테이블 안썻지만 select height from userTBL where addr = ‘강남라는 질의문에 2개의 사람의 키의 값이 나오기 때문에 any를 써줘야한다.

 

where height =any (select ~~ ) in 과 같다.

 

 

ORDER BY

select Name, mDate FROM user Tbl ORDER BY mDate;

select Name, mDate FROM user Tbl ORDER BY height;

 

SELECT Name, height FROM user Tbl ORDER BY height desc, name asc;

order by는 쓰지 않는 것이 권장사항임

키로 내림차순하다가 같으면 이름으로 오름차순.

 

중복제거하는 distinct

SELECT DISTINCT addr from userTbl;

 

select emp_np, hire_date FROM emplyees

ORDER BY hire_date ASC

-> 이렇게 하면 3만건을 다조회해야함

 

LIMIT를 사용 ! -> 많이쓰임

select emp_np, hire_date FROM emplyees

ORDER BY hire_date ASC

LIMIT 0, 5; -- 0번째에서 5번째 까지

100, 5 100번째에서 5번째 까지

 

테이블 복사하기

 

CREATE TABlE buyTbl2 (SELECT * FROM buyTbl);

 

 

 

 

 

 

6-3

GROUP BY

형식:

SELECT select_expr

[ FROM table_references]

WHERE where_condition

GROUP BY col_name | expr | position

HAVING where_condition

ORDER BY {col_name | expr | position}

다 생략이 가능하지만 순서가 바뀌면 안된다.

 

select userID AS `사용자 아이디`, SUM(amount) AS `총 구매 개수`

from butTbl GROUP BY userID;

 

아이디 별 구입한 양

 

SUM, AVG, MAX, MIN,COUNT

 

가장 키가 큰 친구와 가장 키가 작은 친구을 출력

select Name, height

FROM userTbl

WHERE height = (SELECT MAX(height)FROM userTbl)

OR height = (SELECT MIN(height)FROM userTbl);

 

select count(*) from userTbl;

select count(mobile1) AS `휴대폰이 있는 사용자` from userTbl;

select count(*) from employees.employees;

-> db에게 부담이 안가게!

 

총구매액의 합계가 천이상인사람

select userID AS `사용자`, SUM(price*amount) AS `총구매액`

from butTbl

-- WHERE SUM(price*amout) > 1000

-- where절은 group by절에서 사용안하고 having을쓴다.

GROUP BY userID;

HAVING SUM(price*amout) > 1000

ORDER BY SUM(price*amount) DESC;

 

 

 

 

ROLLUP

각각 분류별로 소합계를 내주고 마지막에 총합계를 내주는 함수

SELECT num, groupName, SUM(price * amount) AS `비용`

FROM buyTbl

GROUP BY groupName, num

WITH ROLLUP;

-> 1,2,3,4,5 숫자매기면서 각각 합을 내줌 그리고 마지막에 소합계 맨 마지막엔 총합계

 

SELECT groupName, SUM(price * amount) AS ‘비용

FROM buyTbl

GROUP BY groupName, num

WITH ROLLUP;

각 물건?에 소합계만 출력하고 마지막에 총합계

총합계를 낼 때 유용함

 

SQL의 분류

DML, DDL, DCL

 

DML

select, delete, insert, update

DDL

CREATE, DROP, ALTER

DDL은 되돌림(rollback)이나 완적적용(commit)을 시킬수가 없다.

 

DCL

GRANT,REVOKE,DENY

 

 

INSERT문의 기본

 

CREATE TABLE testTbl1 (id, int, userName char(3), age int);

INSERT INTO testTbl1 VALUES (1, ‘홍길동’, 25)

INSERT INTO testTbl1(id, userName) VALUES(2,‘설현’)

INSERT INTO testTbl1(userName, age, id) VALUES (‘조아’,26,3)

 

 

 

 

 

 

 

CREATE TABLE testTbl2

( id int AUTO_INCREMENT PRIMARY KEY,

userName char(3),

age int );

INSERT INTO testTbl2 VALUES (NULL, ‘지민’, 25);

INSERT INTO testTbl2 VALUES (NULL, ‘유나’, 22);

INSERT INTO testTbl2 VALUES (NULL, ‘유경’, 21);

 

null값을 넣었지만 AUTO_INCREMENT PRIMARY KEY로 인해서 1씩증가해 차레대로 숫자값이 들어가게 된다.

 

select LAST_INSERT_ID(); 몇 번까지 들어갔는지 알아봄 위에 sql문에서는 3번인 3이 나옴

 

alter table testTBl2 AUTO_increment=100;

INSERT INTO testTbl2 VALUES (NULL, ‘찬미’, 23);

하면 100번부터 들어가게됨.

 

새로운 테이블 생성

 

CREATE TABLE testTbl3

( id int AUTO_INCREMENT PRIMARY KEY,

userName char(3),

age int );

ALTER TABLE testTbl3 AUTO_INCREMENT=1000;

SET @@auto_increment_increment=3;

1000번부터 시작하고 3씩 증가 시키겠다.

 

INSERT INTO testTbl2 VALUES (NULL, ‘나연’, 20);

INSERT INTO testTbl2 VALUES (NULL, ‘정연’, 18);

INSERT INTO testTbl2 VALUES (NULL, ‘모모’, 19);

 

다른 테이블에 있는 내용 insert 하기(대량의 테이블 넣기)

create talbe testTbl4 (id int, Fname varchar(50), Lname varchar(50));

insert into testTbl4;

SELECT emp_no, first_name, last_name

FROM employees.employees;

CREATE TABLE testTbls

(SELECT emp_no, first_name, last_name FROM employees.employees);

데이터의 수정 : UPDATE

UPATE 테이블

SET 1 = 1, 2=2...

WHERE 조건;

WHERE 조건을 안써줫을 때 모두 수정 될 수 있으므로 왠만하면 써주는 것으로한다.

 

 

UPDATE testTbl4

SET Lname = ‘없음

WHERE Fname = ‘Kyochi’;

 

where 문을 안써줬을 경우 모두 Lname이 없음으로 바뀌고 되돌리기 힘들게 된다.

 

delete from testTbl4 WHERE Fname = ‘Amer’ LIMIT 5;

LIMIT를 안써줬다면 200건정도 썻다면 5건 지워짐

 

DELETE FROM bigTbl1; -- 시간이 오래걸림 drop이나 truncate를 사용

DROP TABLE bigTbl2; --테이블을 모두 지우겟다. 테이블구조까지 지우겟다.

TRUNCATE TABLE bigTbl3; --테이블의 내용은 다 지우지만 구조는 남기고싶다.

 

insert ignore into memberTBL VALUES(‘BBK’,‘비비코‘,’미국‘);

insert ignore into memberTBL VALUES(‘SJH’,‘서장훈‘,’서울‘);

-> BBK는 이미 테이블에 있고 기본키가 아이디이기 때문에 안들어감

위에서 실패하면 서장훈도 같이 안들어가기에 중복된게 잇다면 무시하고 다음 것을 실행하라는 의미인 IGNORE을 써줌

 

insert ignore into memberTBL VALUES(‘BBK’,‘비비코‘,’미국‘);

ON DUPLICATE KEY UPDATE name = ‘비비코’, addr =’미국‘;

-> bbk가 있다면 중복이된다면 이것으로 바꿔줘라 잘쓰이지는 않음

 

반응형

'2019백업' 카테고리의 다른 글

Chapter3_1정리(Day 7일차)  (0) 2018.05.23
mysql고급문법  (0) 2018.05.15
데이터분석 4장 핵심  (0) 2018.05.12
4장 데이터 모델링  (0) 2018.05.11
3장  (0) 2018.05.10