DB - 09

월요일좋아·2022년 9월 19일
0

DB

목록 보기
9/9

SELECT ~ FROM ~ WHERE

PRIMART KEY

PRIMARY KEY : unuque, not null 속성을 가짐
일반적으로 primary key는 최소 1개는 선택되어있어야함
PRIMARY KEY로 만든 column은 인덱스에 자동생성됨

member테이블 생성

✏️입력

CREATE TABLE MEMBER(
 mem_id CHAR(8) PRIMARY KEY,
 mem_name VARCHAR(10) NOT NULL,
 mem_number INT NOT NULL,
 addr CHAR(2) NOT NULL,
 phone1 CHAR(3), -- 지역번호 --
 phone2 CHAR(8),
 height SMALLINT, -- INT보다 작은 범위 --
 debut_date DATE
);

INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO member VALUES('BLK', '블랙핑크', 4, '경남', '055', '22222222', 163, '2016.08.08');
INSERT INTO member VALUES('WMN', '여자친구', 6, '경기', '031', '33333333', 166, '2015.01.15');
INSERT INTO member VALUES('OMY', '오마이걸', 7, '서울', NULL, NULL, 160, '2015.04.21');
INSERT INTO member VALUES('GRL', '소녀시대', 8, '서울', '02', '44444444', 168, '2007.08.02');
INSERT INTO member VALUES('ITZ', '잇지', 5, '경남', NULL, NULL, 167, '2019.02.12');
INSERT INTO member VALUES('RED', '레드벨벳', 4, '경북', '054', '55555555', 161, '2014.08.01');
INSERT INTO member VALUES('APN', '에이핑크', 6, '경기', '031', '77777777', 164, '2011.02.10');
INSERT INTO member VALUES('SPC', '우주소녀', 13, '서울', '02', '88888888', 162, '2016.02.25');
INSERT INTO member VALUES('MMU', '마마무', 4, '전남', '061', '99999999', 165, '2014.06.19');

※ char vs varchar

id char(20)
pwd varchar(10)

데이터베이스의 물리적 단위 : 페이지
char로 만든 id를 aaa로 설정하면 남는공간 17 있지만
varchar로 만든 pwd는 1234로 설정하면 남는공간없이 애초에 char(4)로 생성한것처럼 됨.
id는 변경이 안되기때문에 데이터베이스의 페이지에 영향을 주지 않으므로 varchar로 설정하는것이 낫고
pwd는 변경이 가능하기때문에 공간이 미리 확보가 되어있도록 char로 설정하는것이 나음

  • char : 수정이 빈번하게 일어나는 컬럼에 사용
  • varchar : 수정이 거의 일어나지않는 컬럼에 사용

※ smallint : int보다 적은 수의 범위(공간 절약)

💻출력


COUNT 함수

테이블의 행이 몇개인지 알수있는 함수
SELECT COUNT(*) FROM 테이블명;

SELECT COUNT(*) FROM MEMBER;`


외래키(FOREIGN KEY)

외래키 : 다른 테이블 참조(REFERENCES)
FOREIGN KEY (본인테이블의 컬럼)
REFERENCES 참조하고자하는테이블명(참조하고자하는 테이블의 컬럼명)

CREATE TABLE buy(
 num INT AUTO_INCREMENT PRIMARY KEY,
 mem_id CHAR(8) NOT NULL,
 prod_name CHAR(6) NOT NULL,
 GROUP_name CHAR(4),
 price INT NOT NULL,
 amount SMALLINT NOT NULL,
 FOREIGN KEY(mem_id) REFERENCES MEMBER(mem_id) -- 외래키 --
)

INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
INSERT INTO buy VALUES(NULL, 'BLK', '맥북프로', '디지털', 1000, 1);
INSERT INTO buy VALUES(NULL, 'APN', '아이폰', '디지털', 200, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '아이폰', '디지털', 200, 5);
INSERT INTO buy VALUES(NULL, 'BLK', '청바지', '패션', 50, 3);
INSERT INTO buy VALUES(NULL, 'MMU', '에어팟', '디지털', 80, 10);
INSERT INTO buy VALUES(NULL, 'GRL', '혼공SQL', '서적', 15, 5);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 2);
INSERT INTO buy VALUES(NULL, 'APN', '청바지', '패션', 50, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 1);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 4);

buy 테이블을 member 테이블에 연결


외래키 예제 1

✏️입력

CREATE TABLE tbl부서(
	부서id CHAR(5) PRIMARY KEY,
	부서명 CHAR(10) NOT NULL
);

INSERT tbl부서 VALUES ('A01', '총무부');
INSERT tbl부서 VALUES ('B01', '영업부');
INSERT tbl부서 VALUES ('C01', 'IT부');

SELECT * FROM tbl부서;

CREATE TABLE tbl사원(
 사원id CHAR(5) PRIMARY KEY,
 사원명 CHAR(5) NOT NULL,
 부서id CHAR(5) NOT NULL,
 FOREIGN KEY (부서id) REFERENCES tbl부서(부서id) -- 외래키 추가 -- 
);

tbl사원 테이블을 생성하면서 외래키로 부서id 컬럼을 tbl부서id 컬럼을 참조하게 되면
tbl사원테이블에는 tbl부서 테이블의 부서id에 없는 데이터를 생성할 수 없게 됨.

tbl부서 테이블

tbl사원 테이블


✏️입력

INSERT tbl사원 VALUES ('z001', '아이유', 'D01');

💻실행

✏️입력

INSERT tbl사원 VALUES ('z001', '아이유', 'C01');

💻실행

정상적으로 데이터가 입력이 된다.


alias

SELECT m.mem_id, m.mem_name
FROM member m;
WHERE ~

위와같은 형식으로 member 테이블의 별병을 m으로 지정해서 mamber테이블의 컬럼을 m.mem_id로 불러올수 있다.
테이블의 수가 많아지면서 컬럼명이 겹치는 경우가 많아지므로 명시성을 위해 테이블의 별칭을 설정해두는것이 좋다.

SELECT m.mem_name AS "이름", m.debut_date AS '데뷔날짜'
FROM member m

데이터를 가져올때 위와같이 AS를 이용하여 컬럼명을 변경하여 가져올수 있다.
이 때, 데이터가 문자형이면 쌍따옴표(" "), 숫자/날짜형이면 (' ')이용.

컬럼명에 별칭을 달아줄 때 : 칼럼명 AS "별칭이름" ,
테이블명에 별칭을 달아줄 때 : 테이블명 ^ 별칭

where

SELECT *
FROM member
WHERE mem_name = '블랙핑크';

mem_name이 char타입이라서 조건설정시 '홑따옴표' 사용

SELECT *
FROM member
WHERE mem_number = 4;

숫자타입의 조건은 따옴표 사용 X


문제1

멤버가 5명 이상인 걸그룹의 mem_id와 mem_name, addr를 가져오시오

SELECT mem_id, mem_name, addr
FROM member
WHERE mem_number >= 5;

문제2

멤버의 평균키가 167 미만의 컬그룹의 mem_id와 height를 가져오시오

SELECT mem_id, height
FROM member
WHERE height < 167
ORDER BY height DESC;

※ order by는 식에서 제일 마지막에 적용이 됨 --


조건 : 단일, 복수(or, and)

AND 연산

SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;

member 테이블에서
height가 165 이상 이면서 mem_number이 6 초과인
mem_name, height, mem_number 컬럼의 데이터

OR 연산

SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 or mem_number > 6;

member 테이블에서
height가 165 이상이거나 mem_number이 6인
mem_name, height, mem_number 컬럼의 데이터

범위

-- height : 163~165 --

SELECT mem_name, height, mem_number
FROM member
WHERE height >= 163 AND height <= 165
ORDER BY height;

member 테이블에서
height가 163 이상 이면서 height가 165이하 (163~165)인
mem_name, height, mem_number 컬럼의데이터를
height 컬럼기준으로 오름차순으로 보기

※다른방법? -> between A and B

SELECT mem_name, height, mem_number
FROM member
WHERE height BETWEEN 163 AND 165 -- 범위설정 : between A and B --

범위설정 : between A and B

IN()

-- 주소가 경기, 전남, 경남 =--

SELECT mem_id, mem_name, addr
FROM member
WHERE addr IN('경기', '전남', '경남')
-- = (WHERE addr addr ='경기' OR addr = '전남' OR addr='경남') --
ORDER BY addr;

WHERE 조건에서 IN(A, B, C)A or B or C 와 동일한 의미

=!

SELECT mem_id, mem_name, addr
FROM member
WHERE addr != '경기' 
ORDER BY addr;

addr이 경기가 아닌(=!:부정의 의미not)
mem_id, mem_name, addr 컬럼

SELECT mem_id, mem_name, addr
FROM member
WHERE addr NOT IN('경기', '전남', '경남') -- ? --
ORDER BY addr;

????????????

SELECT mem_id, mem_name, addr
FROM member 
WHERE addr NOT IN('경기', '전남', '경남') -- ? -- 
ORDER BY addr;

검색 : like 패턴 ( % , _ )

SELECT *
FROM member
WHERE mem_name LIKE '우%';

'우'로 시작하는 이름 검색 --

SELECT *
FROM member
WHERE mem_name LIKE '%핑크';

'핑크'로 끝나는 이름 검색 --

SELECT *
FROM member
WHERE mem_name LIKE '__핑크';

_(언더바) 하나는 한 글자를 뜻함,
핑크앞의 앞글자가 2글자이면서 핑크로끝나는이름을 검색

0개의 댓글