SQL 공부

Ada·2022년 11월 22일
0

항해TOL

목록 보기
45/63

[ SELECT 문 기본구조 ]

SELECT 열 이름
FROM 테이블이름
WHERE 조건

USE 데이터베이스 이름;

을 사용해서 사용할 데이터베이스 지정

MySQL의 주석

-- 한 줄 주석 (-- 뒤의 공백 유의)

/* */ 여러줄 주석


[ DB 의 이름, 테이블의 이름, 필드 이름 조회 ]

SHOW DATABASES;

USE databaseName;

SHOW TABLE STATUS;

현재의 데이터베이스에 있는 테이블의 정보 조회

DESCRIBE tableName; or DESC tableName;

SELECT columnName, columnName FROM tableName;

-> Workbench에서는 [Navigator] 사용


📌 열 이름의 별칭 지정

열 이름 뒤에 AS 별칭
별칭의 중간에 공백이 있다면 반드시 작은 따옴표''로 별칭을 감싸줘야 함.

AS는 생략 가능
별칭을 붙일 경우에는 가능하면 '' 안에 별칭 사용


DB와 TABLE 생성 예제

DROP DATABASES IF EXISTS dbName; -- 만약 db라는 이름의 데이터베이스가 존재하면 우선 삭제한다.

CREATE DATABASE dbName;

USE dbName;
CREATE TABLE usertbl; -- 회원 테이블 생성
( userID CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
name VARCHAR(10) NOT NULL, -- 이름
birthYear INT NOT NULL, -- 출생 년도
addr CHAR(2) NOT NULL, -- 지역경기, 서울, 경남 식으로 2글자만 입력
mobile1 CHAR(3), -- 휴대폰의 국번 011, 010 등
mobile2 CHAR(8), -- 휴대폰의 나머지 전화번호(하이픈 제외)
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), -- 분류
FOREIGN KEY (userId) REFERENCES usertbl(userID)
);

📌 CHAR 와 VARCHAR

  • 일부 DBMS 에서는 CHARVARCHAR는 영문자를 기준으로 1Byte를 할당하고, NCHARNVARCHAR는 유니코드를 기준으로 2Byte를 할당함
  • 영문자를 입력할 계획이라면 CHAR 또는 VARCHAR 사용,
  • 한글을 입력할 계획이라면 NCHAR 또는 NVARCHAR 사용
  • 그러나 MySQL은 CHAR, VARCHAR 모두 UTF-8 코드를 사용한다.
  • UTF-8 코드는 영문/숫자/기호를 입력하면 내부적으로 1Byte를 할당하고
    한글/중국어/일본어 등을 입력하면 내부적으로 3Byte로 할당되므로 특별히 NCAHRNVARCHAR를 사용할 필요가 없다.
  • CHAR(10) 으로 설정하면 영문이든 한글이든 10글자까지 입력할 수 있으며 내부적으로는 MySQL이 이 공간을 할당한다.
  • CHARVARCHAR에 데이터를 입력하려면 작은 따옴표('') 로 묶어줘야 한다.

📌 데이터베이스 개체의 이름 규칙

데이터베이스(스키마) 개체의 이름을 식별자(Identifier)라고 한다.

데이터베이스 개체란 데이터베이스, 테이블, 인덱스, 열, 인덱스, 뷰, 트리거, 스토어드 프로시저 등과 같은 개체들을 의미한다.

MySQL 내의 개체 정의 규칙은 아래와 같다.

  • A-Z, a-z, 0-9, $, _ 사용가능 / 그러나 영문 대문자나 소문자 어떤것을 사용해도 소문자로 생성된다.

  • 개체 이름은 최대 64자로 제한된다.

  • 예약어를 사용하면 안 된다.

  • 개체 이름은 원칙적으로 중간에 공백이 있으면 안되지만, 중간에 공백을 꼭 사용하려면 백틱으로 꼭 묶어줘야 한다.
    ex) CREATE TABLE My Table 가능

  • 개체에 이름은 짧으면서도 알기 쉽게 주어야한다.

  • Linux 에서는 데이터베이스 이름과 테이블 이름은 모두 소문자를 사용해야 한다.


[WHEAR 문]

조건 연산자 ( =, <, >, <=, >=, <>, != 등)
관계 연산자 (NOT, OR, AND 등)

SELECT name, height FROM usertbl WHERE heigt >= 180 AND height <= 183;

위의 문장은 아래처럼 작성할수도 있다.

SELECT name, height FROM usertbl WHERE height BETWEEN 180 AND 183;

키의 경우에는 숫자로 구성되어 있어서 연속적인 값을 가지므로 BETWEEN ... AND를 사용했지만 지역명으로 검색할때는 연속값이 아니므로 다른 방법을 사용해야 한다.

SELECT name, addr FROM usertbl WHERE addr='경남' OR addr='전남' OR addr='경북';

이와 동일하게 연속값이 아닌 이산적인 값을 위해 IN()을 사용할 수 있다.

SELECT name, addr FROM usertbl WHERE addr IN ('경남', '전남', '경북');

문자열의 내용을 검색하기 위해서는 LIKE 연산자를 사용할 수 있다.

SELECT name, height FROM usertbl WHERE name LIKE '김%';

위의 조건은 '김'으로 시작하는 이름의 무엇이든 허용한다는 의미이다.

만약 한 글자와 매치하기 위해서는 아래와 같이 _ 를 사용한다.

SELECT name, height FROM usertbl WHERE name LIKE '_종신';

이 외에도 %_ 를 조합해서 사용이 가능하다.

조건에 '_용%' 라고 사용하면 앞에 아무거나 한 글자가 오고 두 번째 글자가 용이고 세 번째 이후에는 몇 글자든 아무거나 오는 값을 추출해준다.

예를들어 '조용필', '이용해 줘서 감사합니다.' 등의 문자열이 해당될 수 있다.


[ ANY / ALL / SOME / SubQuery]

서브쿼리란 쿼리문 안에 또 쿼리문이 들어있는것이다.

김경호보다 키가 크거나 같은 사람의 이름과 키를 출력하려면 WHERE 조건에 김경호의 키를 직접 작성해야 한다.

SELECT name, height FROM usertbl WHERE height > 177;

서브쿼리를 사용하면 아래와 같다.

SELECT name, height FROM usertbl
WHERE height > (SELECT height FROM usertbl WHERE Name = '김경호');

만약 지역이 '경남'인 사람의 키보다 크거나 같은 사람을 추출 할 때는 서브쿼리의 반환값이 둘 이상이라서 위의 방법을 사용하면 안된다.

아래와 같이 ANY를 사용하면 해결된다.

SELECT name, height FROM usertbl
WHERE height >= ANY (SELECT height FROM usertbl WHERE addr='경남');

`ANY` , `SOME` -> 서브 쿼리의 여러개의 결과 중 한가지만 만족해도 됨

`ALL` -> 서브 쿼리의 여러개의 결과를 모두 만족시켜야 한다.

[ ORDER BY ]

SELECT name, height FROM usertbl ORDER BY height DESC, name ASC;

키 순서로 내림차순 정렬하되(큰 순서대로) 만약 키가 같을 경우에는 이름 순서로 오름차순 정렬

ORDER BY절은 모든 구문 중 가장 마지막에 와야한다.

[ DISTINCT / LIMIT ]

SELECT DISTINCT addr FROM usertbl;

-> 중복된 것은 1개씩만 보여주면서 출력된다.

SELECT emp_no, hire_date FROM employees
ORDER BY hire_date ASC
LIMIT 5;

-> 입사일이 오래된 직원의 상위 5개 결과만 출력해준다.

' LIMIT 시작, 개수' 또는 'LIMIT 개수 OFFSET 시작' 형식으로 사용 가능하다.

[ CREATE TABLE ... SELECT 테이블 복사]

CREATE TABLE 새로운테이블 (SELECT 복사할열 FROM 기존테이블)

CREATE TABLE buytbl2 (SELECT FROM buytbl1);
SELECT
FROM buytbl2;

buytbl1 을 buytbl2 로 복사하는 구문

CREATE TABLE buytbl3 (SELECT userID, prodName FROM buytbl1);
SELECT * FROM buytbl3;

userID와 prodName 만 복사하는 구문

PK 나 FK 등의 제약조건은 복사되지 않는다.

[ GROUP BY / HAVING / 집계함수 ]

GROUP BY 절

SELECT select_expr

profile
백엔드 프로그래머

0개의 댓글