'Database/Mysql'에 해당하는 글 27건

NULL

Database/Mysql 2007. 2. 7. 21:36
NULL

NULL이 단순 비교 연산자는 사용할 수 없는지를 알아본다.

mysql> SELECT 1=NULL, 1<>NULL, 1<NULL, 1>NULL;
+--------+---------+--------+--------+
| 1=NULL | 1<>NULL | 1<NULL | 1>NULL |
+--------+---------+--------+--------+
|   NULL |    NULL |   NULL |   NULL |
+--------+---------+--------+--------+

1 row in set (0.00 sec)
- 명백히 이러한 비교문을 가지고는 의미 있는 결과를 얻어낼 수 없다.

대신에 IS NULL과 IS NOT NULL 연산자를 사용해 본다.

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+

1 row in set (0.00 sec)

  • 0 또는 NULL은 거짓(false)을 의미하며 다른 것은 참(true)를 의미한다.
  • boolean 연산에서 디폴트 참은 1이다.
  • 0 또는 빈 스트링('')을 NOT NULL에 삽입하는 것은 확실히 가능하다.
  • ORDER BY 실행시 오름차순(ASC)일 때는 가장 먼저 나오고, 내림차순(DESC)을 하면 가장 나중에 나온다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

데이터 계산

Database/Mysql 2007. 2. 7. 21:31
데이터 계산하기

Mysql은 날짜로 나이를 계산하고, 날짜의 특정 부분을 추출하는 여러가지 함수를 제공한다.

각 이름의 현재날짜 - 생일날짜로 나이 계산

mysql> SELECT name, birth, CURDATE(),
   -> ( YEAR( CURDATE() ) - YEAR( birth ) )
   -> - ( RIGHT( CURDATE(), 5 ) < RIGHT( birth, 5 ) )
   -> AS age
   -> FROM pet;
+-------+------------+------------+------+
| name  | birth      | CURDATE()  | age  |
+-------+------------+------------+------+
| Nabi  | 2006-12-31 | 2006-12-21 |   -1 |
| Hoya  | 2006-10-31 | 2006-12-21 |    0 |
| Puppy | 2006-12-04 | 2006-12-21 |    0 |
| Taeji | 2004-10-02 | 2006-12-21 |    2 |
+-------+------------+------------+------+

4 rows in set (0.00 sec)
- YEAR() : 날짜에서 연도 부분을 가져온다.
- CURDATE() : 현재 날짜를 가져온다.
- RIGHT() : 첫번째 매개변수의 오른쪽부터 두번째 매개변수의 자리수까지를 반환한다.
- as(alias)를 사용하여 전체 수식을 이해하기 쉬운 문자(age)로 사용한다.

mysql> SELECT name, birth, CURDATE(),
   -> ( YEAR( CURDATE() ) - YEAR( birth ) )
   -> - ( RIGHT( CURDATE(), 5 ) < RIGHT( birth, 5 ) )
   -> AS age
   -> FROM pet;
   -> ORDER BY age;
- ORDER BY 구문을 사용하여 age 로 정렬할 수도 있다.

mysql> SELECT name, birth, death
   -> FROM pet
   -> WHERE death IS NOT NULL;
+-------+------------+------------+
| name  | birth      | death      |
+-------+------------+------------+
| Taeji | 2004-10-02 | 2006-03-30 |
+-------+------------+------------+

1 row in set (0.00 sec)
- death 값이 채워진(NULL이 아닌) 레코드의 'name, birth, death' 필드를 선택한다.
- 'death <> NULL'을 사용하지 않고 'death IS NOT NULL'을 사용하는 이유는 NULL이 일반적인 비교 연산자를 가지고는 비교 연산을 할 수 없는 특별한 값을 가지기 때문이다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

레코드 정렬

Database/Mysql 2007. 2. 7. 21:17
레코드 정렬

쿼리의 결과를 정렬하기 위해서 ORDER BY 구문을 사용한다.

mysql> SELECT name, birth
   -> FROM pet
   -> ORDER BY birth;
+-------+------------+
| name  | birth      |
+-------+------------+
| Taeji | 2004-10-02 |
| Hoya  | 2006-10-31 |
| Puppy | 2006-12-04 |
| Nabi  | 2006-12-31 |
+-------+------------+

4 rows in set (0.00 sec)
- 'pet' 테이블을 'birth' 필드의 오름차순(default=ASC)으로 정렬하여 'name'과 'birth' 필드를 선택한다.

mysql> SELECT name, birth
   -> FROM pet
   -> ORDER BY birth DESC;
+-------+------------+
| name  | birth      |
+-------+------------+
| Nabi  | 2006-12-31 |
| Puppy | 2006-12-04 |
| Hoya  | 2006-10-31 |
| Taeji | 2004-10-02 |
+-------+------------+

4 rows in set (0.00 sec)
- 'pet' 테이블을 'birth' 필드의 내림차순으로 정렬하여 'name'과 'birth' 필드를 선택한다.

mysql> SELECT name, species, birth
   -> FROM pet
   -> ORDER BY species, birth DESC;
+-------+---------+------------+
| name  | species | birth      |
+-------+---------+------------+
| Taeji | cat     | 2004-10-02 |
| Puppy | dog     | 2006-12-04 |
| Nabi  | hamster | 2006-12-31 |
| Hoya  | rabbit  | 2006-10-31 |
+-------+---------+------------+

4 rows in set (0.00 sec)
- 'pet' 테이블을 'species' 필드의 오름차순, 'birth'의 내림차순으로 정렬하여 'name'과 'species'와 'birth' 필드를 선택한다.

  • 다중 필드에서도 정렬할 수 있으며, 서로 다른 순서로 필드를 정렬할 수 있다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

필드 선택

Database/Mysql 2007. 2. 7. 21:12
필드 선택하기

전체(*) 필드를 보지 않고, 특정 필드만을 보고 싶을 때는 콤마(,)로 구분한다.

mysql> SELECT name, birth
   -> FROM pet;
+-------+------------+
| name  | birth      |
+-------+------------+
| Nabi  | 2006-12-31 |
| Hoya  | 2006-10-31 |
| Puppy | 2006-12-04 |
| Taeji | 2004-10-02 |
+-------+------------+
4 rows in set (0.00 sec)
- 'pet' 테이블의 'name', 'birth' 필드를 선택한다.

mysql> SELECT DISTINCT owner
   -> FROM pet;
+-------+
| owner |
+-------+
| Hong  |
| Chan  |
+-------+

2 rows in set (0.00 sec)
- 'pet' 테이블의 'owner' 필드에서 중복된 값들을 최소화한다.

mysql> SELECT name, species
   -> FROM pet
   -> WHERE species = 'dog' OR species = 'cat';
+-------+---------+
| name  | species |
+-------+---------+
| Puppy | dog     |
| Taeji | cat     |
+-------+---------+
2 rows in set (0.01 sec)
- 'pet' 테이블의 'species' 필드값이 'dog' 이거나 'cat' 인 레코드의 name, species 필드를 선택한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

레코드 선택

Database/Mysql 2007. 2. 7. 21:06
레코드 선택

mysql> SELECT *
  -> FROM pet
  -> WHERE name = 'Nabi';
+------+-------+---------+------+------------+-------+
| name | owner | species | sex  | birth      | death |
+------+-------+---------+------+------------+-------+
| Nabi | Hong  | hamster | f    | 2006-12-31 | NULL  |
+------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)
- 'pet' 테이블의 'name' 필드값이 'Nabi'인 레코드의 모든 필드를 선택한다.

mysql> SELECT *
  -> FROM pet
  -> WHERE birth >= '2006-12-01';
+-------+-------+---------+------+------------+-------+
| name  | owner | species | sex  | birth      | death |
+-------+-------+---------+------+------------+-------+
| Nabi  | Hong  | hamster | f    | 2006-12-31 | NULL  |
| Puppy | Hong  | dog     | f    | 2006-12-04 | NULL  |
+-------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)
- 'pet' 테이블의 'birth' 필드값이 '2006-12-01' 날짜보다 큰 레코드의 모든 필드를 선택한다.

mysql> SELECT *
  -> FROM pet
  -> WHERE species = 'dog' AND sex = 'f';
+-------+-------+---------+------+------------+-------+
| name  | owner | species | sex  | birth      | death |
+-------+-------+---------+------+------------+-------+
| Puppy | Hong  | dog     | f    | 2006-12-04 | NULL  |
+-------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)
- 'pet' 테이블의 'species' 필드값이 'dog' 이고 'sex' 필드값이 'f' 인 레코드의 모든 필드를 선택한다.

mysql> SELECT *
  -> FROM pet
  -> WHERE species = 'rabbit' OR species = 'cat';
+-------+-------+---------+------+------------+------------+
| name  | owner | species | sex  | birth      | death      |
+-------+-------+---------+------+------------+------------+
| Hoya  | Chan  | rabbit  | m    | 2006-10-31 | NULL       |
| Taeji | Chan  | cat     | m    | 2004-10-02 | 2006-03-30 |
+-------+-------+---------+------+------------+------------+

2 rows in set (0.00 sec)
- 'pet' 테이블의 'species' 필드값이 'rabbit' 이거나 'cat' 인 레코드의 모든 필드를 선택한다.

mysql> SELECT *
  -> FROM pet
  -> WHERE ( species = 'cat' AND sex = 'm' )
  -> OR ( species = 'dog' AND sex = 'f' );
+-------+-------+---------+------+------------+------------+
| name  | owner | species | sex  | birth      | death      |
+-------+-------+---------+------+------------+------------+
| Puppy | Hong  | dog     | f    | 2006-12-04 | NULL       |
| Taeji | Chan  | cat     | m    | 2004-10-02 | 2006-03-30 |
+-------+-------+---------+------+------------+------------+

2 rows in set (0.00 sec)
- 'pet' 테이블의 'species' 필드값이 'dog'이고 'sex' 필드값이 'f' 이거나 'species' 필드값이 'cat'이고 'sex' 필드값이 'm' 인 레코드의 모든 필드를 선택한다.

  • AND 와 OR 연산자를 혼용해서 사용할 때 AND의 우선 순위가 더 높다.
  • 조건문을 올바르게 연산하기 위해 괄호를 사용하는 것이 좋다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,