MariaDB
2일차
Common Queries
- 오늘도 MySQL Document에서 실습을 계속 진행해보자.
CREATE TABLE shop (
article INT UNSIGNED DEFAULT '0000' NOT NULL,
dealer CHAR(20) DEFAULT '' NOT NULL,
price DECIMAL(16,2) DEFAULT '0.00' NOT NULL,
PRIMARY KEY(article, dealer));
# article과 dealer를 primary key로 갖는 테이블을 만든다.
INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
# 테이블에 간단한 데이터를 채워넣는다.
SELECT * FROM shop ORDER BY article;
# 이런식으로 데이터를 확인할 수 있다.
CREATE TABLE product (
category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)
);
CREATE TABLE customer (
id INT NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE product_order (
no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (customer_id)
REFERENCES customer(id)
);
# product, customer table의 Column중 일부를 product_order table의 Column에 foreign key로 추가할 수 있다.
- 지난번에 했던 내용을 간단하게 복습해보았다. 이제 많이 사용되는 query를 몇 가지 알아보자!
MAX
SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop);
# MAX : 말그대로 Column에서 MAX값을 찾아준다.
SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
MIN
# MIN : Column에서 MIN값을 찾아준다.
# @를 사용하여 변수를 만들 수도 있다.
DISTINCT
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;
# t1과 t2테이블의 a라는 Column이 같은 t1.a를 중복되지 않게 출력한다.
TIMESTAMPDIFF
SELECT TIMESTAMPDIFF(YEAR, hire_date, NOW()) FROM employees;
# 현재 시간과 hire_date의 사이에 몇 년이 있었는지 출력한다. (Month,
CONCAT
SELECT CONCAT(first_name,' ',last_name) AS full_name FROM t1;
# t1에서 first_name과 last_name을 붙여서 새로운 Column을 만들 수 있다.
IFNULL
SELECT category, AVG(IFNULL(price,0)) FROM items GROUP BY category;
# price가 Null일 경우 0으로 바꿔서 전체 평균을 계산한다.
ROW_NUMBER
SELECT ROW_NUMBER() OVER (ORDER BY price DESC, name ASC) AS 'RK', name, price FROM items;
# 각 row의 index를 추가할 수 있다.
RANK
SELECT category, RANK() OVER (PARTITION BY category ORDER BY price DESC) AS 'RK', name, price FROM items;
# ROW_NUMBER와 비슷하지만 동일 가격의 경우 같은 등수로 출력된다.
# partintion을 이용해서 category별로 등수를 매길 수도 있다.
JOIN
CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE shirt (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
PRIMARY KEY (id)
);
SELECT s.* FROM person p INNER JOIN shirt s
ON s.owner = p.id
# JOIN : 2개의 테이블을 특정 조건으로 묶어준다.
CHECK
CREATE TABLE t1
(
CHECK (c1 <> c2),
c1 INT CHECK (c1 > 10),
c2 INT CONSTRAINT c2_positive CHECK (c2 > 0),
c3 INT CHECK (c3 < 100),
CONSTRAINT c1_nonzero CHECK (c1 <> 0),
CHECK (c1 > c3)
);
# CHECK를 이용하면 테이블에 들어가는 값을 제한할 수 있다. 위 예제의 경우 c1은 0 혹은 c2와 같은 값을 가질 수 없고 c2는 양수이며 c3는 c1<c3<100이라는 조건을 갖게 된다.
- CRUD 함수들은 어느정도 익숙해졌을 것이라 생각한다.
- 이번에는
ALTER
에 대해 알아보자!
ALTER TABLE t1 RENAME t2;
# 테이블 t1의 이름을 t2로 변경한다.
ALTER TABLE t2 ADD d TIMESTAMP;
# 테이블 t2에 TIMESTAMP type의 d라는 Column을 추가한다.
ALTER TABLE t2 MODIFY d INT;
# 테이블 t2의 d Column의 type을 INT로 변경한다.
ALTER TABLE t2 DROP COLUMN c;
# 테이블 t2의 Column c를 제거한다.
ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (c);
# 테이블 t2에 INT type의 c라는 Column을 추가한다.
# c는 NOT NULL이고 AUTO_INCREMENT이며 PRIMARY KEY이다.
ALTER TABLE tbl AUTO_INCREMENT = 100;
# 테이블 tbl의 AUTO_INCREMENT의 시작값을 100으로 설정한다.
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
# 테이블 tbl_name에서 FOREIGN KEY fk_symbol을 제거한다.
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name, ...)
REFERENCES tbl_name (col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
#ex)
ALTER TABLE Reservation ADD CONSTRAINT CustomerID
FOREIGN KEY (ID) REFERENCES Customer (ID);