Programming/데이터베이스 관리(DBMS) \ 관리자(DBA)
mysql(데이터 베이스)/ SQL(query 쿼리문) 기본k
esoog Polaris
2023. 6. 1. 23:10
# 기본적으로 쿼리문은
워크벤치-file에서 sql script open 혹은 save가 가능함.
예약어 대,소문자는 워크벤치-edit-preferences-query edit-use uppercase로 설정 가능.
리눅스는 소문자로 해야함.(처음부터 그럼 소문자로 익히는게 나으려나)
# SQL 기본
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- SQL 주석 처리 | |
USE employees; | |
-- 사용할 데이터베이스 선택 | |
-- 워크벤치 왼쪽 schema 태그에서 이름 드래그 가능 | |
-- 기본 데이터베이스 참조 | |
SHOW DATABASES; | |
-- 데이터베이스 목록 보여줘 | |
SHOW TABLES; | |
-- 테이블 목록 보여줘 | |
SHOW TABLE STATUS; | |
-- 현재 데이터베이스에 어떤 테이블들 있는지 상태 출력 | |
DESCRIBE employees; | |
-- 또는 DESC employees; : 테이블의 정보 | |
-- 데이터베이스 초기화 및 생성. | |
DROP DATABASE IF EXISTS sqldb; | |
-- 만약 sqldb가 존재하면 우선 삭제. | |
-- 단, 외래키 제약의 기준 테이블은 외래키 삭제후 삭제 가능. | |
CREATE DATABASE sqldb; | |
--데이터베이스(데이터) 생성 | |
--데이터 베이스(데이터)> 테이블(데이터 테이블) > 레코드(데이터 행)> 속성(데이터 값) | |
-- 기본키, 외래키 사용 | |
USE sqldb; | |
-- 테이블 생성 및 열 속성 지정 | |
CREATE TABLE usertbl | |
( userID CHAR(8) NOT NULL PRIMARY KEY, | |
-- 사용자 아이디(PK로 사용). 최대 8자 | |
-- CHAR(정적)는 내부적으로도 최대글자/ VARCHAR(동적)는 내부적으로는 입력값글자만 | |
name VARCHAR(10) NOT NULL, | |
-- 이름 | |
birthYear INT NOT NULL, | |
-- 출생년도 | |
addr CHAR(2) NOT NULL, | |
-- 각 개체들의 이름은 영문으로 사용 | |
-- 지역(경기,서울,경남 식으로 2글자만입력) | |
mobile1 CHAR(3), | |
-- 휴대폰의 국번(011, 016, 017, 018, 019, 010 등) | |
mobile2 CHAR(8), | |
-- 휴대폰의 나머지 전화번호(하이픈제외) | |
height SMALLINT, | |
-- 키, 작은 정수 | |
mDate DATE | |
-- 회원 가입일 | |
); | |
CREATE TABLE buytbl | |
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY, | |
-- 순번(PK), INT AUTO_INCREMENT 자동 증가 수 | |
userID CHAR(8) NOT NULL, | |
-- 아이디(FK) | |
prodName CHAR(6) NOT NULL, | |
-- 물품명 | |
groupName CHAR(4) , | |
-- 분류 | |
price INT NOT NULL, | |
-- 단가 | |
amount SMALLINT NOT NULL, | |
-- 수량 | |
FOREIGN KEY (userID) REFERENCES usertbl(userID) | |
-- usertbl(userID)값을 참조하여 현재 테이블의 (userID)값으로 함. | |
); | |
INSERT INTO usertbl VALUES('KBS', '김범수', 1979, '경남', '011', '2222222', 173, '2012-4-4'); | |
INSERT INTO buytbl VALUES(NULL, 'KBS', '운동화', NULL , 30, 2); | |
INSERT INTO buytbl VALUES(NULL, 'KBS', '노트북', '전자', 1000, 1); | |
-- SELECT문 사용 순서 | |
SELECT -- 열 이름 | |
FROM -- 테이블 이름 | |
WHERE -- 조건 | |
-- 이까지 기본 SELECT문 | |
GROUP BY -- | |
HAVING -- | |
ORDER BY -- 정렬 순서 | |
SELECT * FROM employees; | |
-- SELECT 열이름 FROM 테이블 이름; | |
SELECT * FROM employees.titles; | |
-- use를 사용 안 했다면, | |
-- SELECT 열이름 FROM 데이터베이스.테이블이름; | |
SELECT first_name, last_name, gender FROM employees; | |
-- 열 지정 여러개 선택 가능. | |
-- SELECT문 WHERE 조건절 상세 | |
USE sqldb; | |
SELECT * FROM usertbl WHERE name = '김경호'; | |
SELECT userID, Name FROM usertbl WHERE birthYear >= 1970 AND height >= 182; | |
-- userID, Name열을 추출하는데, birthYear >= 1970 AND height >= 182 인 결과 출력 | |
SELECT userID, Name FROM usertbl WHERE birthYear >= 1970 OR height >= 182; | |
SELECT name, height FROM usertbl WHERE height >= 180 AND height <= 183; | |
SELECT name, height FROM usertbl WHERE height BETWEEN 180 AND 183; | |
-- BETWEEN A AND B; 사이 연속적인 값에서 사용 가능 | |
SELECT name, addr FROM usertbl WHERE addr='경남' OR addr='전남' OR addr='경북'; | |
SELECT name, addr FROM usertbl WHERE addr IN ('경남','전남','경북'); | |
-- IN ( ); 중에 하나 값으로 이산적인 값에서 사용 가능 | |
SELECT name, height FROM usertbl WHERE name LIKE '김%'; | |
-- 문자열 검색. 상세 조건으로 LIKE '%':모든 타입(mysql에서 모든을 의미), '_':문자, '#':숫자 로 가능 | |
SELECT name, height FROM usertbl WHERE name LIKE '_종신'; | |
-- 앞에 조건타입이 들어가면 별로 좋지 않음... | |
-- 서브쿼리문(조건 안에 (조건) 입력 가능) | |
SELECT name, height FROM usertbl | |
WHERE height > (SELECT height FROM usertbl WHERE Name = '김경호'); | |
-- 김경호 height 보다 큰 height의 name, height | |
-- * 서브 조건 값이 여러 명일 경우 오류발생함. | |
-- 그래서 아래처럼 사용. | |
SELECT name, height FROM usertbl | |
WHERE height > ANY (SELECT height FROM usertbl WHERE addr = '경남'); | |
-- ANY (아무거나 해당되는), =ANY와 IN은 같음. | |
SELECT name, height FROM usertbl | |
WHERE height > ALL (SELECT height FROM usertbl WHERE addr = '경남'); | |
-- ALL (모든 사람을 조건으로) | |
SELECT name, mDate FROM usertbl ORDER BY mDate; | |
-- ORDER BY mDate 오름차순(디폴트), 순서정렬은 성능에 악영향... | |
SELECT name, mDate FROM usertbl ORDER BY mDate DESC; | |
-- ORDER BY mDate DESC 내림차순 | |
SELECT name, height FROM usertbl ORDER BY height DESC, name ASC; | |
-- height 내림차순으로 나열하고, 같은 값이 있으면 뒤에 조건 name 오름차순으로 나열 | |
-- 특수문 | |
SELECT DISTINCT addr FROM usertbl; | |
-- SELECT DISTINCT 중복된 값 제거 후 출력 | |
SELECT emp_no, hire_date FROM employees | |
ORDER BY hire_date ASC | |
LIMIT 5; | |
-- 상위 행 갯수 제한 | |
SELECT emp_no, hire_date FROM employees | |
ORDER BY hire_date ASC | |
LIMIT 0, 5; | |
-- LIMIT 5 OFFSET 0 과 동일(0~5행까지) | |
CREATE TABLE buytbl2 (SELECT * FROM buytbl); | |
-- 테이블 복사 방법 CREATE문 (참조 식별자); | |
CREATE TABLE buytbl3 (SELECT userID, prodName FROM buytbl); | |
-- 다만, 이렇게 쿼리문으로 복사하면, 기본키나 외래키 등은 복사x | |
-- GROUP BY | |
SELECT userID, SUM(amount) FROM buytbl GROUP BY userID; | |
-- 그룹으로 묶어서 amount를 SUM()합계해서 출력 | |
SELECT userID AS '사용자 아이디', SUM(amount) AS '총 구매 개수' | |
FROM buytbl GROUP BY userID; | |
-- AS 는 별칭으로 출력 가능 | |
-- 집계함수 자체가 GROUP BY 함수와 같이 쓰는 걸로 인식하면 된다. | |
-- SUM() AVG() MAX() MIN() ... | |
USE sqldb; | |
SELECT AVG(amount) AS '평균 구매 개수' FROM buytbl ; | |
SELECT userID, AVG(amount) AS '평균 구매 개수' FROM buytbl GROUP BY userID; | |
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; | |
-- 그래서 이렇게 컬럼을 지정하면 null 제거하고 있는 값 개수만 나온다. | |
SELECT userID AS '사용자', SUM(price*amount) AS '총구매액' | |
FROM buytbl | |
GROUP BY userID | |
HAVING SUM(price*amount) > 1000 ; | |
ORDER BY SUM(price*amount) ; | |
-- 집계함수는 WHERE절에서는 사용 불가하므로. 조건 절에서 집계함수를 사용하기 위해서는 | |
-- HAVING 절로 사용. 꼭 GROUP BY 뒤에 나와야 한다. 그룹화된 내용에서 조건으로 사용하니까. | |
SELECT num, groupName, SUM(price * amount) AS '비용' | |
FROM buytbl | |
GROUP BY groupName, num | |
WITH ROLLUP; | |
-- WITH ROLLUP;은 GROUP BY절과 함께, 그룹 내 소합계 및 총합계를 내기 위함 | |
-- *SQL분류 | |
-- DDL(데이타 정의 언어) : CREATE, DROP, ALTER - 트랜잭션x, 바로 mysql적용. | |
-- DML(데이티 조작 언어) : SELECT, INSERT, DELETE, UPDATE - 트랜잭션o(임시 적용) | |
-- DCL(데이터 제어 언어) : GRANT, REVOKE, DENY - 사용자 권한리관리 | |
-- INSERT 문 | |
-- INSERT INTO 열 VALUES(값); | |
USE sqldb; | |
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); | |
USE sqldb; | |
CREATE TABLE testTbl2 | |
(id int AUTO_INCREMENT PRIMARY KEY, | |
-- int AUTO_INCREMENT: 자동 증가 1~. 보통 프라이머리 키로 사용. id값 | |
userName char(3), | |
age int ); | |
ALTER TABLE testTbl2 AUTO_INCREMENT=100; | |
-- ALTER TABLE testTbl2 AUTO_INCREMENT=100; 현재 마지막 행 이후의 행부터 순서값을 지정해서 사용할 수 있다. | |
USE sqldb; | |
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; | |
-- SET @@auto_increment_increment=3; 자동 증가값을 정할 수 있다. | |
USE sqldb; | |
CREATE TABLE testTbl4 (id int, Fname varchar(50), Lname varchar(50)); | |
INSERT INTO testTbl4 | |
SELECT emp_no, first_name, last_name | |
FROM employees.employees ; | |
-- 다른 데이터 복사 입력(SELECT해서) | |
-- UPDATE 테이블 SET 열='값' WHERE 조건 | |
UPDATE testTbl4 | |
SET Lname = '없음' | |
-- 기존 열의 어떤 값을 '없음'으로 바꿔라 | |
WHERE Fname = 'Kyoichi'; | |
-- 조건인 ~인 경우에 대해 | |
UPDATE buytbl SET price = price * 1.5 ; | |
-- DELETE FROM 테이블 WHERE 조건 | |
USE sqldb; | |
DELETE FROM testTbl4 WHERE Fname = 'Aamer'; | |
DELETE FROM testTbl4 WHERE Fname = 'Aamer' LIMIT 5; | |
DELETE FROM bigTbl1; | |
-- DELETE FROM 테이블: 한 행씩 삭제(다만, WHERE 조건 없으면 전체 테이블 삭제) | |
DROP TABLE bigTbl2; | |
-- DROP TABLE 테이블: 테이블 자체 삭제 | |
TRUNCATE TABLE bigTbl3; | |
-- TRUNCATE TABLE 테이블: 테이블의 구조는 남아있지만, 딜리트와 같이 삭제 | |
-- 조건부 데이타 입력 | |
USE sqldb; | |
CREATE TABLE memberTBL (SELECT userID, name, addr FROM usertbl LIMIT 3); | |
-- 3건만 가져옴 | |
ALTER TABLE memberTBL | |
ADD CONSTRAINT pk_memberTBL PRIMARY KEY (userID); | |
-- PK를 지정함 | |
SELECT * FROM memberTBL; | |
-- INSERT IGNORE INTO ~ 삽입하는데, 오류나도 무시하고 넘어가라 | |
INSERT IGNORE INTO memberTBL VALUES('BBK' , '비비코', '미국'); | |
INSERT INTO memberTBL VALUES('BBK' , '비비코', '미국') | |
ON DUPLICATE KEY UPDATE name='비비코', addr='미국'; | |
-- ON DUPLICATE KEY UPDATE 중복되면 업데이트 해라. 아니면 그냥 입력 | |
USE sqldb; | |
SELECT userid AS '사용자', SUM(price*amount) AS '총구매액' | |
FROM buyTBL GROUP BY userid; | |
--검색 결과 자체를 테이블로 사용 | |
WITH abc(userid, total) | |
--abc라는 이름으로(열이름) | |
AS | |
-- 원본 | |
(SELECT userid, SUM(price*amount) | |
FROM buyTBL GROUP BY userid ) | |
WITH cte_usertbl(addr, maxHeight) | |
AS | |
( SELECT addr, MAX(height) FROM usertbl GROUP BY addr) | |
SELECT AVG(maxHeight*1.0) AS '각 지역별 최고키의 평균' FROM cte_usertbl; |
# 데이터를 일반 파일로 추출(csv, xml, ...)
: 데이터 조회후 그리드 상단 가운데, export/import

반응형