Back-end/SQL

SQL의 개념과 기본 문법

OlttaeMelona 2022. 12. 5. 23:39

 

SQL(Structured Query Language)

RDBMS의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어

 

 

SQL 문법 종류

  1.  데이터 정의 언어 DDL(Data Definition Language)
    • Create, Drop, Alter ...
  2.  데이터 조작 언어 DML(Data Manipulation Language)
    • Select, Insert, Update, Delete ...
  3.  데이터 제어 언어 DCL(Data Control Language)
    • Grant, Revoke..

 

 

 


 

 

 

SQL 기본 문법

-- 데이터 베이스 생성
-- Create Database [DB_Name];
CREATE DATABASE test_db;

-- 테이블 생성
-- Create Table [Name] ([Colume_name][Data Type]);
CREATE TABLE test_tb(name char(20), age int);

-- 데이터베이스 삭제, 테이블 삭제
-- Drop [Database/table][Name];
DROP TABLE test_tb;
DROP DATABASE test_db;

 

-- 데이터 베이스 조회
SHOW DATABASES;

-- 현재 선택된 데이터베이스
SELECT DATABASE();

-- 사용할 데이터베이스 선택
-- USE [Database_Name];
USE test_db;

-- 테이블 조회
SHOW TABLES;

-- 테이블 구조 보기
-- Describe [Table_Name];
-- desc [Table_name];
DESCRIBE member;
DESC member;

 

CRUD (Create, Read, Update, Delete)

-- 데이터 삽입 INSERT
-- Insert Into [Table_name]([Colume1]...) Values([Data1]...);
INSERT INTO test_tb(name, age) VALUES ('kimnanan', 20);


-- 데이터 조회 SELECT
-- Select [Colume1] From [Table_Name] Where [Condition];
SELECT name, age FROM test_tb;


-- 데이터 수정 UPDATE
-- Update [Table_Name] set [Colume1] = [Data1] Where [Condition];
UPDATE test_tb SET age=25 WHERE name='kimnana';


-- 데이터 삭제 DELETE
-- Delete From [Teble_name] Where [Condition];
DELETE FROM test_tb WHERE name='kimnana';

연산자

-- 산술 연산자 [+, - , *, /]
SELECT 2+4*3;
SELECT * FROM test_tb WHERE seq=5-3*2;


-- 비교 연산자 [>, >=, <, <=, =, <>, !=]
SELECT * FROM test_tb WHERE seq=1;
SELECT * FROM test_tb WHERE seq>3;
SELECT * FROM test_tb WHERE seq>=3;
SELECT * FROM test_tb WHERE seq<3;
SELECT * FROM test_tb WHERE seq<=3;
SELECT * FROM test_tb WHERE seq<>3;
SELECT * FROM test_tb WHERE seq!=3;


-- 논리 연산자 [NOT, AND, OR]
-- 둘다 참이어야만 결과 출력 [AND]
SELECT * FROM test_tb WHERE seq=3 AND name='jungaa'
-- 둘중 하나만 참이어도 결과 출력 [OR]
SELECT * FROM test_tb WHERE seq=1 or seq=3;


-- 비트 논리 연산자(2진수)
-- ORACLE [AND] 
-- BITAND(피연산자1, 피연산자2)
-- MYSQL, MSSQL
-- [AND] - 피연산자1 & 피연산자2
SELECT 2&1;
-- [OR] - 피연산자1 | 피연산자2
-- [XOR] - 피연산자1 ^ 피연산자2


-- 연결 연산자
-- 공통 함수
SELECT CONCAT(문자열1, 문자열2...)
-- ORACLE - 피연산자1 || 피연산자2
'te'||'st'
-- MSSQL - 피연산자1 + 피연산자2
'te'+'st'
-- MYSQL - 피연산자1 공백 피연산자2
'te' 'st'


-- IN 연산자
-- [컬럼/값] IN (값1,값2...)
-- or과 같은 뜻/ or보다 가독성이 좋고 연산 속도가 빠름
SELECT name, email FROM member WHERE id IN('admin','guest');

-- NOT IN 연산자
-- [컬럼/값] NOT IN (값1,값2...)
-- != 와 같은 뜻
SELECT name, email FROM member WHERE id NOT IN('admin','guest');


-- LIKE 연산자
-- [%] - 모든 문자
-- [_] - 하나의 문자
SELECT * FROM member WHERE name LIKE '%ad%';
SELECT * FROM member WHERE name LIKE 'adm_n';

함수

-- 문자열 함수
-- 함수(문자열, 시작위치, 길이)
-- ORACLE [SUBSTR], [SUBSTRB]
-- MSSQL [SUBSTRING]
-- MYSQL [SUBSTRING], [SUBSTR], [MID]
SELECT SUBSTRING('test',1,1);
SELECT SUBSTR('test',3,2);


-- 문자 아스키코드 변환 함수
-- CHAR -> ASCII [ASCII]
-- ASCII -> CHAR [CHAR]
SELECT ASCII('A');
SELECT BIN(ASCII('a'));


-- 문자열 연결
SELECT CONCAT('TE','ST');


-- COUNT 함수
-- 코드 개수를 구하는 함수
-- SELECT COUNT(COLUME) FROM [TABLE_NAME]
SELECT COUNT(*) FROM member;


-- 길이 함수
-- ORACLE, MYSQL [LENGTH]
-- MSSQL [LEN]
SELECT LENGTH('test');
SELECT name, LENGTH('email') FROM member;

조건문

-- 조건문
-- ORACLE [DECODE],[CASE WHEN]
-- MSSQL [CASE WHEN]
-- MYSQL [IF], [CASE WHEN]
-- CASE WHEN [CONDITION] THEN[TRUE] ELSE[FALSE] END
SELECT CASE WHEN 1=1 THEN 'test1' ELSE 'test2' END;
SELECT * FROM member WHERE seq = (CASE WHEN 1=1 THEN 1 ELSE 2 END);

서브쿼리

-- 서브쿼리(SUBQUERY)
-- 메인쿼리 안에 또 하나의 구문
-- SELECT COLUME1, COLUME2 FROM TABLE_NAME WHERE[COLUME]=(SELECT COLUME FROM TABLE WHERE COLUME=[VALUE]);
-- SELECT절에 들어가는 서브쿼리 = 스칼라 서브쿼리 : 값이 하나인 레코드만 나와야함
-- FROM절에 들어가는 서브쿼리 = 인라인 뷰 : 여러개 레코드 가상 테이블
-- WHERE절에 들어가는 서브쿼리 = 일반 서브쿼리 : T상황에 따라 값의 갯수가 달라짐
SELECT name, email FROM member WHERE id=(SELECT id FROM bbs WHERE idx=192);
SELECT name, email FROM member WHERE id in(SELECT id FROM bbs);
SELECT name, (SELECT VERSION()) FROM member;
SELECT name, (SELECT email FROM member WHERE seq=a.seq) FROM member a;
SELECT * FROM (SELECT * FROM member)a;
SELECT * FROM (SELECT * FROM member)a WHERE a.seq=1;
SELECT * FROM member WHERE seq=(SELECT * FROM member WHERE name='aa');
SELECT * FROM member WHERE seq in(SELECT seq FROM member);

order by

-- ORDER BY 절
-- SELECT COLUME1, COLUME2 FROM TABLE ORDER BY COLUME [ASC/DESC]
-- ASC = ASCENDING = 오름차순
-- DESC = DESCENDING = 내림차순
SELECT * FROM member ORDER BY seq ASC;
SELECT * FROM member ORDER BY seq DESC;

레코드 출력 개수 제한 (페이징에 유용)

-- 레코드 출력 개수 제한
-- ORACLE [ROWNUM]
-- MSSQL [TOP]
-- MYSQL [LIMIT]
-- SELECT COLUME1, COLUME2 FROM TABLE LIMIT[OFFSET],[ROW_COUNT]
-- SELECT COLUME1, COLUME2 FROM TABLE LIMIT[ROW_COUNT]
SELECT * FROM member ORDER BY seq LIMIT 3;
SELECT * FROM member ORDER BY seq LIMIT 2, 3;
SELECT * FROM member LIMIT 3;
SELECT * FROM member LIMIT 2,3;