MySQL에서는 모든 SQL 처리를 단일 코어에서 Nested Loop Join 방식으로만 데이터를 처리
병렬 처리라는 것은 없습니다. 물론 일부 3rd스토리지 엔진을 플러그인으로 설치를 하면 병렬 처리가 가능하다고는 하지만, 기본적인 스토리지 엔진에는 단일 코어 수행합니다. 그렇기 때문에 MySQL 입장에서는 CPU코어 개수를 늘리는 Scale-Out보다는 오히려 단위 처리량이 좋은 CPU로 Scale-Up을 하는 것이 훨씬 유리합니다.
MySQL은 다양한 스토리지 엔진을 지원합니다. MyISAM, InnoDB, Archive, Memory, NDB, Federated 등 기본 엔진 뿐만 아니라 3rd Party 스토리지 엔진도 간단하게 플러그인 형식으로 설치를 할 수 있음
MySQL은 물리적으로 독립적인 디스크 영역에 데이터를 복제(Replication)하여 데이터를 이중화할 수 있음
SELECT count(distinct INDEX_COLUMN)/count(*)
FROM TABLE;
CREATE INDEX IDX01 on TAB1(COL(4), COL(4))
SELECT count(distinct LEFT(INDEX_COLUMN,3))/count(*)
FROM TABLE;
alter table user_tbl add email_crc int unsigned not null;
create index idx01_email_crc on user_tbl (email_crc);
create trigger trg_user_tbl_insert
before insert on user_tbl
for each row
begin
set new.email_crc = crc32(lower(trim(new.email)));
end$
create trigger trg_user_tbl_update
before update on user_tbl
for each row
begin
if old.email <> new.email then
set new.email_crc = crc32(lower(trim(new.email)));
end if;
end$
select *
from user_tbl
where email_crc = crc32(lower(trim('mail@domain.com')))
and email= 'mail@domain.com'
CRC32 결과가 중복되어도, email값을 직접 비교하는 부분에서 중복이 제거됩니다.SELECT lastName
FROM employees;
SELECT
lastName,
firstName,
jobTitle
FROM
employees;
SELECT employeeNumber,
lastName,
firstName,
extension,
email,
officeCode,
reportsTo,
jobTitle
FROM employees;
SELECT *
FROM employees;
ORDER BY
ORDER BY
하나 이상의 열을 기준으로 결과 집합을 정렬 하려면 이 절을 사용합니다 .ASCDESC
결과 집합을 오름차순으로 정렬하고 옵션을 사용 하여 결과 집합을 내림차순으로 정렬합니다.ORDER BYFROMSELECT
절은 and 절 다음 에 평가 됩니다.NULL
NULL이 아닌 값보다 작음ORDER BY
절을 사용하여 성을 오름차순으로 정렬SELECT
contactLastname,
contactFirstname
FROM
customers
ORDER BY
contactLastname;
SELECT
contactLastname,
contactFirstname
FROM
customers
ORDER BY
contactLastname DESC;
SELECT
contactLastname,
contactFirstname
FROM
customers
ORDER BY
contactLastname DESC ,
contactFirstname ASC;
orderdetails
테이블에서 주문 라인 항목을 선택합니다. 각 라인 항목에 대한 부분합을 계산하고 부분합을 기반으로 결과 집합을 정렬SELECT
orderNumber,
orderlinenumber,
quantityOrdered * priceEach
FROM
orderdetails
ORDER BY
quantityOrdered * priceEach DESC;
SELECT
절의 표현식에 열 별칭 을 할당하고 해당 열 별칭을 절에서 사용할 수 ORDER BY
있음SELECT
orderNumber,
orderLineNumber,
quantityOrdered * priceEach AS subtotal
FROM
orderdetails
ORDER BY subtotal DESC;
WHERE
WHERE
조건별로 행을 필터링합니다.WHEREFROMSELECTORDER BY
절 뒤 와 and 절 앞 절을 평가합니다 . SELECT
lastname,
firstname,
jobtitle
FROM
employees
WHERE
jobtitle = 'Sales Rep';
SELECT
lastname,
firstname,
jobtitle,
officeCode
FROM
employees
WHERE
jobtitle = 'Sales Rep' AND
officeCode = 1;
SELECT
lastName,
firstName,
jobTitle,
officeCode
FROM
employees
WHERE
jobtitle = 'Sales Rep' OR
officeCode = 1
ORDER BY
officeCode ,
jobTitle;
[BETWEEN](https://www.mysqltutorial.org/mysql-between)
연산자는 TRUE
값이 값 범위에 있는 경우 반환 합니다.expression BETWEEN low AND high
코드 언어:SQL(구조적 쿼리 언어)(sql)
다음 쿼리는 사무실 코드가 1에서 3 사이인 사무실에 있는 직원을 찾음SELECT
firstName,
lastName,
officeCode
FROM
employees
WHERE
officeCode BETWEEN 1 AND 3
ORDER BY officeCode;
[LIKE](https://www.mysqltutorial.org/mysql-like/)
연산자는 값이 지정된 패턴과 일치하는지 평가 합니다 TRUE
. 패턴을 형성하려면 %
및 _
와일드카드를 사용합니다. %
와일드카드는 0개 이상의 문자와 일치하는 반면 와일드 _
카드는 단일 문자와 일치합니다. 다음 쿼리는 성이 문자열로 끝나는 직원을 찾습니다 'son'
.SELECT
firstName,
lastName
FROM
employees
WHERE
lastName LIKE '%son'
ORDER BY firstName;
[IN](https://www.mysqltutorial.org/mysql-basics/mysql-in/)
연산자는 값이 목록의 값과 일치하는 경우 반환 합니다 TRUE
.value IN (value1, value2,...)
코드 언어:SQL(구조적 쿼리 언어)(sql)
다음 예에서는 연산자 WHERE
와 함께 절을 사용 IN
하여 사무실 코드가 1인 사무실에 있는 직원을 찾습니다.SELECT
firstName,
lastName,
officeCode
FROM
employees
WHERE
officeCode IN (1 , 2, 3)
ORDER BY
officeCode;
[NULL](https://www.mysqltutorial.org/mysql-null/)
를 사용합니다 . 연산자는 값이 이면 반환 합니다 .[IS NULL](https://www.mysqltutorial.org/mysql-is-null/)=IS NULLTRUENULL
value IS NULL
코드 언어:SQL(구조적 쿼리 언어)(sql)
데이터베이스 세계에서 NULL
값이 없거나 알 수 없음을 나타내는 마커입니다. 그리고 NULL은 숫자 0 또는 빈 문자열과 동일하지 않습니다. 다음 명령문은 연산자 WHERE
와 함께 절을 사용하여 열의 값이 있는 행을 가져옵니다 .IS NULLreportsToNULL
SELECT
lastName,
firstName,
reportsTo
FROM
employees
WHERE
reportsTo IS NULL;
Sales Rep
.SELECT
lastname,
firstname,
jobtitle
FROM
employees
WHERE
jobtitle <> 'Sales Rep';
SELECT
lastname,
firstname,
officeCode
FROM
employees
WHERE
officecode > 5;
SELECT
lastname,
firstname,
officeCode
FROM
employees
WHERE
officecode <= 4;
DISTINCT
에서 절 을 사용 SELECT
DISTINCT lastname
FROM
employees
ORDER BY
lastname;
DISTINCT
절 에 여러 열을 지정하면 DISTINCT
절은 이러한 열의 값 조합을 사용하여 결과 집합에 있는 행의 고유성을 결정합니다. 예를 들어, 테이블에서 도시와 주의 고유한 조합을 얻으려면 customers
다음 쿼리를 사용SELECT DISTINCT
state, city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state,
city;
AND
연산자는 둘 이상의 부울 표현식을 결합하고 1, 0 또는 NULL을 반환 하는 논리 연산자 연산자 를 사용하여 AND
둘 이상의 부울 표현식을 결합할 수 있습니다. 예를 들어 다음 쿼리는 미국 캘리포니아에 거주하고 신용 한도가 100,000보다 큰 고객을 반환AND
연산자를 사용 하여 두 개의 부울 표현식을 결합합니다. 연산자는 두 표현식 이
모두 true일 때 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
AND
연산자를 사용 하여 WHERE
명령문 의 SELECT
절 에서 조건을 형성합니다.
SELECT
customername,
country,
state,
creditlimit
FROM
customers
WHERE
country = 'USA' AND
state = 'CA' AND
creditlimit > 100000;
MySQL 연산자는 두 개의 부울 표현식 OR
을 결합한 논리 연산자
표현식에 AND
and OR
연산자가 모두 포함되어 있으면 MySQL은 연산자 우선 순위를 사용하여 연산자 평가 순서를 결정합니다. MySQL은 우선 순위가 높은 연산자를 먼저 평가합니다.
AND
연산자는 연산자보다 우선 순위가 높기 때문에 MySQL은 연산자보다 먼저 연산자 OR
를 평가 AND
합니다
다음 예에서는 OR
연산자를 사용하여 미국 또는 프랑스에 있고 신용 한도가 100,000보다 큰 고객을 선택
SELECT
customername,
country,
creditLimit
FROM
customers
WHERE(country = 'USA'
OR country = 'France')
AND creditlimit > 100000;
연산자를 사용하면 값 이 IN
값 목록의 값과 일치하는지 확인할 수 있습니다. 다음은 IN
연산자 구문
value IN (value1, value2, value3,...)
일반적으로 IN
연산자는 NULL
다음 두 가지 경우에 반환합니다.
연산자 의 value
왼쪽은 NULL입니다.
값이 목록의 값과 같지 않고 목록의 값 중 하나가 NULL입니다.
다음 예제에서는 IN 연산자의 왼쪽 값이 NULL이므로 NULL을 반환합니다.
SELECT NULL IN (1,2,3);
다음 예에서는 IN
연산자를 사용하여 미국과 프랑스에 있는 사무실을 찾음
SELECT
officeCode,
city,
phone,
country
FROM
offices
WHERE
country IN ('USA' , 'France');
SELECT
officeCode,
city,
phone
FROM
offices
WHERE
country = 'USA' OR country = 'France';
연산자를 사용하여 및 에 NOT IN
없는 사무실을 찾음
SELECT
officeCode,
city,
phone
FROM
offices
WHERE
country NOT IN ('USA' , 'France')
ORDER BY
city;
연산자는 값 이 BETWEEN
범위에 있는지 여부를 지정하는 논리 연산자
value BETWEEN low AND high;
<
보다 작음( ), 보다 큼( >
) 및 논리 연산자( ) 를 사용하여 위의 쿼리를 다음과 같이 다시 작성할 수 있습니다 [AND](https://www.mysqltutorial.org/mysql-and/)
.
SELECT
productCode,
productName,
buyPrice
FROM
products
WHERE
buyPrice < 20 OR buyPrice > 100;
값이 날짜 범위 사이에 있는지 확인하려면 값을 DATE 유형 으로 명시적으로 캐스트 해야 합니다.
예를 들어 다음 문은 2003년 1월 1일에서 2003년 1월 31일 사이에 필요한 날짜가 있는 주문을 반환
SELECT
orderNumber,
requiredDate,
status
FROM
orders
WHERE
requireddate BETWEEN
CAST('2003-01-01' AS DATE) AND
CAST('2003-01-31' AS DATE);
연산자는 문자열에 지정된 패턴 이 LIKE
포함되어 있는지 여부를 테스트하는 논리 연산자
expression LIKE pattern ESCAPE escape_character
이 예에서는 LIKE
연산자를 사용하여 이름이 문자로 시작하는 직원을 찾습니다 a
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
firstName LIKE 'a%';
연산자를 사용하여 성이 리터럴 문자열 (예: , ) LIKE
로 끝나는 직원을 찾습니다 .onPattersonThompson
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastName LIKE '%on';
이름이 문자로 시작하고 문자 T
로 끝나고 , , m
사이에 단일 문자를 포함하는 직원을 찾으려면 밑줄(_) 와일드카드를 사용하여 다음과 같이 패턴을 구성합니다.TomTim
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
firstname LIKE 'T_m';
연산자를 사용하여 LIKE
값이 패턴과 일치하는지 테스트합니다.
와일드 %
카드는 0개 이상의 문자와 일치합니다.
와일드 _
카드는 단일 문자와 일치합니다.
Use ESCAPE\
절은 기본 이스케이프 문자( ) 이외의 이스케이프 문자를 지정합니다
.
연산자를 사용하여 NOTLIKE
연산자를 부정합니다
.
MySQL을 사용하면 NOT
연산자와 연산자 를 결합하여 LIKE
특정 패턴과 일치하지 않는 문자열을 찾을 수 있습니다.
성이 문자로 시작하지 않는 직원을 검색하려는 경우 다음과 같이 연산자를 B
사용할 수 있습니다 .NOT LIKE
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastName NOT LIKE 'B%';
이 LIMIT
절은 [SELECT](https://www.mysqltutorial.org/mysql-select-statement-query-data.aspx)
반환할 행 수를 제한하기 위해 문에서 사용됩니다. 이 LIMIT
절은 하나 또는 두 개의 인수를 허용합니다. 두 인수의 값은 0 또는 양의 정수
• MySQL 절을 사용 하여 명령문 LIMIT
이 반환하는 행 수를 제한합니다 .SELECT
기본적으로 SELECT
문은 지정되지 않은 순서로 행을 반환합니다. LIMIT
명령문에 절을 추가하면 SELECT
반환되는 행을 예측할 수 없습니다.
따라서 절이 예상 출력을 반환하도록 하려면 항상 다음과 같은 절과 LIMIT
함께 사용해야 합니다 .[ORDER BY](https://www.mysqltutorial.org/mysql-order-by/)
SELECT
select_list
FROM
table_name
ORDER BY
sort_expression
LIMIT offset, row_count;
화면에 데이터를 표시할 때 행을 페이지로 나누고자 하는 경우가 많습니다. 각 페이지에는 10 또는 20과 같이 제한된 수의 행이 포함
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10;
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 5, 5;
LIMIT
절과 함께 절 을 사용하는 경우 [DISTINCT](https://www.mysqltutorial.org/mysql-distinct.aspx)
MySQL은 절에 지정된 고유 행 수를 찾으면 즉시 검색을 중지합니다 LIMIT
.
이 예에서는 LIMIT
절과 함께 절을 사용하여 테이블 DISTINCT
의 처음 5개 고유 상태를 반환
SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 5;
값이 있는지 여부를 테스트하려면 연산자 NULL
를 사용
IS NULLNULLIS NULLNULL
연산자를 사용하여 값이 있는지 여부를 테스트합니다
. 연산자는 값 이
이면 1을 반환합니다
.
값 이 IS NOT NULLNULL
아닌 경우 1을 반환합니다
.
SELECT 1 IS NULL, -- 0
0 IS NULL, -- 0
NULL IS NULL; -- 1
쿼리는 IS NULL
연산자를 사용하여 영업 담당자가 없는 고객을 찾음
SELECT
customerName,
country,
salesrepemployeenumber
FROM
customers
WHERE
salesrepemployeenumber IS NULL
ORDER BY
customerName;
ODBC 프로그램과 호환되도록 MySQL은 IS NULL
연산자의 일부 특수 기능을 지원
1) [DATE](https://www.mysqltutorial.org/mysql-date/)
또는 [DATETIME](https://www.mysqltutorial.org/mysql-datetime/)
열에 [NOT NULL](https://www.mysqltutorial.org/mysql-not-null-constraint/)
제약 조건이 있고 특수 날짜가 포함된 경우 연산자를 '0000-00-00'
사용하여 IS NULL
이러한 행을 찾을 수 있습니다.
먼저 다음과 같은 테이블을 만듭니다 projects
.
CREATE TABLE IF NOT EXISTS projects (
id INT AUTO_INCREMENT,
title VARCHAR(255),
begin_date DATE NOT NULL,
complete_date DATE NOT NULL,
PRIMARY KEY(id)
);
projects
둘째, 테이블 에 일부 행을 삽입 합니다.
INSERT INTO projects(title,begin_date, complete_date)
VALUES('New CRM','2020-01-01','0000-00-00'),
('ERP Future','2020-01-01','0000-00-00'),
('VR','2020-01-01','2030-01-01');
셋째, IS NULL
연산자를 사용하여 complete_date
열의 값이 is 인 행을 선택합니다 '0000-00-00'
.