
CONCAT() - 여러 문자열을 하나로 합치거나 연결하는 함수 SELECT CONCAT('string1', 'string2', ...);
SELECT CONCAT('concat', ' ', 'test');
+-------------------------------+
| CONCAT('concat', ' ', 'test') |
+-------------------------------+
| concat test |
+-------------------------------+
SELECT CONCAT('이름 : ', name) FROM celeb;
+---------------------------+
| CONCAT('이름 : ', name) |
+---------------------------+
| 이름 : 아이유 |
| 이름 : 이미주 |
| 이름 : 송강 |
| 이름 : 강동원 |
| 이름 : 유재석 |
| 이름 : 차승원 |
| 이름 : 이수현 |
+---------------------------+
AS - Column이나 Table 이름에 별칭을 붙여주는 명령어 // Column
SELECT column1 AS alias1, column2 AS alias2, ... FROM table_name;
// Table
SELECT column1, column2, ... FROM table_name AS alias;
AS는 생략 가능하다. SELECT column1 alias1, column2 alias2, ... FROM table_name alias;

SELECT DISTINCT column1, column2, ... FROM table_name;
SELECT agency FROM celeb; // 중복 포함
SELECT DISTINCT agency FROM celeb; // 중복 제외

// 중복 포함
SELECT sex, job_title FROM celeb WHERE job_title LIKE '%가수%';
// 중복 제거
SELECT DISTINCT sex, job_title FROM celeb WHERE job_title LIKE '%가수%';

LIMIT로 주어진 숫자만큼 조회하는 명령어 SELECT column1, column2, ... FROM table_name WHERE condition LIMIT number;
SELECT * FROM celeb LIMIT 3;

SELECT * FROM celeb ORDER BY age LIMIT 4;


입력값을 기준으로 단일 값을 반환하는 함수
/*문법*/ SELECT UCASE("string");
SELECT UCASE('This is ucase test.');
+------------------------------+
| UCASE('This is ucase test.') |
+------------------------------+
| THIS IS UCASE TEST. |
+------------------------------+
SELECT UCASE(menu), price FROM sandwich WHERE price > 15;
+----------------------------------+-------+
| UCASE(menu) | price |
+----------------------------------+-------+
| LOBSTER ROLL | 16 |
| GRILLED LAUGHING BIRD SHRIMP AND | 17 |
| SHAVED PRIME RIB | 21 |
+----------------------------------+-------+
/*문법*/ SELECT LCASE("string");
SELECT LCASE("This IS LCASE Test.");
+------------------------------+
| LCASE("This IS LCASE Test.") |
+------------------------------+
| this is lcase test. |
+------------------------------+
SELECT LCASE(menu), price FROM sandwich WHERE price < 5;
+--------------+-------+
| LCASE(menu) | price |
+--------------+-------+
| meatball sub | 4.5 |
+--------------+-------+
/*문법*/ SELECT MID("string", start_position, lenth);
- string: 원본 문자열
- start: 문자열 반환 시작 위치 → 첫글자는 1, 마지막 글자는 -1
- length: 반환할 문자열 길이
--> 예제1. 1번 위치에서 4글자 조회
mysql> SELECT MID('This is mid test', 1, 4);
+-------------------------------+
| MID('This is mid test', 1, 4) |
+-------------------------------+
| This |
+-------------------------------+
--> 예제2. 6번 위치에서 5글자 조회
mysql> SELECT MID('This is mid test', 6, 5);
+-------------------------------+
| MID('This is mid test', 6, 5) |
+-------------------------------+
| is mi |
+-------------------------------+
--> 예제3. -4번 위치(뒤에서 4번째 위치)에서 4글자 조회
mysql> SELECT MID('This is mid test', -4, 4);
+--------------------------------+
| MID('This is mid test', -4, 4) |
+--------------------------------+
| test |
+--------------------------------+
--> 예제4. -8번 위치(뒤에서 8번째 위치)에서 3글자를 조회
mysql> SELECT MID('This is mid test', -8, 3);
+--------------------------------+
| MID('This is mid test', -8, 3) |
+--------------------------------+
| mid |
+--------------------------------+
--> 예제5. 11위 카페이름 중 두번째 단어만 조회: 6번 위치에서 4글자
mysql> SELECT cafe FROM sandwich WHERE ranking=11;
+-----------+
| cafe |
+-----------+
| Lula Cafe |
+-----------+
mysql> SELECT MID(cafe, 6, 4) FROM sandwich WHERE ranking=11;
+-----------------+
| MID(cafe, 6, 4) |
+-----------------+
| Cafe |
+-----------------+
--> 다른 방식
// -4번 위치(뒤에서 4번째)에서 4글자로도 가져올 수 있다.
mysql> SELECT MID(cafe, -4, 4) FROM sandwich WHERE ranking=11;
+------------------+
| MID(cafe, -4, 4) |
+------------------+
| Cafe |
+------------------+
/*문법*/ SELECT LENGTH("string");
--> 예제1. 다음 문장의 길이 조회
mysql> SELECT LENGTH('This is len test.');
+-----------------------------+
| LENGTH('This is len test.') |
+-----------------------------+
| 17 |
+-----------------------------+
--> 예제2. 문자가 없는 경우 길이는 0
mysql> SELECT LENGTH('');
+------------+
| LENGTH('') |
+------------+
| 0 |
+------------+
--> 예제3. 공백 문자도 길이에 포함되므로 길이는 1
mysql> SELECT LENGTH(' ');
+-------------+
| LENGTH(' ') |
+-------------+
| 1 |
+-------------+
--> 예제4. NULL의 경우 길이가 없으므로 결과는 NULL이다.
mysql> SELECT LENGTH(NULL);
+--------------+
| LENGTH(NULL) |
+--------------+
| NULL |
+--------------+
--> 예제5. sandwich Table에서 Top 3의 주소 길이를 검색
mysql> SELECT LENGTH(address), address FROM sandwich ORDER BY ranking LIMIT 3;
mysql> SELECT LENGTH(address), address FROM sandwich WHERE ranking <= 3;
+-----------------+---------------------+
| LENGTH(address) | address |
+-----------------+---------------------+
| 19 | 2109 W. Chicago Ave |
| 18 | 800 W. Randolph St |
| 16 | 445 N. Clark St |
+-----------------+---------------------+
/*문법*/ SELECT ROUND(number, deciamls_place);
- number: 반올림할 대상 숫자
- decimals: [option] 반올림할 소수점의 위치
--> 예제1. 위치를 지정하지 않을 경우, 소수점 첫번째 자리(0)에서 반올림한다.
mysql> SELECT ROUND(315.625);
+----------------+
| ROUND(315.625) |
+----------------+
| 316 |
+----------------+
--> 예제2. 소수점 첫번째 위치는 0
mysql> SELECT ROUND(315.625, 0);
+-------------------+
| ROUND(315.625, 0) |
+-------------------+
| 316 |
+-------------------+
--> 예제3. 두번째 소수점 위치는 1
mysql> SELECT ROUND(315.625, 1);
+-------------------+
| ROUND(315.625, 1) |
+-------------------+
| 315.6 |
+-------------------+
--> 예제4. 세번째 소수점 위치는 2
mysql> SELECT ROUND(315.625, 2);
+-------------------+
| ROUND(315.625, 2) |
+-------------------+
| 315.63 |
+-------------------+
--> 예제5. 자연수 일단위 위치는 -1
mysql> SELECT ROUND(315.625, -1);
+--------------------+
| ROUND(315.625, -1) |
+--------------------+
| 320 |
+--------------------+
--> 예제6. 자연수 십단위 위치는 -2
mysql> SELECT ROUND(315.625, -2);
+--------------------+
| ROUND(315.625, -2) |
+--------------------+
| 300 |
+--------------------+
--> 예제7. sandwich Table에서 소수점 자리는 반올림하여 1달러 단위까지만 표시
// (단, 최하위 3개만 표시한다.)
SELECT ranking, price, ROUND(price) FROM sandwich ORDER BY ranking DESC LIMIT 3;
+---------+-------+--------------+
| ranking | price | ROUND(price) |
+---------+-------+--------------+
| 50 | 6.85 | 7 |
| 49 | 8.75 | 9 |
| 48 | 7.5 | 8 |
+---------+-------+--------------+
/*문법*/ SELECT NOW();
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2024-01-24 19:53:34 |
+---------------------+
/*문법*/ SELECT FORMAT(number, decimals_place);
- number: 포맷을 적용할 문자 혹은 숫자
- decimals: 표시할 소수점 위치
--> 예제1. 소수점을 표시하지 않을 경우 0
mysql> SELECT FORMAT(12345.6789, 0);
+-----------------------+
| FORMAT(12345.6789, 0) |
+-----------------------+
| 12,346 |
+-----------------------+
--> 예제2. 소수점 두자리까지 표시할 경우 2
mysql> SELECT FORMAT(12345.6789, 2);
+-----------------------+
| FORMAT(12345.6789, 2) |
+-----------------------+
| 12,345.68 |
+-----------------------+
--> 예제3. 소수점 열자리까지 표시
mysql> SELECT FORMAT(12345.6789, 10);
+------------------------+
| FORMAT(12345.6789, 10) |
+------------------------+
| 12,345.6789000000 |
+------------------------+
--> 예제4. oil_price Table에서 가격이 백원단위에서 반올림 했을 때 2000원 이상인 경우
// 천원 단위에 콤마를 넣어서 조회
mysql> SELECT FORMAT(가격, 0) FROM oil_price WHERE ROUND(가격, -3) >= 2000;
+-------------------+
| FORMAT(가격, 0) |
+-------------------+
| 1,509 |
| 1,598 |
| 1,635 |
| 2,160 |
+-------------------+
후보키들 중 DB 설계자에 의해서 개체(Table) 구별을 위해 선택된 하나의 키를 의미한다.
후보키(Candidate Key)란, 하나의 릴레이션(Relation)에서 유일성과 최소성을 가지고 있는 모든 속성 혹은 속성 집합이다.
Table 당 하나의 기본키를 가진다.
기본키로 선택된 속성은 중복되지 않는 고유값을 가진다. → UNIQUE
정의되지 않은 NULL 값을 포함할 수 없다. → NOT NULL
다른 Relation(Table)에 있는 외래키(FOREIGN KEY)에 의해 참조될 수도 있다.
PRIMARY KEY 생성 문법
// 1. Table을 생성할 때 지정
CREATE TABLE table_name(
column1 datatype NOT NULL,
column2 datatype NOT NULL,
...
[CONSTRAINT constraint_name] PRIMARY KEY (column1, column2, ...)
);
--> CONSTRAINT은 생략 가능하다. 생략하면 자동으로 생성된다.
// 2. 이미 정의되어 있는 Table에서 기본키를 설정하는 방법
ALTER TABLE table_name ADD PRIMARY KEY (column1, column2, ...)
PRIMARY KEY 삭제 문법
ALTER TABLE table_name DROP PRIMARY KEY;
CREATE TABLE person(
pid int NOT NULL,
name varchar(16),
age int,
sex char,
PRIMARY KEY (pid)
);
ALTER TABLE person DROP PRIMARY KEY;
ALTER TABLE person ADD PRIMARY KEY (pid);

외래키는 두 Relation 간의 관계를 맺어줄 때 사용되는 키로,
외래키로 정의된 속성(Attribute)는 반드시 상대 Relation의 기본키여야 한다.
Table 간의 관계를 연결해주는 역할을 하는 키이다.
외래키로 참조되는 Table의 항목(Column)은 그 Table의 기본키 혹은 단일값이어야 한다.
기본키와 달리 외래키는 한 Table 내에 여러 개일 수 있다. 즉, 여러 개의 Table을 참조할 수 있다.
FOREIGN KEY 생성 문법
// 1. Table을 생성할 때 지정
CREATE TABLE table_name(
column1 datatype NOT NULL,
column2 datatype NOT NULL,
column3 datatype,
column4 datatype,
...
[CONSTRAINT constraint_name] PRIMARY KEY (column1, column2, ...)
[CONSTRAINT constraint_name]
PRIMARY KEY (column3, column4, ...) REFERENCES REF_tablename(REF_column)
);
// 2. 이미 정의되어 있는 Table에서 외래키를 설정하는 방법
ALTER TABLE table_name ADD FOREIGN KEY (column) REFERENCES REF_tablename(REF_column)
--> CONSTRAINT이 생략되어 있지만 자동으로 생성된다.
SHOW CREATE TABLE table_name;
ALTER TABLE table_name DROP FOREIGN KEY FK_constrain_name;
CREATE TABLE orders(
oid int NOT NULL,
order_no varchar(16),
pid int,
PRIMARY KEY (oid),
[CONSTRAINT FK_person] FOREIGN KEY (pid) REFERENCES person(pid)
);
SHOW CREATE TABLE orders;

CREATE TABLE job(
jid int NOT NULL,
name varchar(16),
pid int,
PRIMARY KEY (jid),
FOREIGN KEY (pid) REFERENCES person(pid)
);
SHOW CREATE TABLE job;
--> SHOW CREATE TABLE로 자동 생성된 constraint_name을 알 수 있다.

ALTER TABLE orders DROP FOREIGN KEY FK_person;
ALTER TABLE orders
ADD [CONSTRAINT FK_person] FOREIGN KEY (pid) REFERENCES person(pid);
