Preface
이번 장에선 MySQL의 기본적인 문법을 공부했다.
데이터베이스 개론에서 이미 한 번 훑어봤던 내용들이라 쉽게 이해하며 넘어갈 수 있었다.
또, Workbench에서 직접 코드를 작성해보며 실습을 하니 기본 문법들은 금방 손에 익어 영문도 금방 작성할 수 있었다.
처음 파이썬 공부를 시작했을 땐 영타를 칠 줄 몰라 하나 하나 키보드를 찾아가며 독수리 타법으로 타자를 쳤었는데, 그동안 코딩 공부를 하며 영타를 계속 접했던 것이 도움이 됐는지 요즘엔 대부분 막힘 없이 잘 쓴다.
공부도 공부지만, 요즘 무기력증이 온 것 같아 큰일이다.
만사가 귀찮고 아무것도 하기가 싫다.
뭘 해도 재미가 없고 열심히 하고자 하는 욕구가 생기지 않는다.
잠을 자도 자도 피곤하고 몸이 축축 쳐져서 쉬는 날에는 10시간도 넘게 자는 것 같다.
솔직히 이번 장도 대부분 실습 위주로 이루어져 있기 때문에 마음만 먹으면 금방 끝낼 수 있었지만, 이놈의 의지박약 때문에 미루고 미루다 이제야 마치고 글을 쓴다.
어디든 바람을 쐬러 잠깐 다녀와야서 정신을 차려야 할 것 같다.
그리고, 집에서 공부하기보단 평소처럼 카페에 가서 공부를 해야 할 것 같다.
1. SELECT 문
- SELECT 문의 전체 구문 형식
SELECT select_expr
[from table_refefences]
[where where_condition]
[group by {col_name | expr | position}]
[having where_condition]
[order by {col_name | expr | position}]
- 현재 사용하는 DB를 지정 또는 변경
use 데이터베이스_이름;
→ Navigator의 Schemas 탭에서 사용할 DB를 더블클릭해도 된다.
- SQL문은 전체 대문자 또는 소문자 등으로 통일하는 것이 구문을 읽기 쉽게 한다.
- titles 테이블에서 모든 열의 내용 출력
select * from titles;
→ 원래 테이블의 전체 이름은 '데이터베이스이름.테이블이름' 형식으로 표현되지만, 이미 데이터베이스를 선택했기 때문에 앞은 생략할 수 있다.
→ 여러 개의 열을 가져오고 싶으면 콤마(,)로 구분하면 된다.
- 현재 서버에 어떤 DB가 있는지 조회
show databases;
- 현재의 DB에 있는 테이블의 정보를 조회
show table status;
- 특정 테이블의 열이 무엇이 있는지 확인
describe 테이블이름; / desc 테이블이름;
- 열 이름은 별도의 별칭으로 지정할 수도 있다.
→ 중간에 공백이 있다면 꼭 작은 따옴표로 묶어줘야 한다. (공백이 없어도 사용하는 것을 권장)
select 열 이름 as '별칭' from 테이블 이름;
- 식별자(identifier): 데이터베이스(스키마) 개체의 이름
- 데이터베이스 개체: 데이터베이스, 테이블, 인덱스, 열, 뷰, 트리거, 스토어드 프로시저 등과 같은 개체들
- 앞으로의 예시에서 사용할 sqldb 테이블
drop database if exists sqldb;
create database sqldb;
use sqldb;
create table usertbl -- 회원 테이블
( userID char(8) not null primary key, -- 사용자 아이디(pk)
username 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)
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)
);
insert into usertbl values('LSG', '이승기', 1987, '서울', '011', '11111111', 182, '2008-8-8');
insert into usertbl values('KBS', '김범수', 1979, '경남', '011', '22222222', 173, '2012-4-4');
insert into usertbl values('KKH', '김경호', 1971, '전남', '019', '33333333', 177, '2007-7-7');
insert into usertbl values('JYP', '조용필' ,1950, '경기', '011', '44444444', 166, '2009-4-4');
insert into usertbl values('SSK', '성시경', 1979, '서울', null, null, 186, '2013-12-12');
insert into usertbl values('LJB', '임재범', 1963, '서울', '016', '66666666', 182, '2009-9-9');
insert into usertbl values('YJS', '윤종신', 1969, '경남', null, null, 170, '2005-5-5');
insert into usertbl values('EJW', '은지원', 1972, '경북', '011', '88888888', 174, '2014-3-3');
insert into usertbl values('JKW', '조관우', 1965, '경기', '018', '99999999', 172, '2010-10-10');
insert into usertbl values('BBK', '바비킴', 1973, '서울', '010', '00000000', 176, '2013-5-5');
insert into buytbl values(null, 'KBS', '운동화', null, 30, 2);
insert into buytbl values(null, 'KBS', '노트북', '전자', 1000, 1);
insert into buytbl values(null, 'JYP', '모니터', '전자' ,200, 1);
insert into buytbl values(null, 'BBK', '모니터', '전자', 200, 5);
insert into buytbl values(null, 'KBS', '청바지', '의류', 50, 3);
insert into buytbl values(null, 'BBK', '메모리', '전자', 80, 10);
insert into buytbl values(null, 'SSK', '책', '서적', 15, 5);
insert into buytbl values(null, 'EJW', '책', '서적', 15, 2);
insert into buytbl values(null, 'EJW', '청바지', '의류', 50, 1);
insert into buytbl values(null, 'BBK', '운동화', null, 30, 2);
insert into buytbl values(null, 'EJW', '책', '서적', 15, 1);
insert into buytbl values(null, 'BBK', '운동화', null, 30, 2);
- where절: 조회하는 결과에 특정한 조권을 줘서 원하는 데이터만 보고 싶을 때 사용
select 필드이름 from 테이블이름 where 조건식;
- between··· and절: 연속적인 값을 조회할 때 사용
select username, height from usertbl where height >= 180 and height <= 183;
-- python처럼 180 <= height <= 183 으로 표현할 수 없다.
select username, height from usertbl where height between 180 and 183;
- in( )절: 이산적인(discrete) 값을 조회할 때 사용
select username, addr from usertbl where addr = '경남' or addr = '전남';
select username, addr from usertbl where addr in ('경남', '전남');
- 검색 조건을 일부만 알고 있다면 LIKE 키워드를 이용해 검색할 수 있다.
→ 문자열을 이용하는 조건에만 사용할 수 있다.
1) %: 0개 이상의 문자
2) _: 1개의 문자
ex) LIKE '데이터%': '데이터'로 시작하는 문자열
LIKE '%데이터': '데이터'로 끝나는 문자열
LIKE '데이터___': '데이터'로 시작하는 6자 길이의 문자열
LIKE '__한%': 세 번째 글짜가 '한'인 문자열
- 서브쿼리(하위커리): 쿼리문 안에 또 쿼리문이 들어 있는 것
→ 하위 커리가 둘 이상의 값을 반환할 땐 any/all 구문을 사용해야 한다.
select username, height from usertbl
where height >= any / all (select height from usertbl where addr = '경남');
1) any: 서브쿼리의 여러 개의 결과중 한 가지만 만족해도 된다.
→ some과 동일
2) all: 서브쿼리의 여러 개의 결과를 모두 만족시켜야 한다.
→ '=any(서브쿼리)'는 'in(서브쿼리)'와 동일한 의미이다.
- order by절: 결과물에 영향을 미치지는 않지만, 결과가 출력되는 순서를 조절하는 구문
1) 기본적으로 오름차순으로 정렬된다.
→ asc는 디폴트 값이므로 생략해도 된다.
2) 내림차순으로 정렬하기 위해선느 열 이름 뒤에 desc라고 적어주면 된다.
3) order by에 나온 열이 select 다음에 꼭 있을 필요는 없다.
→ 'select userID from usertbl order by height'같은 구문도 가능하다.
4) where절과 같이 사용되어도 무방하다.
5) select, from, where, group by, having 중에서 제일 뒤에 와야 한다.
- distinct구문: 중복된 것은 1개씩만 보여주며 출력
select distinct addr from usertbl;
→ all을 사용하면 명시적으로 중복을 허용하지만, 디폴트 값이므로 생략해도 된다.
- 'limit n' 구문: 상위의 n개만 출력
→ order by 뒤에 온다.
select emp_no, hire_date from employees
order by hire_date asc
limit 5;
-- 'limit 시작, 개수' 또는 'limit 개수 offset 시작' 형식으로 사용해도 된다.
select emp_no, hire_date from employees
order by hire_date asc
limit 0, 5; -- limit 5 offset 0과 동일
- 악성 쿼리문: 서버의 처리량을 많이 사용해서 결국 서버의 전반적인 성능을 나쁘게 하는 쿼리문
- create table··· select 구문: 테이블을 복사해서 사용할 경우에 주로 사용
→ PK나 FK 등의 제약조건은 복사되지 않는다.
create table 새로운테이블 (select 복사할열 from 기존테이블);
- group by절: 특정 열을 그룹으로 묶어주는 역할
select userID, sum(amount) from buytbl group by userID;
- 집계 함수: 주로 group by절과 함께 쓰이며 데이터를 그룹화해주는 기능을 한다.
함수명 | 설명 |
AVG( ) | 평균을 구한다. |
MIN( ) | 최소값을 구한다. |
MAX( ) | 최대값을 구한다. |
COUNT( ) | 행의 개수를 센다. |
COUNT(DISTINCT) | 행의 개수를 센다. (중복은 1개만 인정) |
STDEV( ) | 표준편차를 구한다. |
VAR_SAMP( ) | 분산을 구한다. |
→ 집계 함수는 select 절이나 having 절에서만 사용할 수 있다.
※ where 절에서 사용 불가
- having절: 집계 함수에 대해서 조건을 제한하는 것
→ group by절 다음에 나와야 한다.
- with rollup문: 총합 또는 중간 합계가 필요할 때 group by절과 함께 사용
select num, groupName, sum(price * amount) as '비용'
from buytbl
group by groupName, num
with rollup;
'DB & SQL > 이것이 MySQL이다' 카테고리의 다른 글
SQL 고급 (1) (1) | 2022.05.10 |
---|---|
SQL 기본 (2) (0) | 2022.05.09 |
Mac 환경에서 MySQL Server 외부 접속 허용하기 (0) | 2022.05.03 |
MySQL 유틸리티 사용법 (0) | 2022.05.02 |
데이터베이스 모델링 (0) | 2022.05.02 |
댓글