KEY

상품 테이블

상품코드 회사명 단가
A 교촌 25,000
B BBQ 30,000
C 네네 23,000
D 노랑통닭 22,000

판매 테이블

판매번호 상품코드 수량 판매일 판매금액
1 B 1 2024-11-19
2 A 1 2024-11-19
3 D 1 2024-11-19
4 C 1 2024-11-19

유일성

데이터베이스 내에서 중복되지 않도록 보장하며 고유하게 식별할 수 있는 것을 말한다. 예를 들어 주민등록번호, 학번 등이 있고 이 기준으로 하나의 데이터(사람)을 식별할 수 있다.

특정 필드를 기준으로 테이블 내에서 유일하게 하나를 선택할 수 있다면 유일성을 만족하게 되며 위 상품테이블 예시에서 상품코드 기준으로 중복없이 회사명, 단가를 확인할 수 있다.

최소성

후보키를 구성하는 속성의 집합에서 어느 하나라도 제거하면 더 이상 해당 키가 테이블의 튜플(행)을 고유하게 식별할 수 없는 경우를 최소성이라 한다.

즉, 최소성이란 후보키가 데이터를 고유하게 식별하기 위해 꼭 필요한 속성만 포함하고, 불필요한 속성을 포함하지 않는 상태를 의미한다.

다른 속성과 결합하지 않아도 유일성을 유지할 수 있는 필드는 최소성을 충족한다고 말한다.

키의 개념 및 종류

상품 테이블에서 유일성, 최소성을 만족하는 필드는 상품코드 또는 회사명이다.
이러한 키를 후보키(Candidate key)라고 하며 후보키 중에서 하나가 기본키가 될 수 있으며 기본키(Primary Key, PK)는 개발자가 직접 지정한다.

후보키 중에서 기본키가 되지 못한 키를 대체키(Alternative Key)라고 하며 유일성은 만족하지만 최소성을 만족하지 못하는 키를 슈퍼키(Super Key)라고 한다.

판매 테이블이 상품코드 필드를 값으로 상품 테이블을 참조하여 상품코드가 B라면 상품명 네네, 단가 23000을 확인할 수 있다. 다른 테이블의 기본키를 참조하는 현재 테이블의 필드를 외래키(Foreign Key, FK)라고 한다

무결성

무결성에는 개체, 참조, 도메인이 있다

개체 무결성 : 기본키(Primary Key, PK)는 중복 값 입력과 null도 불가능하다. 각 행을 고유하게 식별해야할 때 PK로 지정한다

도메인 무결성 : 각 열의 데이터가 타입, 형식 제한 조건을 준수해야 함을 뜻한다. 성별 필드의 경우 남, 여의 값만 저장되어야한다 등의 제약조건이 필요하며 데이터 타입, not null, check 제약 조건 등을 사용한다.

참조 무결성 : 자식 테이블의 FK(Foreing Key, FK)를 통해 자식테이블이 부모테이블을 참조할 수 있도록 보장한다.

외래키가 기본키를 참조할 때 참조 무결성이 발생 가능한 상황

  1. 상품 테이블 - 데이터 삽입 : X, 새로운 상품코드가 생겨 무관하다
  2. 상품 테이블 - 데이터 삭제 : O, 참조 못할 수 있음
  3. 상품 테이블 - 데이터 수정 : O, 참조 못할 수 있음
  4. 판매 테이블 - 데이터 삽입 : O, 잘못된 값 삽입
  5. 판매 테이블 - 데이터 삭제 : X, 참조할 테이블에 문제가 없기 때문에 가능성이 없다
  6. 판매 테이블 - 데이터 수정 : O, 외래키가 수정되면 참조 무결성 발생

따라서 상품 테이블의 데이터 삽입 또는 판매 테이블의 데이터 삭제는 참조 무결성이 발생할 가능성이 없다.

정리

  1. 후보키(Candidate key) : 유일성, 최소성을 만족하는 키
  2. 기본키(Primary Key, PK) : 후보키 중에서 선택
  3. 대체키(Alternative Key) : 기본키가 되지 못한 후보키
  4. 슈퍼키(Super Key) : 유일성은 만족하나 최소성을 만족하지 못하는 키
  5. 외래키(Foreign Key, FK) : 다른 테이블의 기본키를 참조하는 현재 테이블의 필드
  6. 기본키는 중복 값 입력과 null도 불가능 => 개체 무결성
반응형

Math.random()을 이용한 난수 생성

Java에서 난수를 생성할 때 가장 많이 사용되는 방법 중 하나가 Math.random() 메서드이다.
Math.random()은 java.lang.Math 클래스에 속한 정적 메서드이고 기본적으로 0.0 (포함)에서 1.0 (미포함) 사이의
난수를 생성한다

배열의 인덱스값을 랜덤으로 생성해서 배열을 셔플하거나,
1 ~ 45 범위의 로또 번호 생성, x y 좌표 랜덤 등 다양한 곳에 사용가능하다.

실수이기 때문에 정수를 원한다면 (int)로 캐스팅하여 정수로 변환한다.

시작수를 n, 종료를 m 이라고 할 때(이때 n,m은 양의 정수)

기본 활용 형식

(int)(Math.random() * m) + n

범위 : 1 ~ 45

(int)(Math.random() * 45) + 1

범위 : 0 ~ 5

(int)(Math.random() * 5)

시작수를 n, 종료를 m 이라고 할 때(이때 n은 음의 정수)

기본 활용 형식

(int)(Math.random()∗(m−n+1))+n

범위 : -10 ~ 10

(int)(Math.random()∗(10-(-10)+1)) - 10

범위 : - 2000 ~ 4000

(int)(Math.random()∗(4000−(-2000)+1)) - 2000

※ n, m의 절대값을 더한 후 1 더해주면 종료값이라 생각하면 편하다 => 6001

예제

// 0.0 이상 1.0 미만의 난수 생성
double ran1 = Math.random(); // 0.0 <= num < 1.0
System.out.println("0.0 이상 1.0 미만의 난수: " + ran1);
// 0부터 9까지의 정수 난수 생성
// (Math.random() * 10) 의 결과는 0.0 (포함)에서 10.0 (미포함) 사이의 실수
// 정수로 변환하기 위해 (int)로 캐스팅 
// 0부터 9까지의 정수가 생성
int ran2 = (int)(Math.random() * 10); // 0 <= num <= 9
System.out.println("0부터 9까지의 정수 난수: " + ran2);
// 1부터 10까지의 정수 난수 생성
// 1을 더함으로써 난수의 범위를 1에서 10으로 변경
// 0 + 1 <= num <= 9 + 1
// 1 <= num <= 10

int ran3 = (int)(Math.random() * 10) + 1;
System.out.println("1부터 10까지의 정수 난수: " + ran3);
// -10부터 10까지의 정수 난수 생성
// (Math.random() * 21)의 결과는 0.0 (포함)에서 21.0 (미포함) 사이의 실수입니다.
// 여기에 -10을 더해 난수의 범위를 -10에서 10
// -10부터 10까지의 정수가 생성
int ran4 = (int)(Math.random() * 21) - 10; // -10 <= num <= 0
System.out.println("-10부터 0까지의 정수 난수: " + ran4);
반응형

'JAVA' 카테고리의 다른 글

[JAVA][09] Scanner 클래스  (0) 2024.11.17
[JAVA][07] 형변환(Type Casting)  (0) 2024.10.22
[JAVA][06] 변수 기본 타입(Primitive Type)  (0) 2024.10.12
[JAVA][05] 변수값 바꾸기1  (0) 2024.10.09
[JAVA][04] 변수(Variable)란?  (1) 2024.10.03

SQL 문법 - SELECT

Mysql 설치시 제공되는 Sakila, World DB를 활용한 SELECT 예제를 진행한다.

Select : 데이터 조회하기

기본 형식

SELECT [컬럼1, 컬럼2, ...] FROM [테이블]

하나의 열을 조회

SELECT column1 FROM tablename;

하나의 열을 조회

SELECT column1 FROM tablename;

두 개 이상의 열을 조회

SELECT column1, column2 FROM tablename;

전체 열을 조회

SELECT * FROM tablename;

WHERE문

테이블에 저장된 전체 데이터를 조회하게되면 시간이 오래 걸려 출력이 늦어지게 되고, 과부하를 줄이기 위해 내가 원하는 조건의 데이터만 WHERE문을 이용하여 조회한다.

기본 형식

SELECT [컬럼1, 컬럼2, ...] FROM [테이블] WHERE [컬럼] [비교연산자] [값]

비교연산자 종류

  • 컬럼 = 조건값 : 조건값과 동일한 값을 조회

  • 컬럼 !=(<>) 조건값 : 조건값과 같지 않은 값을 조회

  • 컬럼 < 조건값 : 조건값 보다 작은 값을 조회

  • 컬럼 <= 조건값 : 조건값보다 작거나 같은 값을 조회

  • 컬럼 > 조건값 : 조건값보다 큰 값을 조회

  • 컬럼 >= 조건값 : 조건값보다 크거나 같은 값을 조회

※ 익숙한 비교 연산자 외 <>, !<, !> 만 숙지하면 된다.
※ 크기를 비교하는 연산자는 숫자에만 사용하는 것을 권장한다.

where문에서 비교 연산자 사용

= 연산자

actor 테이블에서 first_name 컬럼의 값이 michael인 데이터 조회

mysql> select * from actor where first_name = 'michael';
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|      174 | MICHAEL    | BENING    | 2006-02-15 04:34:33 |
|      185 | MICHAEL    | BOLGER    | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
2 rows in set (0.00 sec)

<>, != 연산자

language 테이블에서 name 컬럼의 값이 English가 아닌 데이터 조회

mysql> select * from language where name <> 'English';
+-------------+----------+---------------------+
| language_id | name     | last_update         |
+-------------+----------+---------------------+
|           2 | Italian  | 2006-02-15 05:02:19 |
|           3 | Japanese | 2006-02-15 05:02:19 |
|           4 | Mandarin | 2006-02-15 05:02:19 |
|           5 | French   | 2006-02-15 05:02:19 |
|           6 | German   | 2006-02-15 05:02:19 |
+-------------+----------+---------------------+
5 rows in set (0.00 sec)

> 연산자

address 테이블에서 city_id 컬럼의 값이 598보다 큰 데이터 조회

mysql> select address, district, city_id from address where city_id > 598;
+---------------------+------------+---------+
| address             | district   | city_id |
+---------------------+------------+---------+
| 346 Cam Ranh Avenue | Zhejiang   |     599 |
| 1889 Valparai Way   | Ziguinchor |     600 |
+---------------------+------------+---------+
2 rows in set (0.00 sec)

< 연산자

payment 테이블에서 payment_date 컬럼의 값이 2005-05-25 이전인 데이터 조회

mysql> select payment_id, amount, payment_date from payment where payment_date < '2005-05-25';
+------------+--------+---------------------+
| payment_id | amount | payment_date        |
+------------+--------+---------------------+
|       3504 |   2.99 | 2005-05-24 22:53:30 |
|       6003 |   6.99 | 2005-05-24 23:05:21 |
|       6440 |   4.99 | 2005-05-24 23:31:46 |
|       7274 |   1.99 | 2005-05-24 23:11:53 |
|       8987 |   4.99 | 2005-05-24 23:04:41 |
|      11032 |   3.99 | 2005-05-24 23:03:39 |
|      12377 |   2.99 | 2005-05-24 22:54:33 |
|      14728 |   0.99 | 2005-05-24 23:08:07 |
+------------+--------+---------------------+
8 rows in set (0.01 sec)

<= 연산자

payment 테이블에서 payment_id 컬럼이 5보다 작거나 같은 데이터 조회

mysql> select payment_id, amount, payment_date from payment where payment_id <= 5;
+------------+--------+---------------------+
| payment_id | amount | payment_date        |
+------------+--------+---------------------+
|          1 |   2.99 | 2005-05-25 11:30:37 |
|          2 |   0.99 | 2005-05-28 10:35:23 |
|          3 |   5.99 | 2005-06-15 00:54:12 |
|          4 |   0.99 | 2005-06-15 18:02:53 |
|          5 |   9.99 | 2005-06-15 21:08:46 |
+------------+--------+---------------------+
5 rows in set (0.00 sec)

>= 연산자

payment_id가 5보다 크거나 같은 데이터 조회


mysql> select payment_id, amount, payment_date from payment where payment_id >= 5;
+------------+--------+---------------------+
| payment_id | amount | payment_date        |
+------------+--------+---------------------+
|       5    |   9.99 | 2005-06-15 21:08:46 |
|       6    |   3.99 | 2005-06-15 23:04:20 |
|       7    |   2.99 | 2005-06-16 10:32:10 |
|       8    |   4.99 | 2005-06-16 11:01:45 |
|       9    |   1.99 | 2005-06-16 12:40:00 |
+------------+--------+---------------------+
5 rows in set (0.01 sec)

논리 연산자 종류 및 예시

AND

두 개 이상의 조건이 모두 참일 때 데이터를 조회

레벨이 1이고 성별이 남자인 회원

SELECT * FROM member WHERE mb_level = 1 AND mb_sex = 'M';

OR

두 개 이상의 조건 중 하나라도 참이면 결과가 참

레벨이 1이거나 성별이 남자인 회원

SELECT * FROM member WHERE mb_level = 1 OR mb_sex = 'M';

NOT

조건의 반대 값이 참일 때 결과를 반환

레벨이 100이 아닌 회원

SELECT * FROM member WHERE NOT mb_level = 100;

LIKE

문자열 패턴과 일치하는 데이터를 찾음

이름이 김씨인 회원 (이름에 김을 포함)

SELECT * FROM member WHERE mb_name LIKE '김%';

BETWEEN

지정된 범위 내의 데이터를 조회

회원 포인트가 3000이상 5000이하인 회원

SELECT * FROM member WHERE mb_point BETWEEN 3000 and 5000;

가입일이 11월1일 ~ 11월 30일인 회원

SELECT * FROM member WHERE regDate BETWEEN '2024-11-01' and '2024-11-30';

IN

피연산자가 값 목록에 하나라도 포함되어 있다면 데이터 조회

레벨이 1, 2, 3인 회원을 조회

SELECT * FROM member WHERE mb_level IN (1, 2, 3);

EXISTS

하위쿼리에 행이 포함되면(결과가 존재하는지) 데이터를 조회

ALL

서브쿼리에서 반환된 모든 값과 비교하여 조건을 만족하는 데이터 조회

ANY

서브쿼리에서 반환된 하나 이상의 값과 비교하여 조건을 만족하는 데이터

SOME

서브쿼리에서 반환된 하나 이상의 값과 비교하여 조건을 만족하는

※ AND, OR, IN, NOT, BETWEEN, LIKE 정도가 쿼리문 작성시 자주 사용된다.

NULL

NULL값인 컬럼 조회

SELECT * FROM member WHERE mb_addr IS NULL;

NULL 값이 아닌 컬럼 조회

SELECT * FROM member WHERE mb_addr IS NOT NULL;

※ NULL은 특정 값이 아니기때문에 WHERE mb_addr = NULL와 같이 = 연산자를 사용하지 않는다.

반응형

+ Recent posts