본문 바로가기
DB & SQL/이것이 MySQL이다

SQL 기본 (1)

by k-mozzi 2022. 5. 8.
반응형
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;

 

728x90
반응형

'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

댓글