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;

아래의 쿼리는 employeeslastNamefirstName을 선택한다. CONCAT_WS() function은 firstNamelastName을 연속적으로 나열해 하나의 이름을 만든다.

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

위의 쿼리는 customersorders 표에서 orderNumber의 수와 customerName을 선택한다. 그리고 customers 표의 가명으로 c를 사용하고 orders 표의 가명으로 o를 사용한다. customersorders의 열은 표 가명을 통해 참조할 수 있다.

만약 위의 쿼리에서 가명을 사용하지 않는다면 표 이름(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