2021-12-02 23:01 작성
My SQL basic 메모
Table of contents
MySQL alias for columns (열에 가명 짓기)
MySQL에서 가병을 짓는 것은 쿼리의 가독성을 개선한다. 때때로 열의 명칭은 기술적으로 적혀 있어서 이해하기 힘들 때가 존재하는데 이때 가명을 사용할 수 있다.
SELECT
[column_1 | expression] AS descriptive_name
FROM table_name;
-- 공백 포함 시
SELECT
[column_1 | expression] AS `descriptive name`
FROM
table_name;
아래의 쿼리는 employees
의 lastName
과 firstName
을 선택한다. CONCAT_WS()
function은 firstName
과 lastName
을 연속적으로 나열해 하나의 이름을 만든다.
SELECT
CONCAT_WS(', ', lastName, firstname)
FROM
employees;
output: lastName, firstName
형태로 데이터를 추출한다.
concat_ws(‘, ‘, lastName, firstName) |
---|
Murphy, Diane |
Patterson, Mary |
Firrelli, Jeff |
Patterson, William |
Bondur, Gerard |
Bow, Anthony |
…
위의 예시에서 열의 명칭이 복잡한 것을 알 수 있다. 따라서 아래와 같이 바꾸어 쓸 수 있다.
SELECT
CONCAT_WS(', ', lastName, firstname) AS `Full name`
FROM
employees;
-- AS 생략 및 ORDER BY에서 재사용
SELECT
CONCAT_WS(', ', lastName, firstname) `Full name`
FROM
employees
ORDER BY
`Full name`;
아래의 예시에서는 total 값이 60,000 보다 큰 데이터를 추출한다.
SELECT
orderNumber `Order no.`,
SUM(priceEach * quantityOrdered) total
FROM
orderDetails
GROUP BY
`Order no.`
HAVING
total > 60000;
Order no. | Total |
---|---|
10165 | 67392.85 |
10287 | 61402.00 |
10310 | 61234.67 |
열 가명(column alias)은
WHERE
에서 사용할 수 없다. 그 이유는 MySQL이WHERE
절을 평가할 때SELECT
에서 명시된 열의 값들은 아직 평가되지 않았기 때문이다.
표(tables)에서의 가명(alias) 짓기
표에 다른 이름을 짓는 용도로 가명을 사용할 수도 있다.
SELECT * FROM table_name AS table_alias
-- AS 생략
SELECT * FROM employees e;
표에 가명이 할당되면 아래와 같은 문법을 사용해서 표의 열을 참조할 수 있다.
table_alias.column_name
예를 들면 다음과 같다:
SELECT
e.firstName,
e.lastName
FROM
employees e
ORDER BY e.firstName;
표 가명(table aliases)은 종종 INNER JOIN
, LEFT JOIN
, RIGHT JOIN
을 포함하는 구문과 서브쿼리 안에서 사용된다.
위 두 개의 표는 customerNumber
를 공유하고 있다. customerNumber
열에 자격을 주는 가명 사용 없다면 다음과 같은 에러 메시지를 받게 된다.
Error Code: 1052. Column 'customerNumber' in on clause is ambiguous
위의 에러를 없애기 위해 customerNumber
에 가명을 주는 방법을 사용할 수 있다.
SELECT
customerName,
COUNT(o.orderNumber) total
FROM
customers c
INNER JOIN orders o ON c.customerNumber = o.customerNumber
GROUP BY
customerName
ORDER BY
total DESC;
customerName | total |
---|---|
Euro+ Shopping Channel | 26 |
Mini Gifts Distributors Ltd. | 17 |
Australian Collectors, Co. | 5 |
Reims Collectables | 5 |
Down Under Souveniers, Inc | 5 |
Danish Wholesale Imports | 5 |
Dragon Souveniers, Ltd. | 5 |
Souveniers And Things Co. | 4 |
…
위의 쿼리는 customers
와 orders
표에서 orderNumber
의 수와 customerName
을 선택한다. 그리고 customers
표의 가명으로 c
를 사용하고 orders
표의 가명으로 o
를 사용한다. customers
와 orders
의 열은 표 가명을 통해 참조할 수 있다.
만약 위의 쿼리에서 가명을 사용하지 않는다면 표 이름(table name)을 각각의 열에 참조해야 하고 이것은 쿼리를 길게 하며 가독성이 떨어지게 만든다.
SELECT
customers.customerName,
COUNT(orders.orderNumber) total
FROM
customers
INNER JOIN orders ON customers.customerNumber = orders.customerNumber
GROUP BY
customerName
ORDER BY
total DESC