쿼리문을 최적화하는 것은 다른 문제이지만,
기본 쿼리문을 익히는 것은 단순 반복, 습관화하는 것일 뿐이다.
다만, 각 기능의 핵심 예제들을 한번에 보기 위하여 정리한다.
간단한 쿼리문은 의미를 적지 않고 넘어간다.
유의사항을 남기도록 하자.
(1) (=)
SELECT population
FROM world
WHERE name = 'France'
(2) (in category)
SELECT name, population
FROM world
WHERE name IN ('Brazil', 'Russia', 'India', 'China');
name이 category candidates에 속하는 걸로 table 반환
(3) (in range)
SELECT name, area
FROM world
WHERE area BETWEEN 250000 AND 300000
(각 숫자는 inclusive이다, 즉 해당 값도 포함시켜 반환함)
(4) (multiple conditions)
SELECT name,length(name)
FROM world
WHERE length(name)=5 and region='Europe'
(조건절에 있는 칼럼이 꼭 select한 column일 필요는 없음)
(5) (order by)
SELECT select_list
FROM table_name
ORDER BY column1, column2 DESC
(정렬 default는 ASC이므로 column1은 ASC로 ordering)
(column 1기준으로 ASC하고, column 1 값은 고정하고 column2로 DESC함)
(6) (order by, making new column)
SELECT orderNumber, orderlinenumber, quantityOrdered * priceEach
FROM orderdetails
ORDER BY quantityOrdered * priceEach DESC;
(이렇게 기존 column을 곱해가지고 new column을 기준으로 order by 가능하기도하고 select도 가능)
(7) (order by, making new column, using alias)
SELECT orderNumber, orderLineNumber, quantityOrdered * priceEach AS subtotal
FROM orderdetails
ORDER BY subtotal DESC;
(이렇게 making new column한 것의 alias를 줘서, order by시에 alias를 쓰는게 가능)
(8) (order by, custom order)
SELECT orderNumber, status
FROM orders
ORDER BY FIELD(status, 'In Process', 'On Hold', 'Cancelled', 'Resolved', 'Disputed', 'Shipped');
(FIELD(status, 'In Process', ...) 부분은 index of the status in the list ['In Process', ...]을 반환함)
(따라서 이 쿼리문의 결과는 status field에 In Process인 값부터 'Shipped'까지 정렬되어 반환)
(9) (like)
SELECT firstName, lastName
FROM employees
WHERE lastName LIKE '%son'
ORDER BY firstName;
(LIKE condition은 특정 pattern이면 True를 반환)
(wild card인 %는 any string of zero or more characters)
(wild card인 _는 any "single" character)
(10) (IS NULL)
SELECT lastName, firstName, reportsTo
FROM employees
WHERE reportsTo IS NULL;
(Database에서 NULL이란 missing or unknown을 가리킴, empty string이나 0을 가리키는게 아니니 주의)
(11) (<> 혹은 !=)
SELECT lastname, firstname, jobtitle
FROM employees
WHERE jobtitle <> 'Sales Rep';
(12) (> 혹은 <)
SELECT lastname, firstname, officeCode
FROM employees
WHERE officecode > 5;
(13) (DISTINCT)
SELECT DISTINCT state
FROM customers;
(state column을 가져오면서 duplicates row는 1개만 가져온다.)
(이 때, NULL이 중복이면 1개의 NULL row만 가져온다.)
(14) (IS NOT NULL)
SELECT state, city
FROM customers
WHERE state IS NOT NULL
ORDER BY state, city;
(15) (DISTINCT multiple columns)
SELECT DISTINCT state, city
FROM customers
WHERE state IS NOT NULL
ORDER BY state, city;
(이 때는 state, city 둘의 값이 동시에 같은 rows를 duplicate row로 취급하여 1개만 반환함)
(16) (GROUP BY)
SELECT state
FROM customers
GROUP BY state;
(이는 SELECT DISTINCT state FROM customers;와 같다. 즉 DISTINCT는 GROUP BY의 special case로 보자.)
(MySQl 8.0미만 버전에서는 GROUP BY가 implicit sorting을 하게 된다. 그 이상 버전에서는 하지 않음)
(17) (DISTINCT with an aggregate function)
SELECT COUNT(DISTINCT state)
FROM customers
WHERE country = 'USA';
(aggregate function인 COUNT, SUM, AVG 같은 것을 함께 써서 duplicated rows가 없는 취합이 가능)
(18) (DISTINCT with LIMIT)
SELECT DISTINCT state
FROM customers
WHERE state IS NOT NULL
LIMIT 5;
(MySQL은 LIMIT만큼의 결과를 찾은 즉시 searching을 그만 둔다.)
(19) (AND with NULL)
SELECT customername, country, state
FROM customers
WHERE country = 'USA' AND state = 'Victoria';
(NULL AND TRUE는 NULL을 반환, 즉 country가 'USA'이고 state가 null이면 select하지 않음)
(NULL AND FALSE는 FALSE을 반환)
(20) (OR AND가 존재할 때 판단 순서, Operator precedence)
SELECT true OR false AND false;
(이는 false AND false를 먼저 계산하여 false, 이후 true OR false계산하여 true, 따라서 1을 반환)
(21) (OR AND가 존재할 때 순서를 강제하기)
SELECT (true OR false) AND false:
(이렇게 순서를 괄호로 강제하면 true OR false에서 true, true AND false에서 false, 따라서 0을 반환)
(22) (OR AND가 여럿 존재하면 반드시 괄호 쓰기)
SELECT customername, country, creditLimit
FROM customers
WHERE country = 'USA' OR country = 'France' AND creditlimit > 10000;
(이 경우 결과는 (country='FRANCE' AND creditlimit>10000) or (country='USA')를 반환함)
(아마도 이 쿼리를 작성한 사람은 이 결과를 원한게 아닐 것이다.)
((country = 'USA' OR count = 'France') AND creditlimit > 10000; 을 사용했어야 했다.)
참고자료:
www.mysqltutorial.org/mysql-where/
'CS' 카테고리의 다른 글
[Pandas]dataframe에서 특정 column값 기준으로 상위 rows 선별 (0) | 2020.11.10 |
---|---|
[Pandas]dataframe의 row를 shuffle하기 (0) | 2020.11.10 |
(미완)[Python]Global Interpreter Lock에 대해서 (0) | 2020.11.06 |
[Database]RDBMS(Relational DataBase Management System)란 무엇인가? (0) | 2020.11.03 |
[Python] __slots__ 사용에 대해 (0) | 2020.11.02 |