여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다.
“데이터를 테이블의 형태로 저장하는 데이터베이스를 의미”
구조적 쿼리 언어(SQL)는 데이터베이스에 쿼리를 보내 원하는 데이터만을 가져올 수 있게 해주는 데이터베이스 용 프로그래밍 언어
CREATE
(테이블생성), DROP
(테이블제거)INSERT
(레코드추가), DELETE
(레코드삭제), UPDATE
(레코드변경)GRANT
(권한부여), REVOKE
(권한가져가기)SELECT
(질문)COMMIT
(DML작업내용기록), ROLLBACK
(커밋내용취소)데이터베이스에서 데이터가 구성되는 방식과 서로 다른 개체(엔티티) 간의 관계에 대한 설명입니다.
테이블 간 관계는 다음과 같이 나눌 수 있습니다:
# 기본키칼럼에 조건 부여하고 싶을 때, 작성순서 주의
CREATE TABLE movies (
id INTEGER PRIMARY KEY NOT NULL,
title TEXT,
director TEXT,
year INTEGER,
length_minutes INTEGER
);
# 테이블 삭제
DROP TABLE Teacher
# 기본키 자동부여
CREATE TABLE Teacher(
id INTEGER Primary key AUTOINCREMENT #미지정시 자동부여
name VARCHAR(30),
subject VARCHAR(10) NOT NULL,
salary INTEGER
);
# 기본키 2개로 지정하는 경우
CREATE TABLE Student(
teacher_id INTEGER NOT NULL,
student_id CHAR(4) NOT NULL,
age INTEGER NOT NULL,
Primary KEY(teacher_id, student_id)
)
※ 주석 ,,, ※ 세미콜론; : 명령 하나가 종료되었다 / 여러개 쿼리 짤 경우 ※ SQL 대소문자 : 명령어는 대소문자 구분안하나(프로그램 따라), 문자열에선 대소문자 구분
SELECT 'hello world';
SELECT 1+3;
SELECT *
--와일드카드 * = all 전체선택의 의미
SELECT Album.Title FROM Album;
-- = SELECT Title FROM Album;
# As 사용
SELECT a.Title FROM Album As a
# As 없이
SELECT a.Title f FROM Album a
# 별명 한글 가능
SELECT DATETIME 시간 FROM ANIMAL_INS
ORDER BY DATETIME
# 특정값을 가진 레코드(행)의 필드(열)값 가져오기
SELECT a.Name FROM Artist As a
WHERE Name='AC/DC'
# 날짜조건 검색
SELECT EmployeeId FROM employees e
WHERE e.HireDate < '2013-01-01'
Order by LastName
# 조건이 여러개일때
Select Invoiceid From Invoices
Where customerid in(29, 30, 63) and Total between 1 and 3
# = 특정값을 가진 레코드(행) 전체 가져오기 (반대 !=, <>)
SELECT * FROM Artist As a
WHERE Name='AC/DC'
# <> 고객테이블에서 lisbon출신 제외한 고객의 전체레코드(행) 가져오기
SELECT * from Customer WHERE City <> 'Lisbon'
# BETWEEN AND : 이상이하inclusive
SELECT * FROM movies
Where year NOT BETWEEN 2000 and 2010 #이상 이하(inclusive)
# IN : 리스트내의 값에 포함된 값(반대 NOT IN)
SELECT * FROM movies
Where year IN (2000, 2001)
Select i.invoiceid From Invoices i
Where i.BillingCity In('Stuttgart','Oslo','Redmond')
Order by i.InvoiceId;
# LIKE : 특정문자열과 비슷한 값 (% 혹은 *)
SELECT * FROM movies
Where Title Like "%Toy Story%"
SELECT * FROM movies
Where Title Like "Toy Story%" #토이스토리로 시작하는 값만
SELECT * FROM movies
Where Title Like "%Toy Story" #토이스토리로 끝나는 값만
SELECT Albumid FROM ALBUMS a
Join Artists ar
on a.Artistid = ar.Artistid
WHERE Name Like "%the%"
SELECT * FROM movies
Where Director NOT LIKE "John Lasseter"
# IS NULL : is는 null 등의 값 찾을 때 사용
SELECT * FROM employees
WHERE employees.ReportsTo is NULL;
SELECT * FROM employees
WHERE employees.ReportsTo is NOT NULL;
SELECT * from Customer
WHERE CustomerID > 10
Order by FirstName ;
SELECT * FROM movies
Order by Year DESC
LIMIT 4;
# 상위 4개만
SELECT * FROM movies
Order by Rating DESC
LIMIT 4;
# 하위 4개만
SELECT * FROM movies
Order by Rating
LIMIT 4;
# 상위 4,5위만
SELECT * FROM movies
Order by Rating DESC
LIMIT 2
OFFSET 3;
# 직책 리스트 추출(고유값만)
SELECT DISTINCT employees.Title FROM employees;
# 감독 리스트 추출
SELECT DISTINCT Director FROM movies
Order by Director;
# 고유값 개수만
Select g.Name genre_name, count(DISTINCT i.customerid) Num_total From invoice_items ii
# 여러 특성의 고유조합(유니크한 조합)만
# 남 A형, 남 B형, 여 A형, 여 B형...
SELECT DISCTINCt gender, blood_type FROM students
Select count(c.Country) Num_Total From customers c
Group by Country;
# 기본키 AUTOINCREMENT(자동지정)의 경우, 기본키값이 비어있어도 무결성을 해치치 않음 = 추가가능
# AUTO 미지정의 경우, 기본키 값 비어있으면 에러 발생
INSERT into Teacher(name, subject, salary) VALUES ('Spongebob', 'Math', 3500);
Select g.Name genre_name, count(DISTINCT i.customerid) The_Number_of_customer_ID From invoice_items ii
Join invoices i
on i.Invoiceid = ii.invoiceid
Join tracks t
on t.Trackid = ii.trackid
Join Genres g
on g.genreid = t.genreid
Group by g.Name
Select i.id, i.customer_id, date(i.invoice_date) 날짜, i.invoice_amt From Customers c
RIGHT Join Invoices i
on c.id = i.customer_id
Order by i.invoice_amt desc, i.invoice_date, i.id
#아티스트아이디가 아닌 이름으로 보고 싶을 때 / 가수이름과 타이틀명만
Select a.Title, ar.Name
From Album a
JOIN Artist ar
ON a.ArtistID = ar.ArtistID;
SELECT Distinct building_name, e.Role FROM Buildings b
Left Join Employees e
On b.building_name = e.building
Select c.id, c.name, i.invoice_amt From Customers c
Left Outer Join Invoices i
on c.id = i.customer_id
Where i.invoice_amt IS NULL
# 칼럼 결합 추가 / 대문자화
SELECT Customerid, Upper(City || ' ' || Country) c FROM customers c
# 칼럼 결합 / 정렬순서 지정 시
SELECT (c.FirstName || c.LastName || i.InvoiceId) FROM invoices i
JOIN customers c
ON i.CustomerId = c.CustomerId
ORDER BY c.FirstName, c.LastName, i.InvoiceId
# 칼럼의 문자열값 추출 / 소문자화
SELECT LOWER(SUBSTRING(FirstName, 1, 4) || SUBSTRING(LastName, 1, 2)) newid FROM customers c
# 번호순서대로(인덱스순서대로) 값 가지는 칼럼 추가
SELECT teacher_id, student_id, rowid '전체 학생순서' FROM Student
# 그룹화하여 순서부여하는 칼럼 추가
SELECT teacher_id, student_id,
ROW_NUMBER () OVER (PARTITION BY teacher_id) '선생님별 학생순서'
FROM Student
# ALBUM이름이 unplugged이거나 track이름이 outbreak인 경우
Select Name From tracks
WHERE ALBUMid IN (SELECT ALBUMID FROM Albums WHERE albums.title = 'Unplugged')
OR albumid in (SELECT Albumid from tracks WHERE tracks.Name = 'Outbreak')
# ALBUM이름이 unplugged이거나 outbreak인 경우
Select Name From tracks
WHERE ALBUMid IN (SELECT ALBUMID FROM Albums WHERE albums.title in('Unplugged', 'Outbreak'))
## 변수화
## SQLite (Select ~~)
## mySQL decalre
# 그룹으로 묶은 칼럼 생성
SELECT name, subject, salary, CASE
WHEN salary < 3000 THEN 'Low'
WHEN salary < 4000 THEN 'Mid'
ELSE 'High'
END '월급 그룹'
FROM Teacher t
# 중앙값 / median() 미사용시
SELECT student_id, age'중앙값'
FROM Student
ORDER BY student_id
LIMIT 1
OFFSET (SELECT COUNT(*)
FROM Student) / 2
# 중앙값 / 변수화 + SELECT median()
SELECT student_id, age FROM Student
WHERE age = (SELECT Median(age) FROM Student)
# 참고
SELECT median(sallary) over (partition by dept_id) FROM mydb.dept_sallary
# 에러구문
SELECT student_id, median(age) '중앙값' FROM Student
# studentid는 중앙값이 아닌 첫번째값이 나옴
# median은 select에선 사용할 수 있지만, in에선 사용할 수 없음
# 구매평균이 전체평균보다 큰 고객군의 정보
## JOIN 사용예시
SELECT i.CustomerId, AVG(Total) AS avg_total
FROM invoices AS i
LEFT JOIN customers AS c
ON i.CustomerId = c.CustomerId
GROUP BY i.CustomerId
HAVING AVG(Total) > (SELECT AVG(Total) FROM invoices)
ORDER BY avg_total DESC;
## 서브쿼리 사용예시
SELECT CustomerId
FROM customers
WHERE CustomerId IN
(SELECT CustomerId
FROM invoices AS i
GROUP BY CustomerId
HAVING AVG(Total) > (SELECT AVG(Total) FROM invoices)
);
#### GROUP BY 사용예시 생각해보기
# 고객별 정보 및 타겟칼럼 생성(전체평균보다 큰지 아닌지 여부)
## 분류 지도학습모델에서 활용 가능
SELECT CustomerId, BillingCountry, BillingCity, AVG(Total),
AVG(Total) > (SELECT AVG(Total) FROM invoices) AS Target
FROM invoices i
GROUP BY CustomerId;
# 인보이스 발행날짜가 2011년 이전인 고객의 정보 반환
## 서브쿼리 사용예시
SELECT c.CustomerId
FROM customers AS c
WHERE c.CustomerId IN(
SELECT i.CustomerId
FROM invoices AS i
WHERE i.InvoiceDate < '2011-01-01'
);
## 서브쿼리 미사용예시
SELECT c.CustomerId
FROM customers AS c, invoices AS i
WHERE i.InvoiceDate < '2011-01-01'
## JOIN ON 사용예시
SELECT c.CustomerId
FROM customers AS c
JOIN invoices AS i ON i.CustomerId
WHERE i.InvoiceDate < '2011-01-01'